為 Wwise 2021.1 構(gòu)建插件 | 第 1 部分:背景和目標(biāo)

大家可能不知道,Wwise 生態(tài)系統(tǒng)其實(shí)具有很強(qiáng)的可擴(kuò)展性。有時(shí),各公司要為其項(xiàng)目構(gòu)建定制的插件,供應(yīng)商會(huì)將自研插件遷移到 Wwise。對(duì)此,我們必然要提供相應(yīng)的支持。新的 Wwise 版本很快就會(huì)發(fā)布。屆時(shí),我們將首次對(duì)原有系統(tǒng)實(shí)行全面改進(jìn)。
在本系列博文中,我會(huì)探討為 Wwise 構(gòu)建插件的各種方案,并對(duì)新的 API 做簡(jiǎn)要的介紹。
第 I 部分:背景和目標(biāo)
第 II 部分:插件剖析
第 III 部分:構(gòu)建插件
第 I 部分:背景和目標(biāo)
插件對(duì) Wwise 來(lái)說(shuō)至關(guān)重要。藉此,聲音設(shè)計(jì)師可根據(jù)項(xiàng)目需要靈活運(yùn)用各種效果器和音頻源。目前,Wwise Launcher 中提供有很多可供選擇安裝的插件。除此之外,Wwise 內(nèi)部還嵌入了二十多款捆綁插件。與此同時(shí),音頻社區(qū)用戶也在不斷為 Wwise 開(kāi)發(fā)新的插件。
每個(gè)插件都包含兩個(gè)部分:聲音引擎部分(捆綁在產(chǎn)品的可執(zhí)行文件中)和設(shè)計(jì)工具部分(允許根據(jù)自身需要進(jìn)行設(shè)置)。

開(kāi)發(fā)背景
在過(guò)去 15 年中,我們不斷完善用來(lái)構(gòu)建插件的系統(tǒng),并與設(shè)計(jì)工具和聲音引擎緊密集成。事實(shí)上,插件的結(jié)構(gòu)和函數(shù)已被廣泛地用于各種內(nèi)部功能的構(gòu)建。
這顯然是一把雙刃劍。一方面,它意味著系統(tǒng)緊密集成,所有路徑都經(jīng)過(guò)了優(yōu)化。同時(shí),也使得我們很難對(duì)內(nèi)部結(jié)構(gòu)進(jìn)行必要的重構(gòu)和修改。不過(guò),雖然沒(méi)有辦法更改內(nèi)部結(jié)構(gòu),但是并不妨礙統(tǒng)合插件接口,以此來(lái)實(shí)現(xiàn)版本之間的兼容。
這對(duì)聲音引擎來(lái)說(shuō)尚且行之有效,畢竟產(chǎn)品需要高效、快速地運(yùn)行。但對(duì) Wwise 設(shè)計(jì)工具而言就成為了一種負(fù)擔(dān),因?yàn)樗袞|西都要基于 Windows API 來(lái)構(gòu)建。
時(shí)代變遷
我們的宗旨是能夠支持所有平臺(tái),但設(shè)計(jì)工具端并沒(méi)有做到這一點(diǎn)。對(duì)于聲音引擎端,我們團(tuán)隊(duì)一直在為支持新的 SDK 和平臺(tái)努力,同時(shí)設(shè)法向產(chǎn)品用戶提供必要的修復(fù)和改進(jìn)。要是覺(jué)得自己產(chǎn)品的支持矩陣龐大,不妨看看我們的編譯機(jī)來(lái)對(duì)比一下!然而,對(duì)于設(shè)計(jì)工具端,多年來(lái)客戶一直滿足于 Windows 版本以及移植的 Mac 版本。
我們?cè)絹?lái)越清楚地認(rèn)識(shí)到,接下來(lái)有必要著力加強(qiáng)跨平臺(tái)兼容性。15 年前,我們最先為 Xbox 和 Windows PC 平臺(tái)提供了支持。所以,直接選擇與 Windows 緊密集成肯定會(huì)更容易一些。不過(guò),這些年來(lái),互聯(lián)網(wǎng)越來(lái)越發(fā)達(dá),游戲開(kāi)始流媒體化,開(kāi)發(fā)者轉(zhuǎn)而使用 Linux 作為后端服務(wù)器。與此同時(shí),智能手機(jī)操作系統(tǒng)被 iOS 和 Android 完全占據(jù),Mac 重獲昔日輝煌,成了首選的創(chuàng)作平臺(tái)。有鑒于此,單一的平臺(tái)代碼庫(kù)已經(jīng)無(wú)法滿足當(dāng)下需求。
對(duì)編程語(yǔ)言來(lái)說(shuō)同樣如此:據(jù) TIOBE 榜單統(tǒng)計(jì),C++ 的使用率從高達(dá) 16% 降到了 6%,新的編程語(yǔ)言(如 R)不斷涌現(xiàn),Python 成了很多業(yè)內(nèi)人士的不二之選。要知道,即便是使用 C++ 15 編寫(xiě)的代碼在 C++ 17 中都不兼容。編程方法也是如此:曾幾何時(shí),Microsoft Project 的 Waterfall 管理法被奉為圭臬。目前 Scrum 開(kāi)發(fā)法在很多公司的文化中根深蒂固,但單元測(cè)試法已然越來(lái)越受到青睞。另一方面,Apple 有自己的 CPU,但 Microsoft Visual Studio 可為 Apple 設(shè)備生成代碼,甚至可在 Mac 上運(yùn)行。幾經(jīng)思慮,我們最終選用了射線追蹤法。畢竟,大部分用戶的 CPU 都至少有四個(gè)核心。15 年中真的可以發(fā)生很多變化??!

循序漸進(jìn)
四年前,我們開(kāi)始設(shè)法消除問(wèn)題的根源,而不是僅僅著眼于表層的修復(fù)。不過(guò),更改 12,000 個(gè)文件中的 220 萬(wàn)行 C++ 代碼 (2017) 并不是件容易的事。這需要時(shí)間和投入。光是插件代碼現(xiàn)在就包含了上百個(gè)函數(shù),其中很多在第一個(gè)版本之后就沒(méi)再碰過(guò)。在保證生產(chǎn)穩(wěn)定性的前提下,所有改動(dòng)都要慢慢落到實(shí)處,同時(shí)避免修復(fù)帶來(lái)不良影響。
舉個(gè)簡(jiǎn)單的例子:設(shè)計(jì)工具代碼大多采用寬字符,也就是每個(gè)字符對(duì)應(yīng)兩個(gè)字節(jié)。這最終會(huì)反映到我們的插件中。另外,寬字符在 Windows 上為兩個(gè)字節(jié),而在 Mac 上是四個(gè)字節(jié)。所以,不同平臺(tái)上的結(jié)果和代碼是不一樣的。在過(guò)去四年里,UTF-8 的優(yōu)勢(shì)越來(lái)越明顯,并逐漸成為跨平臺(tái)開(kāi)發(fā)的標(biāo)準(zhǔn)選擇。為此,我們開(kāi)始將很多基礎(chǔ)架構(gòu)遷移到 UTF-8。這一改進(jìn)在 2019.1 和 2019.2 版本中就已初見(jiàn)成效。當(dāng)然,未來(lái)還有很長(zhǎng)的路要走。
再來(lái)舉個(gè)例子:原有的 WwiseCLI 可執(zhí)行文件負(fù)責(zé)在后臺(tái)運(yùn)行整套圖形界面,其目前仍允許使用現(xiàn)在的命令行來(lái)運(yùn)行 Wwise。該圖形界面與 Windows 緊密集成。經(jīng)過(guò)兩年的重構(gòu),其被分為了跨平臺(tái)邏輯部分和 Windows GUI 部分。最終,我們?cè)?2019.1 中對(duì) WwiseCLI 實(shí)施了全面改進(jìn)?,F(xiàn)在其會(huì)運(yùn)行整個(gè)邏輯部分,而不單單是命令行前端。不過(guò)我們并沒(méi)有就此止步,而是選擇了繼續(xù)改進(jìn)和更新代碼,直到在 2019.2 版本中將其替換為了 WwiseConsole。?
新舊兼顧
在 2019.2 中,新插件的構(gòu)建慢慢提上日程。在避免對(duì)用戶產(chǎn)生不良影響的前提下,我們一邊開(kāi)發(fā)設(shè)計(jì)工具一邊開(kāi)始發(fā)布新一代插件。雖然插件都很簡(jiǎn)單,不過(guò)仍然值得欣慰!在收集有關(guān)穩(wěn)定性的反饋時(shí),我們發(fā)現(xiàn)基本上沒(méi)什么反饋!這說(shuō)明原有插件和新的插件之間并沒(méi)有明顯區(qū)別(甚至性能都差不多)。不過(guò)有些功能比較慢,而且全部都是橋接的。當(dāng)然,這也意味著在插件中實(shí)現(xiàn)功能要容易很多,而且可以輕松提升 Wwise 設(shè)計(jì)工具的性能。
自 2019.2 以來(lái),我們一直在同時(shí)為原有插件和新的插件提供支持。有必要的話,以后也會(huì)如此。

