关于ab:关于GfxWaitForPresent的耗时问题

109次阅读

共计 2358 个字符,预计需要花费 6 分钟才能阅读完成。

1)对于 Gfx.WaitForPresent 的耗时问题
​2)对于 Spine Shader 冗余问题
3)Unity 增加了 ARR 插件后导出 Android 谬误
4)对压缩格局的纹理调用 GetPixels 办法的疑难


这是第 284 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。

UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)

SpriteAtlas

Q:Profiler 里看手机上的 CPU、GPU 耗时,发现有时候 CPU 上 Gfx.WaitForPresentOnGfxThread 的工夫是 GPU 耗时的几倍。能够看出 GPU 耗时只有 9 毫秒,然而 CPU 期待了 29 毫秒,是 GPU 耗时的 3 倍多,请问这是什么起因导致的?

A:个别 WaitForPresent 呈现一段耗时示意 CPU 在期待 GPU 渲染,个别是 GPU 压力大,渲染线程会有一段 Gfx.PresentFrame(Vulkan 的话子堆栈还有 GfxDeviceVK.Present),最常见的状况如下:

若同时 CPU 开销也比拟高,这段期待也会被代码耗时所笼罩,如下(主线程 Sleep 4ms):

从题主的截图来看是开启了 Profiler 的 GPU Mode,该模式对 GL 接口打点会性能更低,渲染线程能够看到 GPUProfiler.Begin/EndQueries 打点的耗时,体现在主线程就是 Wait 的耗时高,如下(倡议敞开 GPU Mode 再进行测试):

对于题主形容的在主线程 WaitForPresent 存在肯定的开销的状况下,渲染线程简直没有统计到任何开销状况,不晓得大家有没有遇到过相似的问题。

感激羽飞 @UWA 问答社区提供了答复

AssetBundle

Q:如下图所示,做一个预制体放到 AssetBundle 包中,预制体只蕴含一个 Spine 对象,但每次打 AssetBundle 包都会把 Spine 的 5 个 Shader 打包到 AssetBundle 包外面,这种 AssetBundle 极为冗余。

并且如下图所示,Spine 的五个 Shader 曾经增加到 Always Included Shaders 中。请问是否有什么办法能够解决 Spine AssetBundle 包中的 Shader 冗余?

A1:把 Spine 的资源也打包,反正就几个 Shader 和材质球。

感激 1 9 7 3-311135@UWA 问答社区提供了答复

A2:像 Spine 这种第三方插件的 Shader,不属于 Unity 内置的 Shader,放入 Always Included Shaders 设置项中是没有任何用途的。须要本人对它们被动打包进 AssetBundle 中,否则其余 AssetBundle 中用到了它们的援用,就会被动将其拉进 AssetBundle 中。被动打包后,其余用到这个 Spine Shader 的 AssetBundle 只是会依赖 Spine Shader 打的 AssetBundle。

感激 Xuan@UWA 问答社区提供了答复

A3:像这样的需要,须要本人在打包策略上做解决,能够把资源援用都关联,本人独自解决每个包的依赖,本人在 Shader 列表里退出一些黑名单,或者在打包依赖里本人解决,这就看本人想怎么设计关联与依赖了。

感激廖武兴 @UWA 问答社区提供了答复

Android

Q:Unity 降级到版本 2021.2.8。之前能够间接把 res 目录放在 Plugins/Android/res,然而当初如同改了,详情能够参考以下网址:https://docs.unity3d.com/2022…

否则谬误提醒:
OBSOLETE – Providing Android resources in Assets/Plugins/Android/res is deprecated…

当初我从 Android Studio 中生成 AAR 导入到 Unity 中打包,还是报错:

A:之前用 Unity 2019 的 AAR 包中我都把 Androidmainfest.xml 删除了,然而降级到了 Untiy 2021.2.8 版本就出问题了,解决方案就是保留 AAR 中的 AndroidMainfest.xml,本人手动合并。

感激题主 zerolj@UWA 问答社区提供了答复

Texture

Q:看官网文档,如果纹理设置开关 R /W Enabled 启用时,能够通过 Texture.GetPixels/SetPixels 读写纹理数据。

请问,压缩格局的纹理(比方 ETC)在内存中的模式应该是未解压的,那么在调用 GetPixels 时会在 CPU 端解压吗?

A:在 Unity 2019.4.10f1 上做了一个测试,代码如下:

后果如下:

右边是 ETC2 8Bits,左边是代码生成的,2 是原图,n/ a 是代码生成的,从手机截图上看,肉眼仿佛分辨不出区别。

又做了一个额定的测试,让不压缩的图 GetPixels,和 ETC2 的图 GetPixels 的值作差。

后果如下图,失去的是一个全黑的图,右边是 ETC2 格局的图,左边是生成的图。

由下面的测试可知,GetPixels 失去的值是和 RGBA32 格局的数值是统一的。猜想底层在操作 GetPixels 时,应该做理解压。

感激 Xuan@UWA 问答社区提供了答复

封面图来源于网络


明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。

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

正文完
 0