声音引擎Wwise与Criware的区别

时间:2024-02-23 16:04:13

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简单易用,事件后行为可由设计师在创作工具端进行设计,工程师无需为此操心,通常情况下,需要帮设计师调用的接口无非是:

  • PostEvent
  • SetState
  • SetSwitch
  • SetRTPCValue
  • Load/Unload bank

更详细文档参见:
https://www.audiokinetic.com/zh/library/edge/?source=SDK&id=workingwithsdks_integratingelements.html

Wwise提供给了声音设计师极大的创作空间,许多关于空间音频设计的设置都放在了创作工具端,而无需程序介入进行调试,只需要像处理一般的发声体一样处理就好。

设计师也能够通过Profiling工具对性能损耗有清晰的认识,提前定位可能形成性能问题的设计从而采取重构处理。

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

A2:楼上解答从技术层面确实非常好,我简单说下我的看法。

不论界面是否好看,不好看后期还能改。用任何技术,你都要考虑他的市场,现在Wwise的占有率必然是高的,就比如现在的音频工程师,会Wwise和会Criware哪个更容易被录取。

程序也一样,只接过Wwise和只接过Criware哪个更吃香。通过这个分析,你就知道你应该用什么软件了。

感谢夏霖锐@UWA问答社区提供了回答


Crash

Q:最近项目遇到一个很诡异的问题,从一个场景切换到另外一个场景的时候,在安卓64位真机会闪退,通过符号表查出来最终闪退在Unity的il2cpp/vm/liveness.cpp文件中。

在Unity,PC版本均无闪退现象。

引擎版本:Unity 2018.4.10
打包机:MacOS

为了查出闪退原因,做了以下测试:
1.使用Mono打包,无闪退;
2.删除V8类库,完全使用V7类库,无闪退;
3.使用V8库,切换到一个空的场景,闪退。

第3点中无论使用Application.LoadLevel,Applicaiton.LoadLevelAync,SceneManager.LoadScene还是SceneManager.LoadSceneAync都会闪退,这个问题现在已经没什么头绪了,不知道有没有大佬遇到过这个问题呢?

闪退日志:il2cpp::vm::LivenessState::AddProcessObject(Il2CppObject, il2cpp::vm::LivenessState)

很不幸,升级完Unity以后,崩溃依旧没有解决:

 

参考网址:
https://forum.unity.com/threads/il2cpp-crashes-at-garbagecollectsharedassets-and-loadlevel.316775/page-2

A:发现要升级到Unity 2018.4.35版本,在这个版本中修复了这个Bug:

 

感谢题主Lim@UWA问答社区提供了回答


Animation

Q:请教一个Animation Transition的问题。目前对于一个State A,所有从A出去的过渡线是可以进行优先级排序的。那有没有办法对进入A的所有过渡线也进行优先级排序呢?

比如对A来说,有AnyState -> A 和B -> A两条线,而且它们的条件一样。那么当条件成立时,有什么办法指定使用上述某一条线呢?

目前官方文档没有找到对应的方法,论坛里有人说可以在进入B的时候设置一个状态来Disable AnyState,然后离开B的时候再设置回来。不知道有没有更好的方法。谢谢!

A1:“对进入A的所有过渡线也进行优先级排序”这个描述有点问题。根据状态机的定义,不存在当前处于两个State,都要进入State A的情况。

具体描述问题的时候也提到了,关键是存在AnyState这个节点。在Unity的动画状态机方案里,Entry、AnyState和Exit节点是类似于语法糖的东西,生成Runtime资产的时候有一系列节点展开的过程。

回到这个问题上,当处于State B -> State A的时候,并不是“对进入A的过渡线进行优先级排序”,还是“从B出去的过渡线进行优先级排序”。当你在B->A上设定了两条Transition线的时候,是可以做优先级排序的,而AnyState在展开后也会生成B->A的Transition线。但编辑器层面没有公开这层可视化,所以不可调整,并且展开过程不可见,不支持扩展(至少我没找到)。

在必须用AnimatorController和想办法实现功能的前提下:
如果只是想让B->A不走AnyState的Transition,写个Distable AnyState的状态机脚本,声明参数配到AnyState的条件里是最简单的。麻烦一点的就是不使用Anystate->A,活用Sub-Sm减少连线数量。

如果是想让AnyState里的Transition的优先级提高,在B-A上多加一条相同配置的等价Transition调整即可。

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

A2:语义上AnyState->A 包含B->A(如果条件相同) ,即B->A本来在状态机里是多余的Transition。而当前状态只有一个,满足条件时转入下一个状态,也不存在优先问题。故,应把B->A设定为其它条件,使得B->A不是AnyState->A的子集。

感谢陈浩涛@UWA问答社区提供了回答


Rendering

Q:目前发现在高通GPU Adreno650设备上,纹理显示模糊,请问有遇到过的大佬有解决的办法吗?(疑似像是Mipmaps的level错误。)

Unity版本:2019.4.10LTS,
URP版本:7.5.3
图片设置 压缩格式:RGB(A) astc compressed

高通Adreno650:

 

其他设备:

 

A:很可能是GPU的问题,调下Shader浮点精度试试,我们当时是这么解决的。一些华为手机也会有这种精度问题。

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


Rendering

Q:Live 2D官方提供的组件CubismRenderController通过设置Opacity可以设置Cubism的透明度,但是过渡很生硬,如下图:

 

目前的方案是把Cubism通过RT渲染到面板上,通过控制面板透明度来达到平滑过渡效果,请问大家还有什么好的解决方案?

测试过,不能用缓动曲线函数来设置这个值,中间过程还是会穿帮。

A1:所谓透明度“不平滑过度”,本质原因在于原先的逻辑是身体的每一个小部分单独应用cubism_ModelOpacity之后,再将各个部分进行混合。核心代码如下:

 

身体是一部分一部分画的:

 

而题主要的效果是:在渲染出整体结果之后,再对整体应用透明效果。所以, “全身绘制之后,再使用透明度处理一次” 这一做法是必然的。本质是身体各部分绘制完成后,要取到FrameBuffer,然后使用透明度处理一次。因此“通过RT渲染到面板上,再控制面板的透明度的做法是合理”的。

所以题主的问题是,有没有更直接的方法,对这一过程进行优化。我这边还没有想到更好的优化方法,可能Builtin-RenderPipeline没有那么灵活,也或许可以考虑有没有优化的必要。

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

封面图来源于网络


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

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