新的 API
未來(lái)展望
距離與設(shè)計(jì)工具一起構(gòu)建的第一個(gè)插件版本已經(jīng)有十五年多了。相信即便再過(guò)十五年,這個(gè)版本在 Wwise 設(shè)計(jì)工具中一樣能用。確保長(zhǎng)久適用才是最重要的,插件接口總是在變會(huì)很難辦。
在其他各個(gè)方面,我們也是這么做的。
普遍適用
在 Wwise 支持的所有平臺(tái)上,插件代碼應(yīng)該是完全一樣的。不過(guò),誰(shuí)又能知道設(shè)計(jì)工具體驗(yàn)將來(lái)會(huì)如何演變呢?在啟動(dòng)跨平臺(tái)項(xiàng)目的時(shí)候,我們想保留原生的 Mac 和 Windows 可執(zhí)行文件,希望能盡快構(gòu)建相應(yīng)的圖形界面。最初,我們覺(jué)得不妨構(gòu)建一個(gè)沒(méi)有圖形界面的版本。在獲得初步結(jié)果之后,發(fā)現(xiàn)早期采用者希望在 Linux 上也能生成 SoundBank。除此之外,最好能更加緊密地集成到 Unreal 和 Unity 中,并通過(guò)命令行、無(wú)外設(shè) WAAPI 服務(wù)器提高生成效率。不過(guò),手持設(shè)備的功能會(huì)不斷增強(qiáng),誰(shuí)也不知道以后到底會(huì)怎樣。
活用語(yǔ)言
正如前面所說(shuō),C++ 只是插件開(kāi)發(fā)當(dāng)中可用的眾多語(yǔ)言之一。如今,越來(lái)越多的人希望能夠使用多種編程語(yǔ)言來(lái)構(gòu)建插件。隨著 2021.1 的發(fā)布,我們甚至?xí)槍?duì)聲音引擎提供使用 Python 運(yùn)行的示例代碼!因?yàn)?,我們不希望插件受到限制?!安寮?yīng)當(dāng)選用最適合的語(yǔ)言來(lái)構(gòu)建”,這一點(diǎn)對(duì) C++ 和其他語(yǔ)言來(lái)說(shuō)依然適用。
為此,新的設(shè)計(jì)工具插件采用了 C 基礎(chǔ)架構(gòu),無(wú)論是在 ABI 還是 API 方面都很穩(wěn)定。即便是對(duì)于新的版本,不管插件采用哪種語(yǔ)言構(gòu)建,整個(gè)接口都能確保穩(wěn)定性。借助現(xiàn)代化元編程橋接技術(shù),我們可以輕松而高效地構(gòu)建 C++ 插件。

