AudioKineticWwise 学习相关

本文档可以帮助你快速熟悉Wwise知识体系中只与程序员相关的信息, 从而能与音频设计团队配合开发互动音频内容。

本文档按正常学习顺序组织章节,力求点到即止,配合官方SDK集成演示学习效果最佳。对新用户,建议顺序阅读本文档,打下基础,之后即可在实践中根据一节,利用Wwise安装包内的学习资源继续学习。

本文档是按照标题页注明的Wwise版本情况所写,以后可能会根据版本演进而同步更新本文档,如有问题请联系技术支持。由于Wwise的基础流程比较稳定,所以文档大部分内容是长期有效的。

Wwise的功能和流程可以为程序员带来如下便利:

  • 简化音频编程:由于复杂的声音行为和逻辑被封装到了和中,成为了数据包的一部分,以触发事件和设置游戏同步器为主导的API调用得以让代码变得简单统一,比如不再需要直接编程控制音量等声音参数,条件逻辑也得到了简化;事件之外的很多动态声音行为比如音乐切换,尽管有对应的API调用,然而还可以进一步被设计师封装到事件中,从而再度简化编码工作。

  • 简化声音集成:通过事件、游戏同步器和组成抽象数据机制,并商定了机制中用到的各种名称ID后,程序员的声音集成代码便只涉及引用这些固定的名称ID,随后代码将很少需要改动;设计师可以将设计和修改持续封装到SoundBank数据中,并尽可能复用SoundBank。于是开发中声音设计的增量更新可以通过自动化管线来刷新数据,很少需要程序员干预。

  • 减少优化负担:设计师可以在Wwise设计工具中直接监控音频性能数据,并直接在设计中做优化调整,结果依然通过更新声音数据来生效,因此大大降低了程序员优化声音性能的负担。

  • 减少低效沟通:由于上述的流程改进,在进行了必要的团队沟通之后,程序员和设计师便可以分头行动,很少需要做声音设计机制和数值细节层面上的沟通。

安装和设置

Audiokinetic官网下载页面提供最新发布内容。

  • 目前Audiokinetic每年最多只会发布两个Wwise大版本。

  • 同一个大版本下的小版本间数据兼容。例如:v2015.1.6和v2015.1.1间数据是兼容的。也即,如果声音设计师将手头的Wwise设计工具1v2015.1.1版更新到了v2015.1.6,那么他生成的声音数据仍将和程序员手头集成了v2015.1.1的游戏版本兼容;反之亦然。

  • 大版本间的数据不向后兼容,但旧版本数据可以用新版本设计工具打开并自动升级(Migration)。例如:集成了v2015.1.6的游戏版本不能直接使用v2014.1.6版本生成的声音数据,但可以用v2015.1.6的设计工具打开v2014.1.6的工程并自动升级。

Windows程序员至少要下载安装什么?


如果选择从官网在线安装,请下载Windows在线安装包;打开该安装文件,保留默认勾选内容,然后根据手头使用的Visual Studio版本勾选对应的Windows SDK版本,最后开始安装。

如果选择从中转站下载安装,请参照云盘中的[必读] 内容导航.pdf文件的第2–3节来选择下载并进行离线安装。

默认安装结果位于:C:\Program Files (x86)\Audiokinetic\

Mac程序员至少要下载安装什么?


如果从官网下载安装,请下载:

  • 设计工具:Wwise Authoring (Mac OS X);

  • iOS平台:Wwise SDK (iOS) Setup;

  • Mac OS X平台:Wwise SDK (Mac OS X) Setup;

  • tvOS平台:Wwise SDK (tvOS) Setup。

在电脑上安装了什么?


下表为安装好Wwise之后在指定安装目录下的内容。

名称 子目录 用户 说明
Wwise设计工具 Windows: Authoring/
Mac: Wwise.app
设计师 声音设计工具
Wwise SDK SDK/ 程序员 声音引擎、插件库和例程
Game Simulator Game Simulator/ 程序员 SDK的Lua语言绑定程序2

官方SDK集成演示


