1)如何远程更新 Addressable 随包打进的游戏资源
2)Unity 内存机制与安卓内存机制的关系
3)UWA 报告中的 GPU 渲染信息统计
4)如何采样不同纹理压缩格式的时间
5)如何去掉每帧的 GC
这是第 211 篇 UWA 技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间 10 分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)
Q:我们新项目想用 Addressable Asset System。我这几天看了一下,有个问题想请教一下:AAS 通过 Build and Load Paths 设置 local/remote 决定 Group 中的资源随包/远端下载。那么我想在远端更新 local 方式的资源(即随包打进 StreamingAssets 中的资源)该怎么操作?
A:Local 打包方式的 Group 设置 Cannot Change Post Release,两个属性 bundlename 设置成 FileName,取消 bundle 的 CRC,这样再 Check/Build 之后就可以做到增量更新了。Addressable 会把改变的部分生成到一个新的 Group 中,这个 Group 会默认设置成 remotebuild/load 。这样就做到增量更新了。
感谢题主柚子爱爸爸@UWA问答社区提供了回答
Q:Unity 内存机制与安卓自身的内存机制有什么关系?我目前的理解是安卓操作系统基于 Linux 内核,所以自己有本身的内存管理机制;而 java VM 是为了让一些应用可以运行在安卓平台上而建立的一种跨平台机制。相当于在安卓系统上开了一个虚拟机,应用运行在虚拟机的环境中。同理,Mono 和 IL2CPP 也是另一种虚拟机,也会运行在安卓操作系统上,但是也有着自己本身虚拟机的内存管理机制,也就是说 Unity 的内存管理机制实际上就是 Mono 或者 IL2CPP 的内存管理机制。
想了解下我的理解对吗?虚拟机的管理机制和安卓系统的管理机制有什么样的关联呢?任何相关的回答都不胜感激,谢谢!
A:可以参考:
《浅谈 Unity 内存管理》——视频
/
《浅谈 Unity 内存管理》——猫冬夏的笔记
https://www.notion.so/Unity-f79bb1d4ccfc483fbd8f8eb859ae55fe
感谢俞顺捷@UWA问答社区提供了回答
Q:URP 项目 GPU 渲染信息统计问题:看情况是统计到逻辑代码里了,这个后面会区分出来吗?
A:CPU 耗时和 GPU 耗时是完全不同的两码事。虽然最终渲染是在 GPU 端进行,但是 CPU 端也需要做很多事情的,比如提交 Draw Call。以不透明渲染来说,常见的是 Render.Mesh,Batch.DrawStatic 这些 Draw Call 的提交,再比如 MeshSkinning.Render,Culling 等,这些都算在 Camera.Render 的耗时里面。
在使用了 SRP 的情况下,与 Camera.Render 相对应的函数叫 RenderPipelineManager.DoRenderLoop_Internal(),这里面的耗时也都是 CPU 端的耗时,建议题主通过 UWA 线上的真人真机测评服务来查看更为具体的耗时分配。
题主截图中的 GPU 耗时为 0,可能是因为使用了 Vulkan,也可能是因为某些 GPU 型号问题(一般出现在华为手机上),但这个跟 CPU 的耗时都没有关系的,也并不是 GPU 的耗时统计到 CPU 逻辑代码里面去了。
感谢 Xuan@UWA 问答社区提供了回答
Q:有什么方法可以知道采样不同纹理压缩格式的时间吗?想了解下对于 ETC2 ETC、ASTC 采样所消耗的时间,能够具体量化吗?
A:我理解只要是硬件原生支持的贴图格式,采样的时长应该没什么差别吧,毕竟都是硬件解压到显存中进行。
更可能产生差异的是大小不同导致的传输时间和命中率上的差异,比如 ASTC 通常优于 RGBA 的原因就是对于带宽占用小,Cache 命中率高。
可能整体看更好,当然如果要去追究采样消耗,可能通过一些 GPU Profile 统计 Sampe 的消耗会有些价值。
感谢贾伟昊@UWA问答社区提供了回答
Q:scriptableruntimereflectionsystemwrapper 每帧都有 9B GC,如何去掉呢?
A1:可以参考:
https://unity3d.com/cn/unity/whats-new/2018.3.8Scripting: Removed allocation in every frame from ScriptableRuntimeReflectionSystemWrapper.TickRealtimeProbes. (1097039)
感谢 littlesome@UWA 问答社区提供了回答
A2:一般为 SRP 中一些逻辑代码所分配的堆内存占用,可能是 Command buffer 的切换代码或者其他。可以通过 Deep Profiler 方式在 Editor 中定位具体是什么函数。
该问答由 UWA 提供
封面图来源于网络
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在 UWA 问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之 “石”,也能攻你之 “玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官方技术 QQ 群:793972859(原群已满员)