實作遊戲 App 的熱更新功能

hot-fix-mechanism

寫遊戲這麼久,第一次在遊戲 App 上實作「熱更新」功能。

所謂熱更新,我想大致上可分成兩個層次:

  1. 僅下載圖片、音源等素材檔案,藉由設定檔等方式,無需更新程式碼即可使用新素材檔。目的在於大幅縮減初始 app bundle 的檔案尺寸,使玩家更快更容易下載遊戲。
  2. 除了下載素材檔案以外,亦須下載程式邏輯檔案,目的在於繞過 App Store 審查。正所謂「有 Bug 堪修直須修,莫待 Apple 審核過」,以前的經驗是,經常修好了要命臭蟲後,等待審核過卻是等到「花兒也謝了」,玩家也跑光了。修臭蟲的時效性是關鍵所在。

以工程師的觀點來看,可將「熱更新」功能分解為下列幾個步驟:

  1. 實現 HTTP 下載檔案功能
  2. 檢查本地端與伺服器端的檔案版號
  3. 依下載進度呈現進度條與數字
  4. 程式碼檔案須能區分 32/64 bits
  5. 程式碼與素材檔,支援多重讀檔路徑
  6. 下載完畢後,重新載入圖片等素材檔案
  7. 下載完畢後,重新載入程式碼(Lua 限定)
  8. 檢查檔案正確性,並更新本地端版號

以下詳述各步驟的做法。

Continue reading 實作遊戲 App 的熱更新功能

如何建置給 iOS 使用的 LuaJIT 靜態函式庫

參考了網路上的一些文章和自己的嘗試,以及解決不同函式庫間的衝突,甚至還嘗試用最新的 Visual Studio 無功而返後,最後總算讓 LuaJIT bytecode 能順利在 arm64 及各種 iOS 裝置上運行無誤了。

為何使用 LuaJIT?

  1. LuaJIT 的效能比官方版 Lua 更好。
  2. 為了將遊戲程式碼編譯為 bytecode。

我原先嘗試使用 Lua 官方版 source code 建置出來的 luac,結果一試才發現在 Mac 上編譯後的 lua scripts,在 iOS 裝置中載入檔案時,會產生 incompatible bytecode error。雖然有其他的解決方法,但實行起來都有不少困難,所以我就想不如來使用 LuaJIT 試試看吧。

測試結果:藉由 luajit 可正確編譯 lua scripts 為二進位格式,並且在 iOS 專案連結 LuaJIT 靜態函式庫後,編譯後的 scripts 也可以成功地被載入執行了。

建置 LuaJIT for iOS 的步驟

  1. 產出可和專案連結的 .a 檔。
  2. 產出可以在電腦上使用的 luajit 檔。
  3. 用 luajit 來編譯 Lua 檔並可於實機上執行無誤。

詳細步驟如下:

第一步:建置靜態函式庫時需要產生出 armv7、armv7s、x86_64、i386、arm64 五個 slice,才可讓所有 iOS 裝置以及 iOS 模擬器都能連結 LuaJIT 建置。

第二步:用 i386 版本的 luajit 產生 arm 32-bits bytecode。用 x86_64 版本的 luajit 產生 arm64 bytecode。

為何「x86_64 luajit 可以產出 arm64 bytecode」依然是個謎,然後我也沒有設定 LUAJIT_ENABLE_GC64 竟然就可以用了。如果有人了解運作原理的話,還請不吝指教。

第三步:把兩種版本的 bytecode 包進 app 中,執行時偵測裝置是否為 arm64,去決定載入 Lua bytecode 的路徑。對,app bundle 中需要將 32/64 bits 兩份 bytecode 一起打包進去。

雖然在 iOS 上不能真的 JIT,但是可以用 LuaJIT 還是有不少幫助,至少幫我解決了原先頭痛的跨平台編譯 Lua source 的問題。

# 建置 i386 版本
make CC="gcc -m32 -arch i386" clean all

# 建置 x86_64 版本
make CC="gcc -m64 -arch x86_64" clean all

