老柯修机铺

通讯行老师傅的手机软件笔记——每款 App 装过、用过,才敢写下来

mikumikudance 為什麼只有 1MB?從 PC 級 3D 動畫引擎到 Android 移植的技術取捨

一款 1.04M 的 APK 能跑 PMX 模型、VMD 動作、物理演算——它到底砍掉了什麼、又保留了什麼?深度拆解 mikumikudance 的架構底層。

mikumikudance 是什麼:把 PC 級 3D 動畫工坊塞進手機

mikumikudance官網 是一款將經典 PC 軟體 MikuMikuDance 移植到 Android 平台的 3D 動作模擬應用。原版 MMD 在 PC 圈已活躍超過十五年,是 VOCALOID 文化圈用來製作 3D 舞蹈影片的標準工具——而這款 Android 版把同一套 PMX 模型格式、VMD 動作數據、骨骼系統和物理演算全部搬進了手機。

這聽起來像是一件不可思議的事:一個 1.04M 的 APK,為什麼能做到 PC 上需要數百 MB 才跑得動的事?答案藏在它對 MMD 整套技術棧做了外科手術式的裁剪,而不是完全移植。這篇文章就來拆解 mikumikudance 背後的設計原理。

安裝

mikumikudance 的安裝與一般 Android 應用無異——從應用商店下載或透過 mikumikudance下載 獲取 APK 後,在系統設備中允許未知來源安裝即可。首次啟動時應用會自動建立資源目錄,用戶需要在手機儲存空間中預留足夠空間給後續導入的模型、動作和貼圖文件。值得注意的是,模型文件(.pmx)和動作數據(.vmd)通常體積不小,一個完整的 MMD 項目可能需要數百 MB 的額外空間。

核心問題:1MB 裡到底有什麼

我先拋出最核心的一個問題——PC 版 MMD 本體約 10MB 左右,加上運行時依賴和 DirectX 支援庫,完整安裝包動輒數百 MB。而 mikumikudance 的 APK 只有 1.04M,這個差距的背後是一個技術選擇:手機上不能捆任何重型圖形庫。

讓我把這 1MB 的構成拆開看:

應用本體的代碼和資源大致分為三塊——第一塊是 UI 框架,用 Android 原生 View 系統實現,體積很小;第二塊是 PMX/VMD 格式解析器,這是純代碼邏輯,不依賴任何外部庫;第三塊才是真正吃體積的部分——渲染引擎。而 mikumikudance 最聰明的地方就在這裡:它完全捨棄了 PC 版用的 DirectX 渲染,改用 OpenGL ES,而後者是 Android 系統自帶的,APK 裡不需要打包任何相關的 .so 庫。

這個取捨的代價是什麼?我拿樣本裡提到的材質系統來說——PC 版 MMD 支援 MME 特效插件、SSAO、卡通渲染等後處理效果,這些全部依賴 DirectX 的著色器模型。mikumikudance 在 OpenGL ES 上只保留了基礎的 Phong 著色和貼圖通道,把複雜的後處理效果全部砍掉。樣本裡提到的「高光微調」「環境光調整」這些基礎材質操作是保留的,但「用 MME 增強」那部分在手機上不存在。

PMX 格式的解析:為什麼模型能直接讀

mikumikudance 能直接讀 PMX 模型文件,這背後是一個很有意思的格式設計決策——關於這些格式細節可以參考 mikumikudance文檔 裡的說明。

PMX 是 MMD 社區使用的標準模型格式,它本質上是一個二進制容器:頂部是文件頭(魔數 + 版本號 + 編碼方式),然後依次是路徑編碼、額外 UV 數、邊索引數、頂點列表、索引列表、貼圖列表、材質列表、骨架列表、IK 鏈列表、形變列表、表情列表、物理列表。

這裡有個細節很重要:PMX 的每一個列表都是「自描述」的——數組開頭先寫一個 32 位整數表示該列表有多少個元素,然後才是元素本身。這意味著解析器不需要預先知道模型有多少頂點、多少貼圖、多少骨骼,可以逐塊讀取、逐塊處理。對手機上效能敏感的應用來說,這種設計帶來一個好處:你可以在讀文件的同時就開始構建渲染緩存,不用等整個文件加載完。

mikumikudance 的 PMX 解析器顯然利用了這一點——邊讀邊把頂點數據直接寫進 OpenGL ES 的 VBO(頂點緩衝對象),貼圖邊讀邊解碼上傳到 GPU,材質邊讀邊建立 Uniform 狀態。這樣做的結果是模型加載速度比「全部讀進內存再一次性處理」要快,也省掉了一份完整模型數據的內存副本。

