首页 > 其他分享 >FSR-Unity-URP 1.0 的性能和兼容性问题

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

时间:2022-11-30 10:57:19浏览次数:62  
标签:1.0 问答 FSR Unity 兼容性问题 UWA com

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里后处理方式的实现。

前一段时间我试了下,在晓龙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/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问答社区提供了回答


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问答社区提供了回答


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(原群已满员)

标签:1.0,问答,FSR,Unity,兼容性问题,UWA,com
From: https://www.cnblogs.com/uwatech/p/16937732.html

相关文章

  • Unity用户手册-EditorWindow
    UnityEditor扩展概览unityeditor是一个通用的编辑器,提供了unity内部对象的创建,预览,编辑的功能及可视化界面。但对于特定类型的游戏开发可能还不能完全满足需求,还要根据程......
  • Unity用户手册-Mesh合批
    Mesh合批把很多静止的模型,标记为BatchingStatic,原本需要把模型一个个送到GPU渲染,Unity会把相同材质相同纹理相同Shader的模型合批成一个大的模型,送到GPU进行渲染,这样就减少......
  • Unity用户手册-Unity与Android、iOS互相调用
        C#是以Assembly(汇编集)为一个基本单位组织代码的,dll就是一个assemble,dll之间有加载依赖顺序。dll是windows平台上的动态库,而so是linux平台上的动态库,最后.a是IOS......
  • 【Unity插件】NGUI核心组件之UIAtlas
    NGUI:UIAtlasUIAtlas是一个容器,他包含了许多sprite的坐标信息。如果你对这个概念不是很熟悉,你可以这样理解:与使用很多小的贴图来渲染UI相比,使用一张包含了所有小贴图的大......
  • Unity游戏的GC(garbage collection)优化
     Unity版本:5.5引言游戏运行时使用内存来存储数据,当这些数据不再被使用时,存储这些数据的内存被释放以便于之后这些内存可以被复用。垃圾(Garbage)是存储无用数据的内存的术语......
  • Unity--Cinemachine官方实例详解
    1.2DCamera搭建一个快速场景,MainCamera选择Orthographic。在Cinemachine下有Create2DCamera,在生成的相机中设置follow,同时注意body的设置,如下图所示在虚拟相机中还需要......
  • Unity Animator -- Apply Root Motion
    Animator.ApplyRootMotion这个属性是用来控制物体在播放骨骼动画的时候是否应用骨骼根节点的运动参数。一、当没有骨骼根节点的情况时,比如只是一个Cube立方体,如果勾选了Appl......
  • 【详细解析版】Unity UGUI Mask组件实现原理
    MaskingisimplementedusingthestencilbufferoftheGPU.即Mask是利用了GPU的模板缓冲来实现的,关于模板,打个简单的比方,就像一个面具,可以挡住一部分“脸”的显示一样。......
  • Unity-利用SkinnedMeshRenderer和Mesh的BindPose实现骨骼动画
    SkinnedMeshRenderer蒙皮网格渲染器。蒙皮是指将Mesh中的顶点附着(绑定)在骨骼之上,而且每个顶点可以被多个骨骼所控制。骨骼是皮肤网格内的不可见对象,它们影响动画过程中网格......
  • Unity判断对象是否在视野内
    判断对象是否在视野内,有两种方式:第一种:不设置固定的目标,使用LayerMask,设置寻找对象的Layer,使用Physics.OverlapSphere方法,以给定的位置为圆心,按照设定距离投射一个球体,返回......