UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技 - audio
type: channel
link: https://blog.uwa4d.com/tag/audio/
items: 如何计算弧线弹道的落地位置
items: 在TMP中计算书名号《》高度的问题
items: Unreadable-Mesh内存占用翻倍问题
items: Unity场景物体动态合批
items: TextMeshPro备用字体疑问
items: Wwise的内存问题
items: 声音引擎Wwise与Criware的区别
items: 使用SBP后，如何查询Bundle的依赖关系
items: 如何在Editor中监听Prefab修改后Auto Save的事件

如何计算弧线弹道的落地位置
type: item
date: 2024-07-02T04:56:00+03:00
description: 1）如何计算弧线弹道的落地位置 2）Unity 2021 IL2CPP下使用Protobuf-net序列化报异常 3）编译问题，用Mono可以，但用IL2CPP就报错 4）Wwise的Bank在安卓上LoadBank之后，播放没有声音 这是第393篇UWA技术知识分享的推送，精选了UWA社区的热门话题，涵盖了UWA问答、社区帖子等技术知识点，助力大家更全面地掌握和学习。 UWA社区主页：community.uwa4d.com UWA QQ群：793972859 Physics Q：请教一个问题，现在我有一个可以打出弧线弹道的迫击炮，可以放到场景里任何位置，怎么能算出可以打到的区域和打不到的区域？要考虑场景内建筑物的遮挡问题。 然后，旋转一周的话以多少角度来计算呢？ A1：碰撞不只有地面的碰撞，所以高度图也不能解决。自己模拟弹道轨迹计算，然后进行分段逐个探测就好。要真说GPU来解决，可能更多是基于视觉表现上的，而且会把问题变得更加复杂，只是提升下数量非常多的时候的性能。 可以参考Niagara，使用深度图、SDF、或者新一代GPU的物理探测方案来做支持。 感谢听风辨雨@UWA问答社区提供了回答 A2：笨方法就是先旋转一周一层循环，再从0到90度仰角再一层循环，每个发射角用抛物线公式计算虚拟炮弹的运动轨迹，轨迹连线，中间有物理的射线检测判断有没有障碍，最后生成大量的抛物线的落点画出来。 感觉上SphereCast比射线检测更好，这个用Compute Shader算应该很合适。但是建筑物碰撞部分怎么在CS里面处理？是不是把建筑物的碰撞先预处理成体素还不确定。 感谢jump晃悠@UWA问答社区提供了回答 A3：微积分基础思想就能解决，小范围内以直代曲，也就是分段SphereCast即可。如果要更精确，就不要用均匀分段，而是根据曲率不同分段长度不同，曲率就是抛物线函数的二次导数。 另外，每个角度算一个曲线就好，一般不需要提前把所有可能都算出来。 感谢偶尔不帅@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/66823001682c7e5cd61bf831 Script Q：请问有遇到这个问题的嘛，在安卓上序列化报以下异常： NotSupportedException: D:/Unity2021/Unity 2021.3.4f1/Editor/Data/il2cpp/libil2cpp/icalls/mscorlib/System.Reflection/RuntimeParameterInfo.cpp(23) : Unsupported internal call for IL2CPP:RuntimeParameterInfo::GetTypeModifiers - "This icall is not supported by il2cpp." A：.NET功能可能不受IL2CPP支持，试着升级一下Unity或者绕过你要实现的功能。 感谢萧小俊@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/666ddfe2682c7e5cd61bf80e Script Q：请教个问题，使用IL2Cpp就报错，用Mono编译就可以过。 A：IL2CPP里代码太多也会这样，如果开了Script Debugging关掉试试。若还没解决，那把这里调高看看（如下图），让代码少一点。 不过调高了有可能有别的报错，如果Strip了需要用到的东西，还得自己加到link.xml里。 感谢deviljz@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/66822eaf682c7e5cd61bf82f Audio Q：请教个问题，Wwise的Bank在安卓上LoadBank之后，播放没有声音，请问有人遇到过吗？ A：连Wwise的Profiler，看下是Bank加载失败了，还是播放失败了，或者根本就没有Listener，都有可能的，Profiler都会告诉你。 感谢断弦的旋律@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/66822f33682c7e5cd61bf830 封面图来源于网络 今天的分享就到这里。生有涯而知无涯，在漫漫的开发周期中，我们遇到的问题只是冰山一角，UWA社区愿伴你同行，一起探索分享。欢迎更多的开发者加入UWA社区。 UWA官网：www.uwa4d.com UWA社区：community.uwa4d.com UWA学堂：edu.uwa4d.com 官方技术QQ群：79397…

