[情報] 使用 Unity 開發 MOBIUS FF 事例

看板GameDesign (遊戲設計)作者 (什麼....)時間10年前 (2015/04/20 11:02), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串1/2 (看更多)
於前陣子舉辦的 Unite 2015 Tokyo 大會上 SQUARE ENIX 社的 Leader Programer 濱口直樹 向開發者分享了使用 Unity 5 開發手機遊戲 "MOBIUS FINAL FANTASY" 遇到的問題和處理方式 參考資料: 巴哈報導: http://gnn.gamer.com.tw/2/113632.html 簡報PDF: http://tinyurl.com/mjvqadl 魯蛇小弟我用 google 翻譯 將相關的內容盡量翻成中文了 雖然裡面有一堆翻譯錯誤 還是希望能分享給各位大大 (可搭配參考上面的參考資料) //============================= // 1. 在 Unity 上開發規模較大遊戲時的心得 //============================= * 開發規模較小和較大的遊戲,有什麼地方是完全不同? 同個檔案會同時被更多人修改到 * 多人同時編輯的範例 以一個攻擊動畫的時間軸為例子 和下個 motion 的 blend motion section 擊中判定 plan 跳躍時的音效 sound section 餘光特效 (trigger) effect section * Unity 不適合多人同時編輯檔案 沒辦法同時讓多人修改 *.scene 和 *.prefab 檔 * 為了在 Unity 上實現多人編輯所作的事 可以在 Inspector 上建立 Asset 之間的關聯 (每個 section 拆成各自的 prefab, 再用一個 array 存他們的 reference 避免大家一起變成同一份prefab ?) * 藉由 Hook Server 來更新定義相依關係的 prefab Motion Plan > 版本管理 > Hook Effect 工具 < Server Sound 有人送交資料上去後, 版本管理工具會讓 Hook Server 更新 attack.prefab Hook Server 會處理他們之間的依賴關係 並自動送交最新的 attack.prefab 資料 因為 Unity 檔案的參考 以 meta 檔裡面的 guid 作為依據 是故即使不用 UnityEditor, 靠自製工具建構 prefab 資料也不會太難 (在google上打 "hook + svn" 之類的 就會看到相關文章了) * 在 Hierarchy 上的可讀性較低的問題 結果還是自己寫了 editor tool 除了需以一覽方式確認各人負責的 prefab 內容 也為了大幅改善製作效率 放棄了在 Hierarchy 和 Inspector 上設定內容 而用專門的 Timeline tool 來開發 在 C# 參考設定加入 UnityEditor.dll 然後就可以用 UnityEditor.AssetDatabase 對 Asset 作讀寫的動作了 (這段不太確定XD) * MOBIUS 的開發環境 略 * MOBIUS 的資料確認流程 各人負責的 prefab v v 送交 v 版本控制工具 v v 通知 Hook Server v Hook Server v v 處理依賴關係的 prefab v 更新後的內容會送交回去 v 版本控制工具 v v 一定時間後會收集相關資料 v 交由另外的 Server 去編譯 AssetBundle v AssetBundle Build Server v v 以 console 模式啟動 UnityEditor v 編譯 MOBIUS 的內容約需 3 小時 v 完畢後就會上傳到 v Game Server 的儲存空間 v Game Server v v 下載資料後, v 就可以開始遊戲了 v Android & iOS //============================= // 2. 在手機平台上開發高品質遊戲的心得 //============================= * Unity 慢吞吞的原因 需了解 C# (Mono 2.0) 的特性 分配 heap 記憶體會增加 GC 的頻率 struct -> stack memory class -> heap memory 注意字串處理 class 和 enum 的 toString() 效能不好 foreach 會在 heap memory 生成 enumerator 增加 GC 的頻率 認真處理向量運算時 效能會很吃緊 在適當的地方考慮用 native code 在 Assets/Plugin 放 dll 就可以簡單呼叫 native code elif UNITY_ANDROID [DllImport("libNativePlugin")] private static extern void updatePhysicsBone(IntPtr data, float delta); elif UNITY_IPHONE [DllImport("__Internal")] private static extern void updatePhysicsBone(IntPtr data, float delta); endif 兩者之間的資料傳遞用 Marshal.AllocGlobal(size) 用 C# coding 還是比較簡單 考慮使用的時機用不同方案處理 開發效率才會高 (MOBIUS 在 IK 和物理晃動上使用) * 先了解敵人在哪裡 APP 使用的 Memory 量 iOS: 350 ~ 600 MB Andriod: 400 ~ 1100 MB 相比 Andriod 高端機種搭載 2 ~ 3 GB 的記憶體 iPhone 高端機只有 1 GB Andriod 和 iPhone 在記憶體管理上完全不同 Andriod app 以 Java 運作 一般都會預留較多記憶體以防止 GC 發生 不過因為 Unity 是用 Mono 的緣故 所以 iOS 也必須擔心 GC 的問題...? 因為在同等規格下 iOS 比 Andriod 的效能更好 如果 APP 在兩個平台都想推出, 先開發 Andriod 比較不會出問題 * 接下來要考慮 download size 最近在家機平台上FF系列的容量 FFXV 體驗版: 5 GB LRFF: 10 GB 第一次執行所需的下載資料量 (實際產品可能會不同) ================================ iOS Andriod ================================ Package 70 MB 40 MB ================================ first DL 350 MB 500 MB (低) (品質可選) 700 MB 1 GB (高) ================================ 為了縮減資料量, 使用壓縮版的 AssetBundle * 貼圖格式會影響資料大小 iOS Andriod =================== 不透明貼圖 RGB PVRTC RGB ETC 透明貼圖 RGBA PVRTC RGBA ETC2 部分 Andriod GPU 不支援 ETC2 考慮到該類 GPU 需載入 含 alpha 通道的貼圖時 也有人直接用 RGBA 16 bit 考慮一張 2048x2048 的貼圖 PVRTC 4bit 2 MB ETC2 8bit 4 MB RGBA 16bit 8 MB RGBA 32bit 16 MB (有 mipmap 的話再乘 1.33) 可知貼圖格式對容量影響非常大 * 針對不同的 GPU 選擇最適合的貼圖格式 不同 GPU 有各自適合的貼圖格式 (吃不了的好像就變RGBA了) =============================== PowerVR RGB PVRTC 4bit RGBA PVRTC 4bit =============================== Adreno RGB ATC 4bit RGBA ATC 8bit =============================== Mali RGB ETC 4bit RGBA 32bit (size減半) =============================== Mali RGB ASTC 6x6 (3.6bpp) (T600後) RGBA ASTC 4x4 (8bpp) =============================== Tegra DXT1 (4bpp) DXT5 (8bpp) =============================== 使用正確的貼圖格式可以 減少顯示記憶體的損耗 加快載入速度 較少程度的畫質劣化 判斷使用的機型時: SystemInfo.deviceModel UnityEngine.iOS.Device.generation * 但設計人員只想管理一份資料 管理多份貼圖很麻煩... 想針對每個 GPU 輸出適合的貼圖 又不想管理一堆貼圖資料 * 雖然 Unity 可以指定輸出的貼圖格式... 貼圖設定上只有一個選擇格式的欄位 iOS 可以直接選 PVRTC 沒問題 但 Andriod 沒辦法一次產出各種格式的貼圖 * 藉由 Asset Bundle Build Server 來處理 為了製作適合各種 GPU 的 AssetBundle 準備 10 台以上的 Build Server 每台 Server 分別且持續的 製作對應各種貼圖格式的 AssetBundle 如果在 Unity 裡修改 Texture2D 的 TextureFormat 會導致貼圖的快取資料需要重建 在 Unity 要製作 AssetBundle 之前 先用自己寫的 Script, 將圖片檔案的 meta 檔裡的, textureFormat 等數值換掉, 再呼叫 Unity 直接編譯 AssetBundle 這樣在 Build Server 這邊 就可以省掉建立快取資料的時間 提升 AssetBundle 的生成速度 * 讓 Shader 在一開始就編譯好 因為目標平台的 GPU 版本不同 沒辦法事先在 AssetBundle 編譯 Shader 資料 應用程式讀到 Shader 資料時 會立刻編譯,但這時會花很多時間 先將會用到的 Shader 集中起來 一開始就載入這個 AssetBundle 之後讓其他 AssetBundle 依賴它 就可以省下每次都要編譯的問題 ( 可參考: http://tinyurl.com/mr7l3jb ) //============================= 遊戲影片: https://youtu.be/0GlVAlyNi0I
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.12.151 ※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1429498959.A.4BA.html

04/20 11:44, , 1F
實用!
04/20 11:44, 1F

04/20 13:09, , 2F
受益良多
04/20 13:09, 2F

04/20 13:52, , 3F
04/20 13:52, 3F
文章代碼(AID): #1LD6nFIw (GameDesign)
文章代碼(AID): #1LD6nFIw (GameDesign)