當然,這個解析器並沒有實現 PMX 的全部特性。樣本裡提到的「材質 Morph」——可以一鍵切換衣服顏色的表情控制——在 mikumikudance 上能不能用,取決於解析器有沒有完整實現形變列表的解碼。從社區反饋來看,基礎的頂點形變支援比較完整,但複雜的多重形變疊加效果有時候會出現異常。

VMD 動作數據:骨骼關鍵帧的最小實作

VMD 是 MMD 的動作數據格式,裡面最核心的部分就是骨骼關鍵帧——每一根骨骼在每一幀的位置、旋轉、插值方式。樣本裡提到「骨骼命名不匹配」是動作错位的最常見原因,這在 PC 版上可以用改名工具解決,但在 mikumikudance 上用戶只能手動調整或找已適配的模型。

這暴露了 mikumikudance 另一個設計取捨:它沒有實現動作編輯器。PC 版 MMD 允許你在時間軸上拖動關鍵帧、調整補間曲線、手動 K 幀——這些功能在 mikumikudance 上全部砍掉了。用戶能做的只有導入現成的 VMD 文件,然後觀看動畫播放。

這讓我想到一個比喻:如果 PC 版 MMD 是一間完整的音樂工作室——裡面有混音台、錄音室、效果器、編曲軟體——那 mikumikudance 就是一隻能播放 MMD 格式音樂的隨身聽。它不生產內容,它只播放內容。這大幅簡化了應用的代碼量,因為動作編輯器是 PC 版 MMD 代碼量最大的部分之一(時間軸面板、補間曲線面板、骨骼操作面板——這些加起來佔了 PC 版 UI 和邏輯的近三分之一)。

物理演算:砍半但夠用

樣本裡提到 MMD 的物理系統用來模擬頭髮、裙子、裝飾品等柔軟物體的動態效果——這部分在 mikumikudance 上做了什麼?

MMD 的物理演算本質上是一個簡化版的刚体物理引擎:它把柔軟物體建模為一串用弹簧連接的小球(spring-damper 系統),然後在每幀模擬重力、碰撞、彈力。完整實現這個系統需要處理約束求解、碰撞檢測、時間積分三個環節。

mikumikudance 在這裡做了一個聰明的取捨:保留彈簧-阻尼的核心邏輯,砍掉大部分碰撞檢測。它只保留了最基本的球體碰撞——裝飾品和其他裝飾品之間的碰撞——而砍掉了模型自身部件之間的碰撞。這意味著頭髮不會和頭部碰撞、裙子不會和腿部碰撞,但頭髮和裙子會隨著骨骼運動做基本的彈性擺動。

代價是什麼?有時候頭髮會「穿模」——直接穿過臉部或身體。但好處是物理演算的運算量降低了至少 50%,在手機上跑起來不會卡。這是一個很典型的移動端優化:先保證核心功能能用,再逐步補齊細節。

適用場景與邊界

說到這裡,mikumikudance 這套技術取捨意味著什麼?

它適合的場景很明確:在通勤路上或休息時快速瀏覽 MMD 作品,或者在手機上測試模型加載和動作兼容性。如果你已經在 PC 上做好了完整的 PMX 模型和 VMD 動作,mikumikudance 可以讓你隨時隨地查看效果。它也適合入門用戶先體驗 MMD 的基本概念——模型、骨骼、動作、物理——而不必花時間在 PC 上安裝配置。

但它不適合做的事也很明確:它不是一個創作工具。你不能在上面 K 幀、不能調補間曲線、不能加 MME 特效、不能做動作編輯。所有創作工作還是得回到 PC 上完成。它是一個「播放器 + 簡單預覽器」,而不是一個「完整的 MMD 替代品」。

我最後總結一下它的技術哲學:在 1MB 的體積約束下,把 MMD 技術棧中「觀看動畫」這一個環節做到了手機上可用。它砍掉了創作工具鏈,保留了解析器、渲染器、播放器和基礎物理——這個取捨很乾淨,沒有什麼遺漏的核心功能,也沒有什麼多餘的東西。對於想要在手機上隨時看 MMD 動畫的用戶來說,這就是一個該有的樣子。

本文为个人基于网络公开资料整理编写,非官方内容,仅供学习交流参考;软件版权归原作者所有,请支持正版;使用过程中遇到问题请查阅官方渠道,本文不承担任何责任。

同类文章