为什么Android游戏画面在30帧运行时有抖动现象

news/2025/10/28 17:41:04/文章来源:https://www.cnblogs.com/uwatech/p/19172389

1)为什么Android游戏画面在30帧运行时有抖动现象
2)团结引擎VS Skinning开启ENABLE_VS_SKINNING_MORE_BONES后,性能反而下降


这是第450篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

UWA社区主页:community.uwa4d.com
UWA QQ群:793972859

From UWA AI 问答

Q1:Android平台下,游戏以30帧运行时,即便整体性能稳定,仍普遍存在画面抖动现象,想探讨一下这可能是由于什么原因造成的?

A:画面抖动(Jitter)是Android平台30帧游戏中常见但易被忽视的问题,即便整体FPS稳定,仍可能因以下原因导致视觉上的不流畅或抖动感:

1. 帧生成时间不均匀(Frame Pacing问题)
这是最核心的原因。即使平均帧率为30FPS,若帧的生成间隔不均匀(如一帧耗时28ms,下一帧耗时38ms),会导致视觉上出现“微卡顿”或“抖动”。Android设备尤其在高刷新率屏幕(如90Hz、120Hz)下,若未正确配置帧同步策略,GPU与显示子系统之间的帧提交节奏失配,极易引发此问题。

解决方案:

  • 确保关闭Optimized Frame Pacing(部分模拟器和低端设备存在兼容性问题,实测可缓解抖动)。
  • 使用Choreographer回调来对齐VSync信号,确保帧更新时机精准。
  • 在Unity中,避免仅依赖Application.targetFrameRate=30,因其在动态刷新率设备上可能导致帧率倍数下降(如从30→15)。

可结合定时重设帧率策略:

IEnumerator SetFrameRatePeriodically()
{while (true){yield return new WaitForSeconds(10);Application.targetFrameRate = 31;yield return new WaitForSeconds(0.1f);Application.targetFrameRate = 30;}
}

  

2. GPU与CPU工作负载波动引起帧时间波动
即使平均性能达标,若每帧CPU或GPU耗时波动大(如某些帧CPU耗时接近33ms,其他帧仅15ms),会造成帧间隔不一致,表现为抖动。

排查建议:

  • 使用UWA GOT Online的CPU每帧耗时曲线>40ms帧数占比指标,分析是否存在高波动性。
  • 检查是否存在偶发性任务(如GC、资源加载、逻辑计算集中爆发),导致单帧骤增。

3. 渲染管线与垂直同步机制冲突
Android设备厂商常自定义显示策略,部分机型在非原生刷新率(如60Hz设备跑30Hz)时,系统VSync调度可能出现偏差,导致帧呈现时间错位。

优化方向:

  • 避免频繁切换目标帧率,保持帧率恒定。
  • 在支持的设备上尝试使用SurfaceFlinger相关调试工具观察实际显示帧时序。
  • 若使用自定义渲染管线,检查后处理、阴影等异步操作是否引入延迟。

4. 输入与渲染不同步
触摸输入更新频率(通常60Hz或更高)与30Hz渲染不同步,可能导致操作反馈延迟感叠加视觉抖动。

改进措施:

  • 尽量将关键UI更新与渲染帧对齐。
  • 对高频输入做插值或预测处理,提升交互平滑度。

综上,画面抖动多源于帧间时间不一致性而非平均帧率不足。建议优先通过UWA性能报告中的Jank均值>40ms帧数占比CPU每帧耗时曲线进行量化分析,并针对性优化帧生成节奏与负载均衡。

Q2:有什么解决方案?

A:针对Android平台30帧下画面抖动问题,可采取以下系统性解决方案:

1. 精准控制帧率同步(核心措施)

  • 关闭Optimized Frame Pacing:该功能在部分设备(如MuMu模拟器)存在兼容性问题,易导致帧提交延迟。在Player Settings中禁用此选项可显著改善抖动。
  • 使用Choreographer对齐VSync:通过Android原生API确保每帧更新与系统刷新信号同步,避免因调度偏差导致的帧间隔不均。
  • 周期性重设目标帧率:应对动态刷新率设备(如120Hz降为60Hz时30帧变15帧),可定时重置targetFrameRate以强制系统重新计算:
IEnumerator SetFrameRate()
{while (true){yield return new WaitForSeconds(10);Application.targetFrameRate = 31;yield return new WaitForSeconds(0.1f);Application.targetFrameRate = 30;}
}

  

2. 优化渲染负载与资源管理

  • 降低GPU Skin等高负载特效密度:大量骨骼蒙皮或复杂Shader会加剧帧间波动,建议在低端设备上动态降级。
  • 使用RenderTexture替代Varying插值写回:避免Shader频繁读写主存造成带宽压力,将所需参数绘制到GlobalTexture中复用。
  • 调整Graphics Quality设置:关闭非必要的后处理效果(如动态阴影、抗锯齿),减少单帧渲染开销。

3. 避免运行时性能突变

  • 防止GC集中触发:减少堆内存分配,避免匿名函数、装箱操作;使用对象池管理高频创建/销毁对象。
  • 异步加载资源:通过AssetBundle或Addressables分帧加载,避免单帧卡顿。
  • 限制后台下载并发数:若使用BackgroundDownload,应采用任务队列+线程池模式,控制同时下载数量(如≤5个),防止IO阻塞主线程。

4. 监控与验证工具

  • 使用UWA GOT Online报告分析CPU耗时曲线>40ms帧占比Jank指标,定位帧时间波动源头。
  • 启用UWA本地资源检测,排查冗余Shader变体或大纹理占用。
  • 在真机环境中启用Perfetto或Systrace,观察SurfaceFlinger合成节奏是否稳定。

综上,解决抖动需从帧生成节奏控制负载均衡系统兼容性适配三方面入手,优先确保帧间隔一致性,再逐步优化资源与逻辑开销。

分享链接:
https://www.uwa4d.com/main/uwa-shared.html?shareId=a93edb8c-708a-4dd5-b999-c34331f41bb9


From 问答社区

Q:ENABLE_VS_SKINNING关键字最多支持单个SkinnedMeshRenderer 64根骨骼,所以需要使用ENABLE_VS_SKINNING_MORE_BONES。测试60个单位每个单位骨骼150+,开启后,iPhone XR帧率只有5fps,未开启时帧率20fps,产生了负优化,会是什么原因?

A:使用UWA AI问答的功能尝试解读这个问题。
分享链接:
https://www.uwa4d.com/main/uwa-shared.html?shareId=b341fe8e-c27b-4c18-8d09-9abdcf048ba4

问题分析:
1. 顶点着色器计算量激增

  • 开启ENABLE_VS_SKINNING_MORE_BONES后,Unity会切换到更复杂的顶点着色器路径,以处理每顶点更多骨骼影响。
  • 每个顶点的蒙皮计算为:输出位置 = Σ(权重_i × 骨骼变换矩阵_i × 本地位置)。当单个模型骨骼数达150+,即使每个顶点仅受4根骨骼影响,GPU仍需加载并计算大量骨骼矩阵。
  • 这导致:
    • ALU指令数大幅上升,超出移动端GPU执行能力;
    • 显存带宽压力剧增,频繁读取骨骼矩阵纹理或UBO;
    • 着色器编译生成低效代码,尤其在旧版Metal/OpenGL ES驱动下。

2. 硬件性能瓶颈凸显

  • iPhone XR搭载A12芯片,其GPU性能有限,尤其对高ALU和带宽需求场景敏感。
  • 60个单位×150+骨骼 → 总骨骼数超9000,远超常见角色批次规模。
  • GPU每帧需完成:
    • 数千个骨骼矩阵上传(若未合批);
    • 大量顶点着色器并行运行;
    • 渲染管线等待数据就绪,造成Gfx.WaitForPresentOnGfxThread延迟飙升。

3. Unity内置GPU Skinning机制缺陷

  • Unity原生的GPU Skinning(含ENABLE_VS_SKINNING系列宏)在移动平台优化不足:
    • 未有效利用现代API(如Metal Argument Buffers)减少绑定开销;
    • 缺乏对实例化与多对象批量处理的深度整合;
    • 在复杂角色场景下,反而增加CPU-GPU同步负担。

