1)FSR-Unity-URP 1.0 的性能和兼容性问题
2)计算大文件 MD5 耗时问题
3)如何监听 Unity 行将 Reload Script
4)如何对 Unity 游戏的 Android 解体和 ANR 问题进行符号化解析
这是第 315 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)
Rendering
Q:对于 FSR-Unity-URP 1.0 的性能和兼容性问题:
测试环境:
Unity 版本:2020.3.3
URP 版本:10.4.0
Graphics API:Vulkan
设施:OPPO K1
1. 兼容性问题
场景相机开启了 HDR,URP 下渲染指标 RT 的默认格局为 B10G11R11_UFloatPack32,在设施上会报错:Format unsupported for random writes – RG11B10。该纹理格局不反对随机写入,之后强制把格局设置为 R16G16B16A16_SFloat,问题解决,然而想找到更为正规的做法。
2. 性能问题:
在 OPPO K1 上,场景失常渲染状态下 GPU 耗时为 20ms 左右,开启 FSR Performance Level 后,GPU 耗时飙升到 100ms 左右,同时在 HUAWEI P30 Pro 上做了测试,FPS 降落了 3FPS 左右。
用 RenderDoc 在 Editor 做了抓帧,性能热点集中在 FSR 的 Compute Shader 中:
Compute Shader 单个 Thread 的采样次数为 12 次。
另外,应用集成后处理的形式后,在 OPPO K1 上做了测试,发现后处理的开销比把 RenderScale 改成 0.5 后节俭的开销还要大很多,整体帧率反而降落了。
不晓得各位同学是否有把 FSR 落地到我的项目的教训,心愿能够分享下。
A1:不要用 Compute Shader 版本的实现,参考 URP12 里后处理形式的实现。<br/>
前一段时间我试了下,在晓龙 660 这个级别是不太行,670 上耗费和节约的差不多,670 再往上的才开 FSR 好一点。
感激金喆 @UWA 问答社区提供了答复
A2:以下答复供参考:
1. 兼容性问题
求教了一下 Unity 的敌人,对于 B10G11R11_UFloatPack32 这个 Format,实现外面有个默认是桌面零碎的 OpenGL 规范的要求,OGLES 默认无奈开启的,所以临时来说你的做法是一个正确的操作。或者只能等 Unity 更新 Code 来反对 OGLES 下的 B10G11R11_UFloatPack32。2. 性能问题:
不是很相熟 URP12 上的后处理形式和 Compute Shader 实现的具体内容,下面金喆大佬的答复应该更靠谱。就以后贴出来的内容来看 Compute 的实现,仅从 Driver 和 HW 角度,可能有两个中央会导致肯定的性能问题:即 vkCmdBeginRenderPass(C=Load, DS=load)和 vkCmdEndRenderPass(C=store, DS=store),这两个中央 Load Store 都是必须的吗?尤其是 DS 局部?Store 和 Load 会耗费 GPU 带宽去同步 Mem 读写 vkCmdDispatch(188,94,1)和 vkCmdDispatch(1,1,1),这两个 WorkItem 都不是一个很现实的设置,个别的手机平台的 GPU 配置,都心愿这两个是一个 2 的某个次方的,典型的是 32 的倍数或者 64/128/256/512 之类的倍数,若太大(比方超过 2048,只是举例)或者太小(比方小于 32)都会比拟影响 GPU 执行计算时候的并行度。
这两个可能是在骁龙 660 的 K1 上 Compute 执行工夫很长的局部起因。至于 HUAWEI 的 Core,相似 Turbo 之类的技术会在底层思考一些优化而更改了 APP 的申请,从而导致性能稳定状况不太统一。
感激 Seague@UWA 问答社区提供了答复
Scripting
Q:在计算大文件 MD5 的时候,存在耗时重大问题,大略 2 分钟,在手机上承受不了,有大佬有办法吗?
测试发现:改 Buffer 大小到 1MB,由 2200 毫秒变成了 1980 毫秒,优化成果并不显著。
https://itecnote.com/tecnote/…
A:能够尝试应用 xxHash 算法,比照过性能数据,比 MD5 算法快很多。
https://github.com/uranium62/…
https://github.com/Cyan4973/x…
感激马三小伙儿 @UWA 问答社区提供了答复
Scripting
Q:请问如何监听 Unity 行将 Reload Script?
有找到办法 [UnityEditor.Callbacks.DidReloadScripts(0)],这个是 Reload Script 之后的回调,但未找到 Reload 之前的监听办法,请问有方法监听到吗?
A:以下两个事件,在一开始配合 InitializeOnLoadMethod 或者 InitializeOnLoad 应用:
AssemblyReloadEvents.beforeAssemblyReload
AssemblyReloadEvents.afterAssemblyReload再说个模式切换事件:EditorApplication.playModeStateChanged,我本人写了一个手动 Reload Script,参考如下:
https://github.com/ZeroUltra/…
感激 zerolj@UWA 问答社区提供了答复
Scripting
Q:如何对 Unity 游戏的 Android 解体和 ANR 问题进行符号化解析?
A1:Google Play 反对在 Play 管理中心为每个利用版本上传调试符号文件。这样能够更轻松地剖析和修复解体和 ANR 问题。
从 Unity 2020.3 及更高版本开始,您能够依照 Unity 的指南生成 Android 符号,而后将符号化解析文件上传到 Google Play 管理中心,以便在 Android Vitals 信息中心查看人类可读懂的堆栈轨迹。
否则,您能够依照 Unity 中的对 Android 解体进行符号化解析一文,手动解析堆栈轨迹或为较低版本的 Unity 生成符号文件。
感激 I’m@UWA 问答社区提供了答复
A2:Android 上的解体和 ANR 问题会生成堆栈轨迹,这是您的游戏在解体之前调用过的嵌套函数序列的快照。这些快照可帮忙您找出并修改源代码中的任何问题。
不过,当您在公布模式下应用 Unity 构建游戏时,符号不会随 APK 一起打包。如果您的游戏解体或呈现 ANR 问题,调用堆栈将仅显示内存地址。
05-26 18:06:51.311: A/libc(26986): Fatal signal 11 (SIGSEGV) at 0x000004e4 (code=1), thread 27024 (Worker Thread) 05-26 18:06:51.411: I/DEBUG(242): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 05-26 18:06:51.411: I/DEBUG(242): Build fingerprint: 'Xiaomi/cancro_wc_lte/cancro:4.4.4/KTU84P/V6.7.1.0.KXDCNCH:user/release-keys’05-26 18:06:51.411: I/DEBUG(242): Revision: '0’05-26 18:06:51.411: I/DEBUG(242): pid: 26986, tid: 27024, name: Worker Thread >>> com.u.demo <<< 05-26 18:06:51.411: I/DEBUG(242): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 000004e4 I/DEBUG(242): backtrace: I/DEBUG(242): #00 pc 006d4960 /data/app-lib/com.u.demo-1/libunity.so I/DEBUG(242): #01 pc 006d4c0c /data/app-lib/com.u.demo-1/libunity.so I/DEBUG(242): #02 pc 006d4c0c /data/app-lib/com.u.demo-1/libunity.so I/DEBUG(242): #03 pc 006d4c0c /data/app-lib/com.u.demo-1/libunity.so I/DEBUG(242): #04 pc 006d4c0c /data/app-lib/com.u.demo-1/libunity.so I/DEBUG(242): #05 pc 001c5510 /data/app-lib/com.u.demo-1/libunity.so I/DEBUG(242): #06 pc 001c595c /data/app-lib/com.u.demo-1/libunity.so I/DEBUG(242): #07 pc 001c4ec0 /data/app-lib/com.u.demo-1/libunity.so I/DEBUG(242): #08 pc 0043a05c /data/app-lib/com.u.demo-1/libunity.so I/DEBUG(242): #09 pc 0000d248 /system/lib/libc.so (__thread_entry+72) I/DEBUG(242): #10 pc 0000d3e0 /system/lib/libc.so (pthread_create+240)
感激 anan@UWA 问答社区提供了答复
封面图来源于网络
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官网技术 QQ 群:793972859(原群已满员)