学习本文档时如果对照则效果最佳。安装好Wwise后,与该演示相关的关键路径有:

  • Wwise/SDK/<平台名>/bin/:演示可执行程序根目录,可执行程序有三个版本,分别在DebugProfile或者Release子目录下面(见什么是Debug、Profile和Release?)。

  • Wwise/SDK/samples/IntegrationDemo/:演示源代码根目录。

  • Wwise/SDK/samples/SoundEngine/:演示程序所依赖的例程根目录。此根目录下的Common子目录包含跨平台代码,而<平台名>子目录(比如Windows)包含平台专用代码及集成开发环境(IDE)工程文件。

  • Wwise/SDK/samples/IntegrationDemo/WwiseProject/:演示程序的Wwise工程,主要由设计师用Wwise设计工具管理并生成演示程序使用的声音数据。Windows版自带声音数据;Mac版在安装后需要手动生成声音数据。

  • Wwise/SDK/samples/IntegrationDemo/WwiseProject/GeneratedSoundBanks/<平台名>/:演示程序需要加载的声音数据所在目录。

确保声音数据目录下有数据,打开对应目标平台的可执行演示程序,你将看到窗口中有一列专题演示的菜单。若要选择各个专题演示,在电脑上用键盘上的方向箭头、Enter键和Esc键控制,在移动设备上用虚拟手柄控制。专题演示会在本文档后面的专题章节中详细介绍,程序员既可以直接体验演示程序,也可以打开IDE工程从源代码重新编译并调试演示程序。

什么是Debug、Profile和Release?


Wwise/SDK/<平台名>/bin/Wwise/SDK/<平台名>/lib/下面你会看到DebugProfileProfile三个子目录,这是Wwise为了支持开发流程而准备的。lib子目录下面的SDK程序库对应三种配置:

  • Debug:用来调试的未优化版本,支持与Wwise设计工具通过网络连接来进行实时混音、性能监测和调试;

  • Profile:主要用作开发期间运行于游戏中的优化版本,支持与Wwise设计工具通过网络连接来进行实时混音、性能监测和调试;

  • Release:用于游戏最终发布的优化版本,不支持与Wwise设计工具连接。

在开发期间,项目应该尽量使用 Profile 版本的Wwise SDK程序库配置。

如果安装设置已经完成了的话,接下来我们先看看采用Wwise来制作集成声音的基本工作流程。

Wwise工作流程

团队分工


在Wwise的工作流程中,声音设计师(下称设计师)与程序员有明确分工。主要目的是给设计师更多控制,为程序员减轻工作量。

简单地说,设计师负责创作、模拟、混合、调试和优化声音以及声音行为,程序员主要只负责触发声音以及声音行为,设计师和程序员通过明确定义的数据协议进行沟通。

迭代流程


Wwise提倡在游戏音频开发中采用五步迭代流程:

  • 创作:设计师在Wwise设计工具中设计音效、音乐和对白等。这一步可以在声音引擎甚至游戏引擎还没有到位时就可以开始。

  • 模拟:设计师在Wwise设计工具中模拟游戏中的声音场景。这一步同样可以在声音引擎甚至游戏引擎就位之前进行。

  • 集成:程序员在项目之初将声音引擎一次性集成到游戏引擎中,之后设计师可以开始将设计结果生成为声音数据包,通知程序员在游戏中加载数据包,并为游戏中的对象和场景触发播放、音乐切换、混音调整等声音行为。

  • 混音:设计师从Wwise设计工具实时连接到游戏中按照审美标准和创意设计调整多个声音间的相对关系,混音期间无需重新构建游戏。

  • 性能分析:设计师从Wwise设计工具实时连接到游戏中监控游戏运行时的声音资源占用,并和程序员合作优化性能。

从游戏的角度看Wwise声音引擎活动


从游戏开始运行到退出,Wwise声音引擎至少会进行以下常见活动:

  • 初始化:声音引擎初始化专用内存池和线程,加载并初始化必要的模块,并加载全局数据包。

  • 加载声音数据包:在播放声音或执行动态声音行为之前,声音引擎要加载这些行为所需的设计参数和声音数据。

  • 注册并跟踪听觉主体和游戏对象:声音设计的作用域可以为全局和具体游戏中的对象(比如角色),声音引擎因此需要注册追踪游戏对象。如果游戏要根据角色等游戏对象的空间位置调整声音属性比如音量衰减,则声音引擎要登记并更新听觉主体(一般是玩家控制的角色)和游戏对象(一般是玩家以外的发声体)各自的空间位置。位置跟踪行为一般发生在游戏主循环的每帧中。

  • 触发播放和控制行为:游戏向声音引擎发送对应播放等行为的消息,并将控制声音行为所需要的游戏变量信息输送给声音引擎。

  • 渲染:声音引擎根据游戏发来的请求通过渲染来发出声音并实现玩家能听到的动态声音行为,比如音量和音调的变化、音乐切换、混音调整等。

  • 挂起和唤醒:当游戏切入后台或者被其它应用程序打断的时候,需要暂停所有声音活动;当游戏回到前台或者结束中断时又需要继续进行挂起前的声音活动。

  • 注销游戏对象:当用在某游戏对象上的播放等行为完成后,游戏引擎将不再需要的游戏对象记录注销掉。

  • 卸载声音数据包:当游戏不再需要某些声音数据后,声音引擎要卸载这些数据以释放内存。

  • 关闭:当游戏要退出时,声音引擎需要终止一切播放和其它声音行为,关闭初始化了的模块,结束线程并释放内存池。

