3

FSR-Unity-URP 1.0 的性能和兼容性问题

 1 year ago
source link: https://blog.uwa4d.com/archives/TechSharing_315.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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中:

1.png

Compute Shader单个Thread的采样次数为12次。

另外,使用集成后处理的方式后,在OPPO K1上做了测试,发现后处理的开销比把RenderScale改成0.5后节省的开销还要大很多,整体帧率反而下降了。

不知道各位同学是否有把FSR落地到项目的经验,希望可以分享下。

A1:不要用Compute Shader版本的实现,参考URP12里后处理方式的实现。

前一段时间我试了下,在晓龙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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/636ce9039b19755f97ad3635


Scripting

Q:在计算大文件MD5的时候,存在耗时严重问题,大概2分钟,在手机上接受不了,有大佬有方法吗?

测试发现:改Buffer大小到1MB,由2200毫秒变成了1980毫秒,优化效果并不明显。
https://itecnote.com/tecnote/c-the-fastest-way-to-create-a-checksum-for-large-files-in-c/

A:可以尝试使用xxHash算法,对比过性能数据,比MD5算法快很多。
https://github.com/uranium62/xxHash
https://github.com/Cyan4973/xxHash

感谢马三小伙儿@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/637f80c4f9f21132ef00bf63


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/UnityManualReload/blob/main/ScriptCompileReloadTools.cs

感谢zerolj@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/637db649f9f21132efff180e


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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/637ca3937de8c17c9debd270

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK