Galgame (視覺小說) 核心數據:劇情腳本(文本/指令)、音樂/音效、圖片/立繪/CG/背景。特點:文件數量大、體積大、讀取頻繁、需支持加密/打包防竊取。
| 方案 | 優點 | 缺點 | 典型引擎/案例 |
|---|---|---|---|
| 自定義二進制包/資源包 (如 .arc, .pak, .dat, 自定義格式) | 讀取快(索引+偏移)、易加密混淆、整合單文件發布、支持增量更新、跨平台一致 | 需開發打包/解包工具、調試不便、修改需重打包 | Kirikiri (Z/XP3), NScripter (NSC), 多數商業引擎 |
| SQLite 數據庫 | 結構化查詢強(腳本分支/標籤)、ACID 事務、單文件、支持索引、現成 API | 二進制大對象(BLOB)存儲圖片/音頻效率低、文件膨脹、並發寫入鎖爭用、不如自定義包適合大媒體文件 | Ren'Py (部分), 部分國產引擎 |
| 文件系統直讀 (明文目錄結構) | 開發調試極簡、修改即時生效、無打包步驟 | 資源裸露易竊取/修改、發布文件數極多(萬級)、加載需遍歷目錄、跨平台路徑分隔符問題 | 早期開發階段、極小型項目 |
| 混合方案 (腳本/配置用 SQLite/JSON, 媒體文件用自定義包) | 結合優勢:腳本靈活查詢、媒體高效讀取、核心資源保護 | 架構較複雜、雙維護成本 | 成熟商業項目常見 |
ch01.pak, common.pak),支持按需加載、減少內存佔用。
// 伪代碼接口
interface IResourceLoader {
byte[] loadScript(String scriptId); // 加載腳本數據
InputStream openAudio(String audioId); // 流式讀取音頻 (解碼器需支持流)
BufferedImage loadImage(String imgId); // 解碼圖片 (需異步加載避免卡頓)
void preloadChapter(int chapterId); // 預加載下一章資源
void unloadChapter(int chapterId); // 卸載無用資源
}
結論:SQLite 適合結構化數據 (腳本邏輯、存檔、配置),不適合大量媒體文件存儲。自定義資源包是 Galgame 媒體資源的標準解法。兩者結合,分層處理,才是專業選擇。