程序员的职责


前面列出的声音引擎活动都有Wwise SDK中的对应的API(应用程序接口)调用,程序员在游戏代码中添加这些调用后声音引擎就能完成这些活动。

必要的团队沟通


程序员需要和设计师做的沟通包括:

  • 项目在目标平台上需要的运算资源:内存、声音数据包体积、流的数量等。

  • 如何根据游戏场景触发事件。

  • 要用哪些游戏中的变量来实时影响声音。

理解了这些工作流程和之后,下面就来看看程序员如何在游戏代码中集成Wwise的声音引擎和基于Wwise的声音设计内容。

声音引擎初始化和维护

这一步对于同一个游戏引擎一般只需要编一次程。

初始化

首先,打开官方SDK集成演示中当前开发平台的IDE工程,在进行初始化之前,需要针对目标平台定义内存钩子(Memory Hooks),这些钩子可用来实现和监控内存操作。

内存钩子的例程参见以下源代码文件中的对应代码段:Wwise/SDK/samples/IntegrationDemo/Windows/Main.cpp3

接下来,找到IntegrationDemo.cpp文件中的IntegrationDemo::InitWwise()方法4,这个方法给出了声音引擎初始化的例子。初始化包括以下步骤:

  • 初始化内存管理器AK::MemoryMgr::Init();这一步将确定全局内存参数,比如Wwise专用的几个内存池大小。

  • 创建流管理器AK::StreamMgr::Create();这一步创建流管理器,它负责和声音数据包相关的I/O行为比如流播放。

  • 初始化I/O设备m_pLowLevelIO->Init();这个设备对象负责平台相关的底层I/O行为,演示程序中对应各个平台都有不同的类实现。在中我们会稍作讨论。

  • 初始化声音引擎AK::SoundEngine::Init();这一步初始化声音引擎本身。

  • (可选)初始化音乐引擎AK::MusicEngine::Init();如果你的项目中要用到Wwise的互动音乐功能,则需要这一步,否则不用。

  • 初始化性能分析通信模块:在项目的开发版本中为了让Wwise设计工具能与游戏连接并使用Wwise Profiler(性能分析器)来监视和调试游戏中的声音,要先初始化通信模块。

#if !defined AK_OPTIMIZED// ......AK::Comm::Init();// ......#endif // AK_OPTIMIZED

项目的Release版本中需要定义AK_OPTIMIZED这个条件编译宏,以确保最终发布版本不包含性能分析的支持。

  • (可选)注册插件AK::SoundEngine::RegisterAllPlugins(); 也可以调用其他用来注册单项插件的的API。Wwise带有丰富的效果器和源插件库,另外音频压缩解码器如Vorbis解码器5也是以插件库形式集成。需要先注册插件后才能在游戏中调用6

至此声音引擎就初始化完毕了。

渲染


在声音引擎初始化之后,为了让设计师设计的播放和其他声音行为最终能让玩家听到,还需要在游戏主循环中加入渲染声音的API调用:AK::SoundEngine::RenderAudio();。一般要在游戏主循环的每帧中进行这些渲染。

参考IntegrationDemo.cpp中的IntegrationDemo::Render()方法。

关闭


退出游戏的时候需要关闭声音引擎。关闭声音引擎与初始化操作大致“对称”,调用各个模块的对应API即可,参见IntegrationDemo.cpp中的IntegrationDemo::TermWwise()方法:

  • 关闭性能分析通信模块:

#if !defined AK_OPTIMIZED// ......AK::Comm::Term();// ......#endif // AK_OPTIMIZED  
  • (可选)关闭音乐引擎AK::MusicEngine::Term();

  • 关闭声音引擎AK::SoundEngine::Term();

  • 关闭I/O设备m_pLowLevelIO->Term();

  • 销毁流管理器AK::IAkStreamMgr::Get()->Destroy();

  • 关闭内存管理器AK::MemoryMgr::Term();