优化建议:
优先关闭ENABLE_VS_SKINNING_MORE_BONES,采用替代方案。

1. 降低骨骼数量(资源层)

  • 与美术协作,通过减骨工具将非关键区域骨骼合并或移除;
  • 目标控制单模型骨骼数在75以内,确保可使用标准ENABLE_VS_SKINNING路径。

2. 使用自定义GPU Instancing + GPU Skinning

  • 参考UWA开源方案,实现基于Compute Shader的骨骼动画计算;
  • 结合GPU Instancing批量渲染相同怪物类型,显著降低DrawCall与动画更新开销;
  • 可同时规避Animator.Update和MeshSkinning.Update的CPU瓶颈。

3. 启用QualitySettings.skinWeights = 4 Bones并导入时锁定

  • 在Model Import Settings中设置Skin Weights为Standard (4 Bones),避免运行时冗余计算;
  • 禁止使用Auto模式导致动态降级开销。

4. 控制屏幕内更新范围

  • 设置SkinnedMeshRenderer.updateWhenOffscreen = false,停用屏幕外角色的动画计算;
  • 配合LOD系统,在远处使用简化骨骼版本。

5. 考虑动画共享技术

  • 对同类角色,使用统一动画状态源,其它实例通过CopyPose复用结果;
  • 可结合对象池管理,进一步减少Animator组件数量。

注意:ENABLE_VS_SKINNING_MORE_BONES应仅用于极少数特例角色,且需严格测试目标设备表现。常规项目不建议开启。

有经验的朋友欢迎转至社区交流:
https://answer.uwa4d.com/question/68f9a7c9244ce21ce9ec0937

无论是社区里开发者们的互助讨论,还是AI基于知识沉淀的快速反馈,核心都是为了让每一个技术难题都有解、每一次踩坑都有回响。本期分享分别来自UWA AI问答和UWA问答社区,希望这些从真实开发场景中提炼的经验,能直接帮你解决当下的技术卡点,也让你在遇到同类问题时,能更高效地找到破局方向。

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/949018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RT-DETR 百度目标检测 cvpr2023 - MKT

RT-DETR 百度目标检测 cvpr2023 https://github.com/lyuwenyu/RT-DETR https://docs.ultralytics.com/zh/models/rtdetr/#pre-trained-models

Nginx中正确配置SSE(Server-Sent Events)服务