在TMP中计算书名号《》高度的问题
type: item
date: 2024-02-27T04:12:00+02:00
description: 1）在TMP中计算书名号《》高度的问题 2）FMOD设置中关于Virtual Channel Count&Real Channel Count的参数疑问 3）Unity 2021.3.18f1 ParticleSystemTrailGeometryJob粒子拖尾系统崩溃 4）XLua打包Lua文件粒度问题 这是第375篇UWA技术知识分享的推送，精选了UWA社区的热门话题，涵盖了UWA问答、社区帖子等技术知识点，助力大家更全面地掌握和学习。 UWA社区主页：community.uwa4d.com UWA QQ群：465082844 UI Q：如下图所示，输入的文字中有书名号，但使用ContentSIzeFitter计算得到的高度是错误的（貌似它计算的比实际少，导致没换行）： 而使用默认的Text就没这个问题（相同的字体）： 请问如何在TMP中计算书名号《》的高度？ A：好像是对东亚语言有特殊处理，都会换行。不确定是不是这儿的原因，输入“你好”两字也是一样的效果，可以在这儿改改试试。 把这行注释掉就没问题了，但我不保证没其他问题，因为要把TMP的包导入项目里，源码会少算了换行第一个字符的长度，GeneratedMesh和PreferedHeight是分开算的，所以显示和高度计算不一样，GeneratedMesh是对的，这是Unity自己的Bug，后面几个版本修复了，估计还是得想办法升级TMP的版本。 参考文档： https://docs.unity3d.com/Packages/com.unity.textmeshpro@3.2/changelog/CHANGELOG.html 感谢萌呆瞎@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/65c1d43b40a8d93b624afcce Audio Q：FMOD的设置中，我发现有两个设置选项：Virtual Channel Count和Real Channel Count。想请教一下，一般游戏项目内这两个值要设置多少才合适？我发现外网有人都是拉满的，但这会造成CPU负担。只知道Real Channel Count这个不能太高。所以想了解下通常这俩参数设置多少比较合理。 下图来自外网论坛，Virtual Channel Count设置为512、Real Channel Count设置为128，而我的项目中这俩设置为128、32。 A：Real Channel，如果设置成32对于PC来说是正好。对于移动平台，32应该也能跑。对于超古老的机器，可以考虑设置成16。 Real Channel是同时播放的音频Channel数，如果同时播放的Channel超过这个数字，就会根据优先级把低优先级的音频停掉。实际项目中，极少同时播放如此之多的Channel。如果真发生了，请仔细优化音频播放逻辑。 感谢Zhang Ce@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/65c0b00840a8d93b624afccd Crash Q：Unity 2021.3.18f1 ParticleSystemTrailGeometryJob粒子拖尾系统崩溃。 信息如下： 崩溃手机：Galaxy S24 Ultra 操作系统：Android14 崩溃堆栈： Crashed: Thread: SIGSEGV 0x0000007d2f34a900 #00 pc 0xb30240 libunity.so (ParticleSystemTrailGeometryJob::ConfigurePerParticleTrailParams(ParticleLineParameters&, ParticleSystemParticles const*, unsigned long, ParticleSystemTrailGeometryJob const&, float)) (BuildId: c89a8ec16cd55b42b7a6c100718f0e187c531fc3) #01 pc 0xb29b08 libunity.so (ParticleSystemTrailGeometryJob::ConfigurePerParticleTrailParams(ParticleLineParameters&, ParticleSystemParticles const*, unsigned long, ParticleSystemTrailGeometryJob const&, float)) (BuildId: c89a8ec16cd55b42b7a6c100718f0e187c531fc3…