挂起和唤醒


当游戏切入后台或者被其它应用程序打断的时候,通常需要在不关闭整个声音引擎的条件下暂停所有的声音播放和行为;当游戏回到前台或者回复中断前的状态时又需要唤醒声音引擎来继续挂起前的播放和行为。

调用AK::SoundEngine::Suspend()来挂起,调用AK::SoundEngine::WakeupFromSuspend()来唤醒。调用这些API的时机要看各个平台上对于前后台切换和中断处理的具体要求。参考官方SDK集成演示中的相关API调用7

调试初始化


因为在通信模块初始化之后,才能使用Wwise Profiler来监控声音引擎的行为,所以初始化过程中还不能利用Profiler来调试。这一步的调试主要依赖对相关API的返回值做出检测。任何一步失败后要终止后续步骤。

注意检查控制台的错误输出中以AK起头的信息,AK代表 Audiokinetic。

加载声音数据包

在播放声音或执行动态声音行为之前,声音引擎要加载这些行为所需的声音数据和控制参数。

SoundBank


Wwise里的声音数据用特殊的文件格式打包,这种数据文件被称为SoundBank,文件扩展名为.bnk。SoundBank由Wwise设计工具生成,实际中可以由设计师设计其内容,并通过Wwise自带的设计工具命令行程序WwiseCLI.exe集成到项目自动化管线中去。

准备底层I/O

在中我们提到过初始化底层I/O设备(Low-level I/O),这个模块负责读取SoundBank所需要的数据I/O工作,主要包括设置和添加SoundBank目录,根据这些目录和用户输入的SoundBank文件名来构建SoundBank文件完整路径,并利用平台系统的I/O API打开文件和读取数据。

参考官方SDK集成演示源代码中以下类及其基类的实现:CAkFilePackageLowLevelIOBlocking

设置目录


SoundBank文件一般存放在目标平台存储设备的一个或多个目录下。声音引擎初始化完毕后,为了能够加载SoundBanks,要调用几个API来指定SoundBank所在目录的路径。

参考IntegrationDemo.cpp中的IntegrationDemo::Init()方法:

  • 设置声音数据包基本目录m_pLowLevelIO->SetBasePath();,加载声音数据包时,声音引擎将首先到这个目录下寻找声音数据包。在Android平台上,这个基本目录必须位于应用的APK安装包体内。

  • (可选)添加其它声音数据包目录m_pLowLevelIO->AddBasePath();,移动平台上有时需要使用多个目录来储存声音数据,比如游戏发售后的增量更新会希望存在另外的目录下,这些新目录需要加入搜索路径。在Android平台上,如果要将SoundBank存放在应用的APK包之外的位置,需要执行这一步。

  • 设定本地化语言AK::StreamMgr::SetCurrentLanguage();,这个语言名字代表上述目录下的子目录名,声音引擎找到上述基本路径(Base Path)后,会根据当前本地化语言设定寻找语言相关的声音数据(比如对白)的存储位置。

设置好这些目录相关的路径之后,在调用加载SoundBank的API时,只需输入SoundBank文件名作为参数就可以了。

加载全局数据


设置好SoundBank路径之后,首先要加载初始化SoundBank,它的文件名是固定的:Init.bnk。这个文件包含游戏期间所有声音和声音行为需要的共享数据。

使用AK::SoundEngine::LoadBank()这个API来加载SoundBank,可以通过参数选择阻塞或者异步方式。

参考官方SDK集成演示源码BaseMenuPage.cpp中方法BaseMenuPage::Init()的实现。

加载播放需要的数据


在播放声音和控制其它声音行为之前,要加载这些声音和行为数据所在的SoundBanks,依然采用AK::SoundEngine::LoadBank()API。

参考官方SDK集成演示中的相关API调用。

卸载数据


确认不再需要SoundBank之后可以将其卸载以释放内存。

调用AK::SoundEngine::UnloadBank()API来卸载SoundBank。

调试声音数据加载


SoundBank相关的调试可以利用Wwise Profiler8,比如:

  • 在Capture Log窗口中关注带有Bank关键字的错误信息。

  • 在Advanced Profiler(高级性能分析器)窗口的SoundBanks选项卡中观察已经加载的SoundBanks。

注意检查控制台的错误输出中以AK起头的信息,AK代表 Audiokinetic。