# 建置 armv7 版本
ISDKF="-arch armv7 -isysroot $ISDK/SDKs/$ISDKVER"
make HOST_CC="gcc -m32 -arch i386" TARGET_FLAGS="$ISDKF" TARGET=arm TARGET_SYS=iOS

# 建置 armv7s 版本
ISDKF="-arch armv7s -isysroot $ISDK/SDKs/$ISDKVER"
make HOST_CC="gcc -m32 -arch i386" TARGET_FLAGS="$ISDKF" TARGET=arm TARGET_SYS=iOS

# 建置 arm64 版本
ISDKF="-arch arm64 -isysroot $ISDK/SDKs/$ISDKVER"
make HOST_CC="gcc" TARGET_FLAGS="$ISDKF" TARGET=arm64 TARGET_SYS=iOS

建置完成後看到以下訊息表示正確無誤:

Architectures in the fat file: libLuajit.a are: armv7 armv7s i386 x86_64 arm64

完整程式碼請見:https://github.com/HalfLucifer/BuildLuaJIT_iOS

參考資料:

在紳士GAME尋求遊戲性是否搞錯了什麼(1):從《ランス03》談回合制戰鬥

rancethree_00

最近在某個機緣巧合下,遇到一位來自部落的神秘人士,交給我一款「紳士遊戲」《ランス03》,深情款款的對我說:「你玩玩看吧,或許會有些新想法。」於是在水深火熱的專案收尾工作之際,我仍花了些時間,在一週內把這款遊戲通關。

《ランス03》的遊戲長度並不算太長,加上練功打寶的時間,約莫十來個小時便可全破。紳士們應該知道,對於大部份的紳士遊戲來說,「遊戲性」並不是主要的賣點。甚至很多遊戲是「只求有就好」,做為劇情與劇情之間的緩衝者與調味劑,紳士們通常不會對於遊戲性過於苛求,因為遊戲的重點不在於玩法與遊戲性。

儘管如此,《ランス03》裡簡單易懂的回合制戰鬥玩法,讓我眼睛一亮,引起我進一步探究的興趣。

Continue reading 在紳士GAME尋求遊戲性是否搞錯了什麼(1):從《ランス03》談回合制戰鬥

【演講預告】如何毀滅一個遊戲開發團隊

我這輩子最愛的兩款遊戲其中之一,《Fallout 2》,遊戲裡有個令我印象深刻的角色––土人「蘇利克」(Sulik)。

fallout2_sulik

蘇利克,是個擅長使用近戰肉搏類型武器的可靠夥伴,有機會於遊戲前期加入主角的隊伍。在《Fallout 2》的戰鬥過程中,玩家只能操控主角,無法控制隊伍中其他夥伴的行動;玩家能做的就是給予他們合適的裝備與武器,讓他們自行發揮殺敵本事。

如果你給蘇利克一把藍波刀,他會迅速跑到敵人面前,身手靈活地揮舞刀子,割斷他的喉嚨。如果你給蘇利克一把重鎚,他不會使用,而是拿出刀子或甚至赤手空拳,用自己擅長的方式對付敵人。

如果你給他一把烏茲衝鋒槍,便會見到蘇利克毫不遲疑地拿出槍,站在敵人面前,瘋狂開槍掃射––不管前方是不是有自己隊伍的夥伴在。只要蘇利克的手上有槍,他必定能夠解決敵人,只不過結果經常是滿地敵人的屍體,外加其他夥伴被掃射到只剩下一半的屍體殘骸。

幹掉敵人,同時也做掉夥伴。

蘇利克是個有能力的夥伴嗎?是的。端看你如何讓他發揮長處。倘若你是團隊的領導者,你會給他小刀、重鎚、衝鋒槍,或是把他驅逐出隊伍?

Continue reading 【演講預告】如何毀滅一個遊戲開發團隊

【翻譯&心得】硬地必須學會愛上行銷

「誰他媽的有空閒去做那些事?」

那些在獨立遊戲開發者間常見的抱怨,正是使用社群媒體––Twitter、Facebook、Google+、Tumblr 等等––為他們的遊戲獲得曝光這件極為耗費時間的事情。這種挫敗感的根源在於:「我正在做這些,是因為我想要做遊戲,為什麼我非得去做那些超級無敵耗費時間、又不是在做遊戲的事情?讓我把時間花在做遊戲上!」

而開發者們的怒氣,往往歸咎於 Steam、App Store 與 Google Play。彷彿如果 Valve、Apple 和 Google 可以把他們該做的工作做好––修好他媽的「可被探索性」(Discoverability),開發者們就能專心致力於打造優秀遊戲,而不用去攪和什麼鬼市場行銷的爛泥巴了。

「修復可被探索性」,是個值得玩味的詞。它涵蓋了現今許多遊戲開發者文章的基礎論點:意指目前的「可被探索性」處於「壞掉的狀態」,必須要有某人來修理它、搞定這件事。這個信仰,廣泛流傳於許多硬地與百萬富翁之間。

Rob Pardo,那位接近傳奇的遊戲界大神,如神諭般地提出警告:「如果這些平台擁有者不搞定這個問題的話,終將會有人踩進來修理它,並且把他們的午餐搶走。」他認為「修復可被探索性」是必然會發生之事,因為它已經壞掉了,而修好它將會帶來破壞性的優勢。

我了解這種感受從何而來。在無邊廣闊的「內容海洋」中,即使你只是想找出其中最精美優良的遊戲、書籍、歌曲或其他創作物,幾乎是他媽的不可能。所有的東西都淹溺於泥沼之中。這些作品想向上浮起、冒出頭來,變成巨大的成功,機率等同於中樂透頭獎。

當現實如此可怖時,想當然爾,必定會有人跳出來搞定它,讓世界變得更美好,不是嗎?

Continue reading 【翻譯&心得】硬地必須學會愛上行銷

薛西佛斯的石頭

sisyphus-stone-and-albert-camus

自從 2010 年離開遊戲公司至今,約莫四年半的時間,在這段期間裡,我和我的夥伴們先後開發完成《藥水行動》、《邦妮的早午餐》、《邦妮早午餐2》與《勾玉忍者》四款手機遊戲。另外我也到各學校機構進行 50 多場演講,並出版了《半路叛逃:App遊戲製作人的1000日告白》一書。

看似完成了不少事情,但真正要到今年,2014 年為止,我才真切擁有踏上創業之路的真實感。

比如那個爬山的關卡,我半夜一點鐘調關卡,一步一蹣跚,爬幾步你倒下了,我調了三四十遍,就是調你走多遠倒下。那時候我自己一邊玩一邊哭,為什麼?我就覺得這個遊戲跟我開發遊戲的過程是很相似的,因為遊戲開發一開始都是可能的,覺得一切都美好,直到中途某個階段你發現,好像時間來不及了,不可能做出這樣的遊戲,或者發現一開始相信正確的東西其實不行了,就是有一個轉折。轉折以後,有各種各樣的問題你要克服,真的是很慘,我覺得每個遊戲到最後開始發行之前,都特別辛苦,有各種各樣的問題。因為開發時間長,你也失去一種自我感覺,你也不知道到底好還是不好,你只是在做這件事。

––《Journey》遊戲設計師,陳星漢

出處:http://youxiputao.com/articles/1527

時間回到 2013 年底,完成《勾玉忍者》免費下載版的改版後,銷售成績仍不見起色,無法為我們帶來多少實質收入。我心裡很清楚,後續如果沒有金錢資助的話,猴子靈藥團隊就到此為止了。我們已經任性花費三年的時間來證明自己的能耐,結果沒有成功。

這段旅程,看樣子無法繼續下去了。

Continue reading 薛西佛斯的石頭

回不去的遊戲人生

每天早上八點出門,上班工作,直到晚上九點。好累的生活。回到家後,只想當個廢人賴在床上,不想做任何有建設性的事情。更別說是要坐在電視或電腦前了。

上一次購買盒裝遊戲是什麼時候?早就記不起來了。說實在的,我好懷念以前在大學讀書的時候,常和朋友們通宵達旦接力玩遊戲破關的感覺。