让我们深入探讨如何在Nginx中正确配置SSE(Server-Sent Events)服务。SSE是一种基于HTTP的服务器推送技术,需要特殊的Nginx配置来维持长连接。 核心配置要点代理缓冲与分块传输 location /sse-endpoint { proxy_pass…

电子烟上的关键芯片推荐(NFC、MCU、电源管理)

随着电子烟市场的快速发展,消费者对产品的智能化、安全性和用户体验提出了更高要求。本文将围绕NFC、MCU和电源管理三大核心器件探讨其在电子烟中的应用方案: 一、NFC技术在电子烟中的应用 NFC(近场通信)技术为电子…

应用程序无法正常启动(0xc0000142)怎么办?3个方法彻底解决【2025最新图文教程】

当你打开软件或游戏时,突然弹出“应用程序无法正常启动(0xc0000142)”的错误提示,是不是一脸懵? 本文将详细介绍该问题的常见原因,并提供三种行之有效的解决方法:使用一键修复工具自动处理系统错误手动更新 Visua…

基于二维熵阈值分割与遗传算法结合的图像分割

一、算法原理框架 1. 二维熵阈值分割基础\(p_{ij}\):灰度值i与邻域均值j的联合概率 \(w_0,w_b\):目标和背景的累积概率 目标:最大化总熵\(H=H_o+H_b\)2. 遗传算法优化流程 graph TD A[初始化种群] --> B[适应度计…

10进制转2进制

string decimalToBinary2(int n) { if (n == 0) return "0"; string binary = ""; while (n > 0) {binary = to_string(n % 2) + binary;n /= 2; } return binary;} 注意binary = to_string(n …

沙姆镜头的工作原理及使用技巧

沙姆镜头的工作原理基于沙姆定律,即当镜头平面、成像平面和被摄物体平面相交于一条直线时,可以扩展焦平面,使不在同一平面的物体也能清晰成像。 在实际应用中,沙姆镜头通过其倾斜功能,可以根据被摄物体的角度调整…

全域感知,主动预警:视频汇聚平台EasyCVR打造水库大坝智慧安防视频监控智能分析方案

一、项目背景 水库安全度汛是全国防汛抗洪工作的重点,水库监控系统对保障水库安全、及时排险意义重大。多数水库站点分散、位置偏,地形复杂,与监控中心相隔较远。 传统有线监控系统成本高、工期长,遇山河等阻碍时布…

list列表 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

全域互联,统一管控:EasyCVR构建多区域视频监控“一网统管”新范式

方案背景 在连锁店、企业分支机构、库房、工厂等多元化场景的视频监控项目中,设备品牌众多、型号繁杂,再加上现场网络环境的复杂性,使得跨区域视频联网面临诸多挑战。为有效解决视频监控接入兼容、上云联网等问题,…

魔改frida

魔改frida 魔改fridagit clone https://github.com/frida/frida-core.git安装子分支git submodule update --init --recursive安装ndk,设置环境变量 https://github.com/android/ndk/wiki 下载25版本 设置环境变量v…

云原生周刊:在 Kubernetes 上运行机器学习

云原生热点 KGateway v2.1:面向 AI 场景的高可用网关全新升级 KGateway 是一个面向云原生和 AI 场景的高性能网关,支持多租户、统一接入、智能路由与推理服务集成,兼容 Kubernetes Gateway API 标准。 在最新的 v2.…

ts相关

1、常用类型工具

从模型到智能体——OpenCSG 打造 AI 落地新范式

一、AI 焦虑的现实:技术太快、落地太慢 AI 的世界正在以指数级速度演进。 企业追逐最新模型,却发现落地难度越来越大——模型更新太快、算力成本太高、应用落地太慢。 OpenCSG 的观点是:企业不需要更多的模型,而需…

CF589H 题解

很好的题。但是 CF 主站上看不了。 首先需要观察到一个性质:对于一个包含 \(k\) 个关键点的连通块,一定可以凑出恰好 \(\lfloor\frac{k}{2}\rfloor\) 对路线。 首先这个东西显然是答案上界。然后考虑证明一定能够满足…

2025年上海电动阀门厂最新推荐榜,气动阀门/高压阀门/真空阀门/自控阀门/调节阀门/聚焦产品实力与特色服务竞争力深度剖析

随着工业自动化进程加速,以及石油化工、清洁能源等领域对特种阀门需求的增长,企业在选择阀门供应商时面临诸多考量 —— 如何辨别企业生产资质、如何匹配工况需求的阀门品类、如何规避设备运行中的潜在风险,成为当下…

【每日一面】async/await 的原理

基础问答 问:async/await 的原理是什么? 答:关键字本身就是 Promise 的语法糖,依托于生成器函数 (Generator) 函数能力实现的。async 关键字标志这个函数为异步函数,并且将返回结果封装为一个 Promise,await 则…

gmssl2.5常用命令

参考链接:https://zhuanlan.zhihu.com/p/618494579SM3计算摘要:echo -n hello | gmssl dgst -sm3 SM3计算HMAC:echo -n hello | gmssl dgst -sm3 -hmac 11223344556677881122334455667788SM4对输入字符加密:echo h…

上海电磁阀厂家最新竞争力评估推荐:高温电磁阀/高压电磁阀/防爆电磁阀/真空电磁阀/聚焦服务能力与产品特色

随着工业自动化程度不断提高以及高端流体控制需求增长,用户在选择电磁阀制造企业时面临诸多考量——如何评估企业技术实力、如何匹配不同工况的产品选型、如何保障设备长期稳定运行,成为工业采购决策中的核心关注点。…

如何在iPhone和Android设备上恢复已删除的电话号码

丢失手机上的联系人,感觉就像自己的一部分被抹去了。朋友、家人,甚至必要服务的联系人——所有信息都可能瞬间消失,而且似乎无法恢复。对一些人来说,失去商业联系人更是一场噩梦,会给他们带来巨大的经济压力。 无…