Unreadable-Mesh内存占用翻倍问题
type: item
date: 2024-02-20T04:00:00+02:00
description: 1）Unreadable-Mesh内存占用翻倍问题 2）在TMP中计算书名号《》高度的问题 3）Mipmap如何限定层级 4）FMOD设置中关于Virtual Channel Count&Real Channel Count的参数疑问 这是第374篇UWA技术知识分享的推送，精选了UWA社区的热门话题，涵盖了UWA问答、社区帖子等技术知识点，助力大家更全面地掌握和学习。 UWA社区主页：community.uwa4d.com UWA QQ群：465082844 Memory Q：最近在做性能分析时发现Mesh内存占用异常，部分Mesh在未开启Readable的情况下也不会卸载CPU部分的内存开销。 通过Mesh文件对比发现是m_KeepVertices与m_keepIndices参数差异导致： 查询到网络上的部分源码，发现该参数确实会影响内存释放。 已尝试通过修改文件的方式与SerializedObject的方式去修改这个值，都无法保存，Unity内部会自行修正。请问有谁知道它具体的实现细节，什么样的Mesh数据会导致它会保留CPU端所有数据，以及有何提前规避的方式？ A：可能是网格设置了静态合批导致的，可以试下关掉静态合批看下这部分内存能否被卸载。 感谢宗卉轩@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/65c327433625c22cffcb1e1d UI Q：如下图所示，输入的文字中有书名号，但使用ContentSIzeFitter计算得到的高度是错误的（貌似它计算的比实际少，导致没换行）： 而使用默认的Text就没这个问题（相同的字体）： 请问如何在TMP中计算书名号《》的高度？ 针对以上问题，有经验的朋友欢迎转至社区交流分享： https://answer.uwa4d.com/question/65c1d43b40a8d93b624afcce Asset Q：请问Mipmap如何限定层级？ 比如一张1024x1024纹理，共有Mipmap0~10，但是项目只用到Mipmap0~2，如何省略掉3~10？ 针对以上问题，有经验的朋友欢迎转至社区交流分享： https://answer.uwa4d.com/question/65c0a61340a8d93b624afccc Audio Q：FMOD的设置中，我发现有两个设置选项：Virtual Channel Count和Real Channel Count。想请教一下，一般游戏项目内这两个值要设置多少才合适？我发现外网有人都是拉满的，但这会造成CPU负担。只知道Real Channel Count这个不能太高。所以想了解下通常这俩参数设置多少比较合理。 下图来自外网论坛，Virtual Channel Count设置为512、Real Channel Count设置为128，而我的项目中这俩设置为128、32。 针对以上问题，有经验的朋友欢迎转至社区交流分享： https://answer.uwa4d.com/question/65c0b00840a8d93b624afccd 封面图来源于网络 今天的分享就到这里。生有涯而知无涯，在漫漫的开发周期中，我们遇到的问题只是冰山一角，UWA社区愿伴你同行，一起探索分享。欢迎更多的开发者加入UWA社区。 UWA官网：www.uwa4d.com UWA社区：community.uwa4d.com UWA学堂：edu.uwa4d.com 官方技术QQ群：465082844