播放

注册游戏对象


在播放声音之前要注册播放涉及的游戏对象。多数声音都有对应的游戏对象比如角色、武器等,声音引擎需要注册这些对象,随后的播放和其它声音行为,将根据注册后的对象ID确定。当不再需要这些游戏对象的时候,比如角色退场后,声音引擎需要注销这些对象。

调用AK::SoundEngine::RegisterGameObj()AK::SoundEngine::UnregisterGameObj()API来注册和注销游戏对象。参考官方SDK集成演示中的相关API调用。Wwise用AK_INVALID_GAME_OBJECT来表示无效对象或者所有对象(全局域)。

事件


Wwise用Event(事件)来封装播放等声音行为。一个Event可以包含设计师定义的多个行为,比如播放、停止播放、改变音量等,程序员只需要和设计师约定Event的名称,继而按照约定的名称字符串以及作用对象的注册ID作为输入参数调用AK::SoundEngine::PostEvent()API即可,发送到声音引擎的事件经过操作即可生效,成为玩家可以听到的声音效果。

参考官方SDK集成演示中的相关API调用。

注意停止播放暂停播放等也是事件可以封装的行为,由设计师控制。

调试播放


游戏对象相关的调试可以利用Wwise Profiler,比如:

  • 在Capture Log窗口中关注带有Game Object等关键字的错误信息。

  • 在Performance Monitor窗口中的时间轴上通过Number of Registered Objects曲线实时观察当前已注册游戏对象,可能需要先从窗口标题栏上的View Settings中启用该参数。

  • 在Game Object Profiler界面布局(Layout菜单下选择)下实时观察游戏中注册过的游戏对象和听者的空间位置。

事件相关的调试可以利用Wwise Profiler,比如:

  • 在Capture Log窗口中关注带有EventStop等关键字的错误信息。

  • 在Performance Monitor窗口中的时间轴上通过Number of Active Events曲线实时观察当前活跃事件,可能需要先从窗口标题栏上的View Settings中启用该参数。

注意检查控制台的错误输出中以AK起头的信息,AK代表 Audiokinetic。

空间定位

听者和游戏对象

声音引擎要通过更新听者和游戏对象的空间信息来实现声音的空间定位。听者(Listener)一般代表玩家控制的主角,游戏对象(Game Object)代表游戏中的其它发声体(emitter),两者在空间中的相对关系决定声音的方向和距离衰减造成的音量等声音属性变化。

在游戏主循环中,调用AK::SoundEngine::SetListenerPosition()来更新听者的空间位置,调用AK::SoundEngine::SetPosition()来更新游戏对象的空间位置。

参考官方SDK集成演示中的相关API调用。

调试空间定位


空间定位相关的调试可以利用Wwise Profiler,比如:

  • 在Game Object Profiler界面布局(Layout菜单下选择)下实时观察游戏中注册过的游戏对象和听者的空间位置。

注意检查控制台的错误输出中以AK起头的信息,AK代表 Audiokinetic。

互动控制

游戏同步器


Wwise通过Switch(切换开关)State(状态)RTPC(实时参数控制)等参数来将游戏中的信息挂接到声音属性和行为上实现互动控制,这些参数统称为Game Syncs(游戏同步器)

调用对应这些参数的API来改变这些参数的值,如下表所示:

游戏同步器 调用API
Switch AK::SoundEngine::SetSwitch()
State AK::SoundEngine::SetState()
RTPC AK::SoundEngine::SetRTPCValue()

Switch用于游戏对象上的状态切换,比如根据角色踩到的路面类型变化来切换脚步声;State用于全局状态切换,比如根据游戏场景和进程发展来播放不同的音乐;RTPC用于连续数值变化,比如利用车辆发动机转速的连续变化来影响发动机声音。

参考官方SDK集成演示中的相关API调用。

程序员不需要知道这些API是如何影响声音的,只需要和设计师约定好状态和切换的名称,准备好游戏世界中的变量,将这些变量的数值信息作为API输入参数发送给声音引擎就可以了。

调试互动控制

互动控制相关的调试可以利用Wwise Profiler,比如:

  • 在Capture Log窗口中关注带有witch和State关键字的错误信息。

  • 可以在Game Sync Monitor窗口中沿时间轴观察RTPC值的时变情况。

注意检查控制台的错误输出中以AK起头的信息,AK代表 Audiokinetic。

异步处理

