運用 Emscripten 移植遊戲 (中)

你是資深的 App 開發者,手上已有一堆酷炫遊戲了嗎?在看完《運用 Emscripten 移植遊戲 (上)》一文之後,緊接著來看看好用的工具與第三方函式庫!


 

經 Emscripten 移植之後的 FTL 主選單。可注意到「Quit」按鈕消失了。且此版本的 UI 極類似 iPad 版本的 UI。

 

好用的除錯工具

UBSan

在 Linux 上進行編譯的第二個理由,就是能搭配多種好用的工具。先說說「Undefined Behavior Sanitizer (UBSan)」。UBSan 具備 Clang 編譯器的特性,並添增了執行期間 (Runtime) 檢查功能,可在你的程式碼內抓到 C/C++ 未定義清楚的行為。這些抓出來的未定義行為中,最重要的就是找出未對齊的資料載入。C/C++ 的標準定義中,已正確對齊的指標 (Pointer) 內容才能存取。可惜的是,x86 處理器就是會執行未對齊的載入,所以現有的大多數程式碼都不會特別檢查記憶體是否對齊。而當此現象發生時,ARM 處理器則往往會讓你的程式當掉。也因為如此,預先針對行動裝置進行編譯比較好。而對 Emscripten 來說,未對齊的載入並不會立刻當機,但反之會默默跑出錯誤的結果。

UBSan 4.9 版本開始用於 GCC 之中。但未來的 5.0 版本才會納入未對齊載入的檢查功能 (Unaligned load sanitizer)。

 

AddressSanitizer

在 Clang (以及 GCC) 中第二種有用的工具就是 AddressSanitizer。此執行期間檢查工具,也會驗證記憶體的存取作業。在已配置緩衝區 (Allocated buffer) 之外的讀\寫作業,在任何平台都會造成當機,而對 Emscripten 將造成更嚴重的情形。原生程式具有大型的位址空間,內含大量的空位。無效的讀取作業 (特別是只超過緩衝區一點點) 就可能佔用一組有效位址,因此不會立刻或根本不會造成當機。但 Emscripten 的位址空間較為有限,所以無效的存取也可能影響到重要資料,甚至完全超出已配置的位址空間之外。如此就會造成意外的當機,也極難以進行除錯。

 

Valgrind

第三個工具「Valgrind」不需額外更改程式碼,就能於執行期間動態檢查多個屬性。就我們的使用情形來說,最好用的還是「Memcheck」與「Massif」。Memcheck 就是類似 AddressSanitizer 的記憶體驗證工具 (Validator),但可找出些許不同的問題,另可找出記憶體洩漏 (Memory leaks) 之處。Massif 就是記憶體分析工具 (Profiler),可協助找出記憶體使用過量的原因。而與桌機或行動裝置相較,因為 Emscripten 屬於記憶體受限的平台,也並未內建記憶體分析工具,所以此工具也極為有用。

Valgrind 也具備其他檢查工具,如 DRD 與 Helgrind 即可檢查多執行緒的問題。但因為 Emscripten 並不支援執行緒,這裡也就不再贅述。如果你習慣在桌機使用多執行緒,那當然還是對你頗有助益。

Valgrind 並不支援 Windows 環境,往後可能也不會支援。這個理由應該就夠讓你將遊戲移植到其他平台了。

 

第三方函式庫

大多數的遊戲都會使用許多第三方函式庫。希望你已經擺脫封閉函式庫而不用了。但即使是開放源碼的函式庫,也往往是以「已編譯完畢」的函式庫釋出。Emscripten 目前尚未能完全支援這類函式庫,因此開發者必須自行編譯。Emscripten 物件格式即以 LLVM 位元組碼 (Bytecode) 為基礎,只能說目前還不夠穩定。任何預先編譯的函式庫,均可能無法繼續用在 Emscripten 的未來版本中。

雖然 Emscripten 可支援動態連結,但仍尚未完善並建議避免。

而要解決這些問題的最好方法,就是撰寫自己的函式庫並作為標準建構程序的一部分,再靜態連接這些函式庫。若打包這些函式庫並在連結時載入,你可能會遇到出乎意料的問題。如果所有原始碼都是你建構系統的一部分,則更改編譯器參數會比較輕鬆。

只要上述問題都解決了,你就可以真正透過 Emscripten 開始編譯。如果你在使用 MicroSoft 的 Visual Studio 2010,也能嘗試整合模組。如果你在使用 Emscripten 以「wrapper」形式一同釋出的「cmake」(也就是 emcmake) ,就可自動設定你的版本。

如果你所使用的版本系統,必須等你決定是否設定完畢,那一般來說可交由 CC=emcc 與 CXX=em++ 完成作業。你可能必須移除特定平台的選項,如 SSE 與類似的東西。

 


 

看到這裡,你應該知道有哪些好用的工具與第三方函式庫了。即將上刊的《運用 Emscripten 移植遊戲 (下)》會說明 Emscripten 本身並分享幾組好用的程式碼,請隨時注意我們分享的文章!

 

 

原文連結:Porting to Emscripten

 

 

0 則回應

[限時免費] 史上最貴 APP 限時免費,現賺台幣 12900!(USD399)I am Rich! [限時免費] 史上最貴 APP 限時免費,現賺台幣 12900!(USD399)I am Rich! 2 個月前
[Note 8搶開箱] 台版 Samsung Galaxy Note 8 開箱,看看盒中有什麼?(Note 8 unboxing) [Note 8搶開箱] 台版 Samsung Galaxy Note 8 開箱,看看盒中有什麼?(Note 8 unboxing) 3 個月前
華為 AI 行動計算平台 Kirin 970 新一代 Mate 手機將率先搭載 華為 AI 行動計算平台 Kirin 970 新一代 Mate 手機將率先搭載 3 個月前
心跳失速! ZenFone 4 孔劉列車 北、高同步啟動!捕捉「野生孔劉」買手機送 ZenPower 還可抽親筆簽名手機 心跳失速! ZenFone 4 孔劉列車 北、高同步啟動!捕捉「野生孔劉」買手機送 ZenPower 還可抽親筆簽名手機 3 個月前
三星Note 8 購買優惠整理 – 一般消費者與 VIP (Note 7 用戶) 優惠彙整 三星Note 8 購買優惠整理 – 一般消費者與 VIP (Note 7 用戶) 優惠彙整 3 個月前
[投票] 想看什麼顏色的 Note 8 開箱?阿輝的新機顏色給你選擇 [投票] 想看什麼顏色的 Note 8 開箱?阿輝的新機顏色給你選擇 3 個月前

熱門文章

最新消息