Wwise的内存问题

Wwise的内存问题

1)Wwise的内存问题
​2)关于Planar Shadow的疑问
3)PPS的LDR纹理冗余
4)游戏第一次冷启动耗时长
5)Lua解析指令的虚拟机会占用内存吗


这是第268篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

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

Audio

Q:关于Wwise的内存问题:
1. Wwise加载一个bank,内存增长主要在哪?在profiler上主要体现在哪个参数?
2. 加载bank之后,开始播放event,那么这个event声音是否有缓存?播放是否卡顿?

A:这个问题取决于你所使用的版本,以及你为资源设定的读取方式,还有你为资源采取的编解码。

版本方面自2019.2开始Wwise采取了动态内存管理,profiler显示的是不同用途的内存占用数据,而在这个大版本之前是需要设置固定大小的初始内存池的。

优化内存分配:
https://www.audiokinetic.com/zh/library/edge/?source=SDK&id=goingfurther_optimizingmempools.html

优化内存池:
https://www.audiokinetic.com/zh/library/2019.1.11_7296/?source=SDK&id=goingfurther_optimizingmempools.html

你可以比较一下2019.1之后和2019.1的内存管理文档。

你的资源采取读入内存的方式读取,就会进入内存,如果是stream流读取那就会占用io,这些都可以在Wwise的profiler里看,并不是给你隐藏起来了。

https://www.audiokinetic.com/zh/courses/wwise101/?source=wwise101&id=streaming

卡顿取决于你是从内存读取还是流播放,两者可能都会受编解码的影响。通常如果是触发频率高、追求快速响应可以用PCM或者ADPCM来播放,然后Vorbis可能会因为CPU处理时间产生延迟。如果是流播放,则可以通过启用Zero Latency特性,增加prefetch来降低延迟,但这个方法主要是用来处理播放长文件时的延迟。太短的文件如果prefetch太长可能还导致其他报错,短的就通过编解码和采样率来做空间时间平衡就可以了,音质别太差就行。

感谢Icarus@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/613f0d108f8c834241a47107#613f13828f8c834241a47cb3


Addressable

Q:目前模型用到了Planar Shadow平面阴影,但是由于我们的模型是要投放到UI上,需要把阴影一起拍下来。但又不能把接收阴影的地板拍下来,求教如何让接收平面阴影的plane只显示阴影,其他地方为透明呢 ?
(相关Shader文件可戳原问答查看。)

A1:你并没有理解Planar Shadow的原理,它的阴影本质就是一个Mesh,不需要接收物体,直接删掉地板即可。

如果你的项目没显示出来阴影,那应该是其他方面的原因,跟地板无关。

感谢Jee@UWA问答社区提供了回答

A2:Shader中的_WorldPos表示模型的世界坐标、WorldPos表示ShadowPos吗?如果是这样,这里写的似乎有些问题。

可以参考下这个URP Planar Shadow: https://zhuanlan.zhihu.com/p/266174847

Planar Shadow的实现一般就是在另一个Pass把顶点投到一个“平面”再画一遍,所以应该不会出现题主所描述的问题。

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


Resources

Q:开了PPS之后纹理出现了冗余?LDR之类的资源,这些应该是PPS自己的资源。我们把PPS的资源都打到了一个包里,但还是有冗余。

A:以下是APK解压后的资源。

通常是因为被场景(此场景没有打包AssetBundle)引用和从AssetBundle加载导致的。上图中的LDR开头的纹理是用来做随机用的noise图。在URP中,通常是被RenderPipelineAsset中引用的PostProcessData引用导致的。

当GraphicsSettings中设置了RenderPipelineAsset,那么打包APK的时候,这个PostProcessData.asset是最终被打包进globalmanagers.assets中,没有打包进AssetBundle中的场景如果也引用了RenderPipelineAsset,最终引用的是globalmanagers.assets的RenderPipelineAsset实例,这样是不会冗余的。

但是如果在AssetBundle中也有打包RenderPipelineAsset,比如通过AssetBundle来动态更改RenderPipelineAsset,那么就会产生多份LDR_LLL这样的纹理了。

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


Loading

Q:游戏第一次冷启动的耗时比较长,想分析一下具体的消耗在哪里?但是UWA的测试报告的数据是从进入游戏后开始的,不知道怎样才可以进行测试。

A1:大致归为3点:

  1. Resource文件夹下的文件建立索引,可以想办法改用AssetBundle;
  2. 预Shader解析,这个为了之后的流程性建议还是先预加载了,当然也可以用一些其他操作陆陆续续加载;
  3. 加载的第一个scene比较大,可以考虑搞个空的scene先加载上来,异步加载真正的第一个scene。

感谢萧小俊@UWA问答社区提供了回答

A2:可以看一下这个问答里的思路:https://answer.uwa4d.com/question/5bf764e8f0d8cc224aa7f4f4

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


Memory

Q:Lua解析指令的虚拟机会不会占用一部分内存?

A:几K还是有的,但应该很小的,主要还是对象占用的。虚拟机占用的内存主要是堆栈的空间,虚拟机还是得解释代码,执行API之类的,还是要点空间的,但应该是很少的。

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

20210918
更多精彩问题等你回答~

  1. Vulkan API的性能及兼容性
  2. Unity TMP字体方案如何选择
  3. 如何实现AAB包的增量更新

封面图来源于:URP Iridescence Example
URP中的虹彩着色器示例。


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

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