在发送事件的时候,可能无法预知一些实时信息和操作的时机,必须等待声音引擎的通知,一个例子是音乐的节拍时间点。

Callbacks


PostEventAPI因此提供了专门的参数,用来给程序员指定Callbacks(回调函数)以便进行异步处理。这些Callbacks可以完成很多有用的任务,比如:

  • 如果注册了AK_EndOfEvent类型的Callback,当事件处理结束时客户程序就可以收到通知,这样可以实现比如衔接多个事件或行为这样的功能。

  • 如果注册了AK_MusicSyncBeat类型的Callback,就可以在互动音乐播放时的节拍点上收到通知,实现基于节拍的功能。

参考官方SDK集成演示中的相关API调用。关于所有支持的Callback类型请参考API文档中的条目:AkCallbackType

调试异步处理


因为Callback函数内容是用户代码,可以包含任何内容,所以调试方法可以参考其它章节的内容。Callback是否已执行可以用常规方法检测。

注意检查控制台的错误输出中以AK起头的信息,AK代表 Audiokinetic。

游戏引擎编辑器集成

游戏开发中常常需要在游戏编辑器中浏览一些声音属性,比如在3D游戏中,可能会需要用图形来表现地图中游戏对象声音的传播范围,以方便在不试听的情况下监控调试声音衰减。Wwise提供了特殊的模块SoundFrame来帮助游戏引擎程序员来实现这些游戏编辑器集成功能,让游戏编辑器可以直接和Wwise设计工具沟通信息。

参考Wwise/SDK/samples/SoundFrame/下的例程。

调试

调试是开发中程序员关注的重要内容,本节汇总前述各章节中的调试小节的内容,以供集中查阅。

  • 调试初始化

  • 调试声音数据加载

  • 调试播放

  • 调试空间定位

  • 调试互动控制

  • 调试异步处理

所有涉及Wwise Profiler的调试活动,程序员和设计师都可以参与。

进阶学习

读到这里,Wwise集成需要的程序员基础知识就告一段落了。希望你已经体会到了Wwise给程序员提供的便利。接下来:

  • 本文档中提到的话题均可在官方SDK帮助文档中找到更详尽的内容。

  • Wwise SDK有丰富的功能值得研究,本文档只提到了一部分。在读完本指南之后,你可以参照官方SDK帮助文档继续学习。

  • Wwise安装包内自带开源游戏Cube Demo,可以学习其源代码,并试试动手修改和添加功能。

  • 可以免费下载并学习Wwise为商用引擎的集成,比如Unity和Unreal集成。

下面简单介绍一部分进阶内容,仅就前文提到的方向稍加延伸提示。

SoundBank加载策略


基于SoundBank的内存和I/O管理是开发中必须考虑的话题。本文档介绍的AK::SoundEngine::LoadBank()API的SoundBank加载方式简单易用,但在内存处理上不够灵活。对此Wwise SDK还提供了可选的其它API,用来实现更灵活的基于SoundBank内容的加载管理策略。

详见官方SDK帮助文档章节。

流播放


按照本文档中的方式集成了SoundBank之后,要注意 AK::SoundEngine::LoadBank()API将所有数据一次性载入内存;如果需要采用流播放以节省内存,则程序员一般无须干预,由设计师在设计工具中指定。采用流播放后Wwise会在SoundBank的存放位置生成扩展名为.wem9的文件,这些文件包含播放用的确切音频数据,需要和SoundBank文件一同部署到目标平台,但程序只需加载.bnk文件,不需要管理.wem文件。

远程流媒体


如果Wwise自带的底层I/O不能满足项目的具体需求,项目可以自行实现。比如,要以流媒体形式读取远程SoundBank,那么程序员可以实现为在线流播放的底层I/O。官方SDK集成演示中也包括阻塞(类名关键字Blocking)和异步(类名关键字Deferred)I/O的例程。

关于底层I/O,详见官方SDK帮助文档章节。

环境效果


集成了空间定位之后,还可以在游戏地图中指定几何区域,当听者或者游戏对象进入特定区域后,可以编程触发设计师准备好的环境效果比如混响,并可以在多个区域效果间做出混合,创造可信的声学环境模拟。详见官方SDK帮助文档章节。

线、面、体发声体


河流、湖泊和大型机械需要比点声源更复杂的声音效果,AK:SoundEngine::SetMultiplePositions()这个API可以帮助实现这些几何上呈现为线、面、体的发声体。

详见官方SDK帮助文档章节。


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值