簡(jiǎn)化用例
為了使功能得到擴(kuò)展,聲音引擎插件不可或缺。不過(guò),最好能避開(kāi)設(shè)計(jì)工具端來(lái)構(gòu)建整個(gè)插件。實(shí)現(xiàn)方法有好幾百種,關(guān)鍵在于通過(guò)構(gòu)建管線盡量簡(jiǎn)化用例。
向后兼容
顯然,如果想對(duì)插件實(shí)行所有這些改進(jìn),插件供應(yīng)商肯定要做大量的工作。不過(guò),我們會(huì)盡可能地做到無(wú)縫過(guò)渡。這也是我們保留原有插件的原因:雖然不是最好的選擇,而且插件無(wú)法跨平臺(tái)兼容,但至少只需使用最新的 2021.1 SDK 便可重新編譯插件,而且直接在 Windows 上就能運(yùn)行。
對(duì)今后的版本來(lái)說(shuō)也是如此:只要設(shè)置所需的 SDK 版本,并使用最新版本來(lái)向后編譯,即可確保接口盡可能地兼容。
由于向后兼容最終會(huì)成為負(fù)擔(dān),這些臨時(shí)橋接肯定是要移除的。但是只要不引發(fā)問(wèn)題,我們會(huì)一直提供支持。
首先要移除的是原有橋接,因?yàn)槠洳恢С挚缙脚_(tái)兼容。不過(guò)對(duì) 2021.1 來(lái)說(shuō),并不需要任何修復(fù)。

靈活擴(kuò)展
因?yàn)榇a會(huì)繼續(xù)使用并在版本之間過(guò)渡,所以我們要逐步對(duì)接口實(shí)施各種改進(jìn)(比如添加、修改和移除)。舉個(gè)非常簡(jiǎn)單的例子:在 2021.1 中,目前尚無(wú)可用的跨平臺(tái) GUI,因?yàn)槲覀儨?zhǔn)備先對(duì)設(shè)計(jì)工具做調(diào)整。另外,有些插件類(lèi)型(如轉(zhuǎn)碼和分析插件)理論上可由第三方供應(yīng)商來(lái)做,但是這些目前還無(wú)法實(shí)現(xiàn)。
充分測(cè)試
如此多的變動(dòng)可能會(huì)引起恐懼、不安和懷疑。多年的努力實(shí)屬不易,我們只想把事情做好。不妨把 Wwise 設(shè)計(jì)插件工具部分當(dāng)做其他插件的試金石。沒(méi)準(zhǔn)兒我們會(huì)在此基礎(chǔ)上對(duì)聲音引擎實(shí)施改進(jìn)。不是沒(méi)有這個(gè)可能。
大家可能不知道,Wwise 生態(tài)系統(tǒng)其實(shí)具有很強(qiáng)的可擴(kuò)展性。有時(shí),各公司要為其項(xiàng)目構(gòu)建定制的插件,供應(yīng)商會(huì)將自研插件遷移到 Wwise。對(duì)此,我們肯定要提供相應(yīng)的支持。新的 Wwise 版本今年稍后就會(huì)發(fā)布。屆時(shí),我們將首次對(duì)原有系統(tǒng)實(shí)行全面改進(jìn)。

米歇爾?多奈斯 (MICHEL DONAIS)
高級(jí)軟件開(kāi)發(fā)工程師
Audiokinetic
米歇爾?多奈斯 (Michel Donais) 負(fù)責(zé)統(tǒng)領(lǐng) Audiokinetic 的 Integration 團(tuán)隊(duì),他擁有 20 多年的軟件開(kāi)發(fā)經(jīng)驗(yàn),致力于發(fā)掘突破創(chuàng)新的新興音樂(lè)和技術(shù)。除此之外,他還對(duì)電影拍攝、黑膠樂(lè)評(píng)、花道教學(xué)等有著濃厚的興趣。