Unity场景物体动态合批
type: item
date: 2022-08-23T04:49:00+03:00
description: 1）Unity场景物体动态合批 ​2）Unity内置音频Android平台播放延迟问题 3）对Unity Package中的Shader打包避免冗余的方案 4）UnityEditor PropertyField并排显示错误 这是第307篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题，建议阅读时间10分钟，认真读完必有收获。 UWA 问答社区：answer.uwa4d.com UWA QQ群2：793972859（原群已满员） Rendering Q1：问题1：为了能使场景中物体合批（同材质球），场景在制作的时候相同的预制体放在了一起，但是FrameDebug看到的却是乱序。请问在这个Frame里的顺序是如何定义才能达到相同的合批？也就是如何能最少化的Objects have different materials？ 问题2：在FrameDebug上下排列且相同物体，依然没有合批。给出的原因是“Objects are lightmapped”。网上给出的解释是使用了不同的光照贴图（这里是一样的），或在相同的光照贴图中由不同的光照贴图UV转换关系。这个转换关系是什么意思？是UV对应的Offset几个参数必须要一样么？但是物体在不同的位置，理论上一定会不一样。请问这个要怎么解决？目前场景中物体占用了120个DrawCall，想尽可能优化。 A：第一个问题，针对不透明物体，Unity默认由近往远绘制（离相机的距离），所以如果想要相同的材质球是连续绘制的，可以通过调整RenderQueue来强行连续绘制，不过可能会导致渲染效果不符合预期（遮挡关系错乱），另外的坏处是会破坏Early-Z的功能，尤其在没有HSR功能的低端机上，Overdraw会造成高复杂度的Shader带来的GPU高压力，所以需要权衡CPU提交Batch的耗时和GPU的压力。 第二个问题，同类型材质球（Shader一样，变体也一样），如果Lightmap index不一样（也就是Lightmap不一样），肯定是不能合批的（SRP Batcher除外，SRP Batch无视材质球，只要Shader和变体一样就可以）。在Lightmap相同的情况下，如果对应的unity_LightmapST不一样，也是不能合批的。这里有两种方法解决，一种是用Static Batching，这样会让unity_LightmapST变成同一种，具体的UV会变成顶点数据（本来子Mesh的UV都是（0,1）的，合并Combined Mesh后会变成类似于（0.3,0.5）这样的区间），就是说顶点里面的UV本来存储的是Local空间的，变成Combined Mesh后，合体的Mesh数据里面存储的是World空间的，这样外在的unity_LightmapST对于不同的子Mesh就会变成共用的（1,1,0,0）这样的共同属性，也就可以合批了。另外一种是开启GPU Instancing，这样unity_LightmapST会变成CBuffer，这样也是会合批的。 如下图所示，Cube1和Cube2在FrameDebugger的唯一区别就是unity_LightmapST不一样，所以不开启GPU Instancing和Static Batching的情况下，是不能合批的，虽然它们是相邻的绘制顺序，Lightmap也是相同的。另外两个Cube(1)和Cube分别用的Lightmap2和Lightmap0。 开启静态合批后，中间的2个Cube合成了一个Batch，它们的unity_LightmapST变成了共同的（1,1,0,0），如下图： 材质球勾选GPU Instancing后，在FrameDebugger面板里面，已经看不到unity_LightmapST这个属性了。这两个Cube也是合成了一个Instanced Batch。如下图： 感谢Xuan@UWA问答社区提供了回答 Q2：对于第二个问题的解决方法。因为我们是动态创建物体。所以无法用静态合批。当我尝试使用GPU Instancing 后，批次几乎没变，一种是我们的不同的Mesh，使用同一个材质球，无法合批；其次是同一个Mesh也无法合批。如下提示： 另外依然还有“Objects are lightmaped”的提示，且已经没有Lightmap_ST，材质球都已勾选GPU： 还有Shader是有两个PASS的。是否另一个PASS也需要加入GPU Instancing 的代码？附Shader代码： Shader "WF/SceneObj" { Properties { [NoScaleOffset]_MainTex("主贴图 (RGBA)", 2D) = "white" {} [Space(20)] _OutlineWi…

TextMeshPro备用字体疑问
type: item
date: 2021-09-29T09:52:00+03:00
description: 1）TextMeshPro备用字体疑问 ​2）iOS的部分语言的float分隔符变成了逗号 3）ASTC格式支持与官方文档不符 4）关于音效背景音乐的音频文件的格式设置请教 5）LightProbe的信息位置 这是第269篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题，建议阅读时间10分钟，认真读完必有收获。 UWA 问答社区：answer.uwa4d.com UWA QQ群2：793972859（原群已满员） Text Q：TextMeshPro设置的Fallback “字体B”， 文本字体是“字体A”，如果文本显示的字符都是字体A的，CPU会不会收集字体B的贴图信息数据发送给GPU用来渲染？ 不是很理解这个Fallback字体，发现字体A、字体B都在内存中，也就是说其实都是关联上的。是不是所有的后备字体都会在内存中出现？ A：问题一：TMP中所谓Fallback，也就是后备字体，其含义在于当实际使用中出现了当前字体所不支持的字符时，按照：主字体（也就是当前字体）、主字体的后备字体、后备字体的后备字体、通用后备字体、通用后备字体的后备字体、通用默认字体、通用默认字体的后备字体等等的序列遍历所有设置的后备字体，直到找到能够支持的字体为止。 所以，引擎只有在内存中保留Fallback字体资源，才能在当前字体无法显示所有字符时采用Fallback字体。问题中提到的字体B也在内存中是合理的。 当然，如果开发者能确定字体A可以支持项目中出现的所有字体，那么完全可以检查Project Settings中全局的Default Font Asset、全局的Fallback Font Assets List、字体A的Fallback Font Assets，以上三处设置为空，则可以一定程度上节省内存。 问题二：我补充做了实验。对照情况是用某一种主字体显示“New Text”这一串字符，显然足够支持、而内存中也只有该主字体。然后在刚才提到的主字体的后备字体、后备字体的后备字体、通用后备字体、通用后备字体的后备字体、通用默认字体、通用默认字体的后备字体这个序列的每个环节加上不同的字体，显然它们没有被实际用到，但都进入内存了。List里面有几种字体也是一样。 感谢Faust@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/61455c7a8f8c834241ad6caf iOS Q：最近我们打包的时候发现，在iOS设备上，部分语言的小数的分隔符变成了逗号，比如俄罗斯语。后来发现是因为CurrentCulture变成了设备的语言，Android和之前的iOS设备都是en-US，也就导致了读取配置时用float.TryParse会转换失败。 我们的Unity版本是2018.4.33，目前还没有定位是什么原因导致的，不知道有没有人碰到过？如果在游戏启动时强制把CurrentCulture改成英语不知道可不可行？ A：我们项目踩过这个坑，原因就是一些语言里面小数点分隔符不一样，比如法语里分隔符是逗号，属于文化差异。解决方案是游戏启动时设置CurrentCulture为CultureInfo.InvariantCulture： CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; 参考链接：CultureInfo.InvariantCulture 感谢张迪@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/614bf82a8f8c834241b6484d Texture Q：ASTC格式支持与官方文档不符，根据官方文档（https://docs.unity3d.com/Manual/class-TextureImporterOverride.html）。理论上我们的测试机中，红米2是不支持的ASTC格式的。但实际测试中发现，它是支持的。这是怎么一回事？ A：之前做过相关的测试，红米2（Adren 302）是支持ASTC的，但红米Note2（PowerVR Rogue G6200）是不支持…

Wwise的内存问题
type: item
date: 2021-09-22T06:42:00+03:00
description: 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的时候，这个Po…

声音引擎Wwise与Criware的区别
type: item
date: 2021-06-09T05:13:00+03:00
description: 1）声音引擎Wwise与Criware的区别 ​2）Unity加载场景闪退问题 3）Animation Transition方案 4）高通GPU Adreno650手机的纹理显示异常问题 5）Live2D平滑渐变方案 这是第253篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题，建议阅读时间10分钟，认真读完必有收获。 UWA 问答社区：answer.uwa4d.com UWA QQ群2：793972859（原群已满员） Audio Q：现在有两个声音引擎可供选择，Wwise与Criware，请问在平时的开发、热更、效率、解耦上对比，有更推荐的使用的吗？还是说声音组擅长哪个就用哪个？ A1：其实音频中间件工具的选项非常多，并不只有这两个，比如《Apex Legends》使用了Rad Miles，《风之旅人和光遇》使用了FMOD，《半条命Alyx》则根本没有使用中间件，用的是自家引擎的音频模块。 Criware的历史相对比较长，跟著名游戏开发商世嘉有比较深的渊源，甚至可以说是曾经包含在世嘉的官方音视频开发工具集当中，鉴于世嘉的影响力，Criware至今在日本本土依然有着比较大的用户基数。 Wwise相对历史短一些，有趣的是其开发公司Audiokinetic于2019年成为了SIE（索尼互动娱乐）的子公司。采用Wwise的项目实际上非常多，而且每年在TGA获奖项目中都能找到约为半数的项目采用Wwise开发，只不过，他们不太强制客户给自己打Logo，造成存在感不是非常高。 随便列举几个使用了Wwise的例子（排名不分先后）：《死亡搁浅》、《生化危机123重制》、《生化危机8》、《怪物猎人Rise》、《对马岛之魂》、《战神》、《崩坏3》、《原神》、《王者荣耀》、《CODM》、《疑案追声》、《彩虹坠入》、《纪念碑谷2》、《Gris》、《Quantum Break》、《Control》、《巫师3》和《赛博朋克2077》等。 应该说，无论从开发的角度还是从音频组的角度，其实使用Wwise都是更好的选择。 开发 行业领先的空间音频工具集，最先支持广义Object Based音频管线的音频工具： https://www.audiokinetic.com/zh/library/edge/?source=SDK&id=spatial_audio.html https://www.audiokinetic.com/zh/products/plug-ins/reflect/ 行业领先的汽车引擎声音设计插件： https://www.audiokinetic.com/zh/products/plug-ins/crankcase-rev/ 强大的创作工具，几乎可实现音频设计师所有的疯狂设想，数量众多的成功用户案例及技术分享（如Wwise Tour，GDC）： https://www.bilibili.com/video/BV1RE411K7nT 官网Q&A及Launcher的Bug reporter，为官方支持的免费问题反馈提交渠道。技术支持与创意技术服务，满足项目的定制化需求。官方维护的Unity/Unreal集成，通过Launcher就可将Wwise SDK集成至您的项目当中，开箱即用。 全平台支持，丰富的音频编解码选项，内容丰富的SDK文档及清晰易学的Help文档及认证教程文档，用户可根据需要调节初始化设置获得更低的音频延迟。 热更 拥有File Packager工具集用于创建PCK管理通过热更发布的内容。Wwise 2021.1版本已支持Unity Addressables。 效率 对设计师而言，具备WAQL（Wwise创作工具查询语言），可在项目规模达到一定程度时方便设计师快速查询需要配置的资源或定位造成问题的资源： https://www.audiokinetic.com/zh/library/edge/?source=SDK&id=waql_introduction.html 强大灵活的声部限制功能与Profiling工具集，方便性能优化与问题排查，从而降低工程师负担，具备丰富的批量处理功能。 对于工程师而言，Wwise具备WAAPI（Wwise创作工具API），可用于创建开发工具，方便设计师快速处理巨量的数据配置，还可以帮助他们对资源进行批量打包以配合项目开发需要： https://www.audiokinetic.com/zh/library/edge/?source=SDK&id=waapi.html Wwise拥有动态内存管理，无需预先申请固定大小的内存池，做到用多少占多少。内存分类系统可以方便用户快速定位与内存消耗相关的问题。 解耦 Wwise API简单易用，事件后行为可由设计师在创作工具端进行设计，…

使用SBP后，如何查询Bundle的依赖关系
type: item
date: 2020-11-02T07:27:00+02:00
description: 1）使用SBP后，如何查询Bundle的依赖关系 ​2）大量同样的怪物的骨骼动画如何优化 3）DynamicBone动态骨骼插件是否在项目里使用 4）音频换Wwise的成本 5）运行时如何保存Prefab 这是第225篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题，建议阅读时间10分钟，认真读完必有收获。 UWA 问答社区：answer.uwa4d.com UWA QQ群2：793972859（原群已满员） AssetBundle Q：使用ContentPipeline.BuildAssetBundles接口打出Bundle文件后，没有产生AssetBundleManifest文件，请问该如何查询某个Bundle所依赖的其他Bundle呢？ A：可以从ComatibilityBuildPipeline.cs的源码里面看到下面的代码， 用上图中的方法来生成Manifest对象，然后参考《使用SBP打Bundle如何读取AssetBundleManifest》生成资源文件和打包AssetBundle。 感谢Xuan@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/5f96c3965d9aea5aa971986e Animation Q：大量同样的怪物的骨骼动画应该怎么优化？ 1.如果有N个怪物，是否同样的骨骼动画会计算N遍来得到每个Mesh的新的顶点位置。 2.如果1是对的，能否计算完一个怪物在动画这一帧的顶点位置后，其他怪物都用这个计算好的结果进行渲染。 第二个问题的这个方法我认为是和GPU Instancing的贴图动画是有区别的。不知道第二个方法有没有实现的可能，或者已经有人实现了吗？ 就是这一群模型表现都一样，变换矩阵每一帧都一样。请问Shared SkinnedMesh方案是什么思路，或者有没有参考链接？ A：请参考以下答案： 1.不同模型的动画序列帧不同，骨骼的变换矩阵必然有差异，除非这一群模型表现都一样，可以自己写一套Shared SkinnedMesh的方案。如果需要在CPU端蒙皮把Shader中的蒙皮计算拿出来就好。 Shared SkinnedMesh的方案参考：https://lab.uwa4d.com/lab/5bc6f85504617c5805d4eb0a 2.GPU Instancing的方案也是通过将序列帧骨骼动画烘培到贴图中，然后在顶点着色器中实现蒙皮计算的过程。 具体细节可参考：《移动游戏开发核心技术讲解：3D UI、GPU Skinning和DOTS》中GPUSkinning相关内容。 感谢羽飞@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/5f9ab69edc477370c2c1efa6 Animation Q：DynamicBone动态骨骼插件有人测试过性能吗？是否建议在项目里使用？ A1：这插件的性能真费，项目里主角30根骨骼用上这个插件后，高端机每帧耗时1ms。2个人就是2ms了。 感谢剑影蒙残@UWA问答社区提供了回答 A2：可以用，但是不能大面积用，最好用在重点对象上，适合搞一些骚操作。 感谢与我相关@UWA问答社区提供了回答 A3：完全可以使用。 我们上一个项目中有大量的舞蹈动作，最多支持16人的同台表演。在服装制作上使用了和DynamicBone类似的Unity日本开源的UnityChan中的SpringBone。同时进行了魔改，加入了横向约束防止在抬腿等大幅度动作时的穿模。魔改后的版本计算量比原版更大。 这类弹簧骨骼系统的计算量主要在两方面，一方面是计算弹簧间的力传导，另一方面是计算碰撞，都是重CPU的计算，是非常适合放入子线程去做的。刚好可以应用Unity的ECS来进行优化。 目前网上开源的实现中，可以参考下https://github.com/EsProgram/uSpringBone的实现。但由于ECS目前还未正式Release，所以稳定性不是特别好。 前段时间在逛AssetStore时，发现一个新的插件，使用JobSystem+BurstCompiler，推荐你们去看看。 MagicaCloth 感谢范君@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/5f59e49d9424416784ef21ba Audio Q：我们现在Unity原生的音频，使用的是一个Resonance-Audio插件，可能我们自己也没用好，但能凑合着用。 听说Wwise不错，打算都换上。但昨天下载了一天没安装上，而且和现有音频不能一起用，不知大家是否也遇…

如何在Editor中监听Prefab修改后Auto Save的事件
type: item
date: 2020-06-16T14:09:00+03:00
description: 1）如何在Editor中监听Prefab修改后Auto Save的事件 2）关于动画文件的Optimal选项的开启优点 3）一个大地形拆成多个Mesh Collider，对性能有帮助吗 4）Camera.SetReplacementShader和Projector显示问题 5）FMOD在安卓机上插拔耳机声音不会切换 这是第207篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题，建议阅读时间10分钟，认真读完必有收获。 UWA 问答社区：answer.uwa4d.com UWA QQ群2：793972859（原群已满员） Editor Q：如图，在新的Prefab机制中多了Auto Save，没找到监听方法。 原来的Apply是可以监听的，但是如果勾选了Auto Save，就不需要点击Apply，所以会监听不到。求问Auto Save的保存可以监听吗？ A：PrefabStage类负责管理Prefab的编辑操作，并提供了丰富的回调，参考PrefabStage源码可以轻松实现监听各个阶段： #if UNITY_EDITOR using UnityEngine; using UnityEditor; using UnityEditor.Experimental.SceneManagement; [InitializeOnLoad] public static class PrefabStageListener { static PrefabStageListener() { // 打开Prefab编辑界面回调 PrefabStage.prefabStageOpened += OnPrefabStageOpened; // Prefab被保存之前回调 PrefabStage.prefabSaving += OnPrefabSaving; // Prefab被保存之后回调 PrefabStage.prefabSaved += OnPrefabSaved; // 关闭Prefab编辑界面回调 PrefabStage.prefabStageClosing += OnPrefabStageClosing; } //.... } #endif PS：如果经常要查找一些编辑器私有的字段方法，建议下载dnSpy直接打开UnityEditor.dll搜索关键字进行查找，例如想通过代码实现界面按钮的某个功能却找不到API，这时候就可以查看相关DLL里的方法尝试反射调用。 感谢张迪@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/5ee0aecaa45e13073a5710ea Animation Q：项目中的动画文件开启了Optimal选项，会有哪些实质性的优点可以讲一下吗？开启Optimal选项是对项目中的哪一部分起到了作用？ A：Unity的官方文档对这个选项的描述确实并不清楚： Let Unity decide how to compress, either by keyframe reduction or by using dense format. If enabled, the Inspector displays Animation Compression Errors options. Only for Generic and Humanoid Animation Type rigs. 推荐看这篇文章，对于Unity动画文件里的曲线保存方式和相关选项做了细致的描述。总体来说，Optimal就是让Unity自动选择最优的曲线表达方式，从而占用最小的存储空间。 该回答由UWA提供，欢迎大家转至社区交流： https://answer.uwa4d.com/question/5eb905a04d93790618e0ed25 Physics Q：请问下大家的项目里，地形部分是直接用的MeshCollider吗？如果把一个大地形拆成多个MeshCollider性能上会不会好一些？不知道大家有没有这方面的优化经验？ A：按之前的优化经验来看，物理的contacts数（有接触的物体对）对于物理的开销影响会比较大。而计算MeshCollider与其他物体是否有接触的时候，是用的AABB包围盒，所以对于弯曲的、狭长的MeshCollider还是建议做一下拆分，避免其包围盒过大，导致过多的contacts产生。但对于方方正正的地形块来说，是否需要拆分、拆分到什么粒度就不太好判断了，这方面的文档或者经验分享确实不多。 该回答由UWA提供，欢迎大家转至社区交流： https://answer.uwa4d.com/question/5ec4d442979400061…