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