沒想到自己會變成這種大人哪。以前還天真的以為,會像這樣一直玩遊戲到老,永遠不會改變。如今卻只能利用每天搭捷運、上廁所的零碎時間,滑滑手機遊戲而已。

雖然不像從前,有很多的時間能仔細鑽研遊戲,但現在的手遊不知怎麼回事,所謂的 RPG 幾乎全變成了自動遊戲?點點點,建築升級。等等等,戰鬥結束。已經有點搞不清楚,到底是我在玩遊戲,還是遊戲在玩我?

不是我不喜歡看劇情對白,而是那些故事內容,總是千篇一律。勇者打敗魔王、英雄拯救世界,半點新鮮感也沒有。這些所謂的劇情,只是剝奪了我僅剩不多的遊戲時間,沒有任何意義。

雖然免費下載很好,也曾花了幾千塊只為抽到期間限定的紫卡,但是在海量的免費遊戲中,一款換過一款,簡直就像免錢吃到飽餐廳,最後根本不知道自己吃了什麼下肚。生理是滿足了,精神卻很空虛。

不知什麼緣故,好像已經找不回以前的感動了?究竟是懷念以前那些美好的遊戲時光,還是在緬懷一去不復返的青春小鳥?

越過山丘  雖然已白了頭
喋喋不休  時不我予的哀愁
還未如願見著不朽
就把自己先搞丟

即使如此,心裡還是有所期待。希望能找回以前玩遊戲的驚喜與樂趣。不管是免費或付費都好,哪怕只有一點點也行。所以我偶爾會像今天一樣,看看熱門排行榜,逛逛遊戲網站,期望能找到那個令自己心情激盪的「什麼」⋯

Continue reading 回不去的遊戲人生

《勾玉忍者》Android 版於 Google Play 正式上架!

繼先前於 4 月 1 日公開備受矚目的手機遊戲新作《來自部落的你》之「歐葛就要愛」後,台灣獨立遊戲開發者團隊猴子靈藥,再度以迅雷不及掩耳的速度推出《勾玉忍者》Android 版本。

《勾玉忍者》Android 版免費下載:https://play.google.com/store/apps/details?id=com.monkeypotion.jadeninja

去年於 iOS 平台推出的橫向捲軸動作過關類型忍者遊戲《勾玉忍者》,經過玩家們的熱烈推坑與開發者不眠不休的加班爆肝後(?),終於在不是用 Unity 製作的情形下竟然還是順利做完 Android 版本,並且於 Google Play 正式上市。

Continue reading 《勾玉忍者》Android 版於 Google Play 正式上架!

遊戲新作發表:《來自部落的你》

沈寂許久後,2014年,猴子靈藥團隊全員出動,夙夜匪懈全力打造一款前所未見、無比創新的手機 App 遊戲。

為您,隆—!重—!獻—!上—!!!

《來自部落的你》之「歐葛就要愛」

 

 

OgreMustLove_ch01

媲美鐵打尼號的史詩級愛情故事

OgreMustLove_ch02

奇幻系戀愛模擬養成遊戲

OgreMustLove_ch03

Continue reading 遊戲新作發表:《來自部落的你》

寫給半路上的流浪者

「如果一開始已預知結局,你是否仍會選擇踏上旅途?」

jade-ninja-unepic-fail

2013,對我來說,是個苦痛遠大於喜悅的一年。

這一年裡,終於實現夢想,到美國參加 Game Developer Conference,也去了新加坡參與 Casual Connect Asia。在 GDC 的最末一日,我獨自一人,頹坐在通道中的椅子上,兩眼空洞,試圖整理思緒。朋友恰巧經過看見我,問我怎麼了,我卻不知該如何回答他。

勾玉忍者》,即使曾在東南亞 13 個國家的 App Store 上,被精選為「Best New Games」與「Made in Taiwan Games」之一,但很遺憾,我們仍然走不出亞洲,踏不進日本,更穿不透美國。

Continue reading 寫給半路上的流浪者