我用来在浏览器中运行我的game engine的game运行lua,从我的游戏中我使用普通的fopen / write / fclose保存文件。引擎C / C ++代码通过emscripten编译为JS。将这些文件写入最终放在本地存储或浏览器缓存位置中的其他一些文件的好方法是什么?我在网上搜索并查看了文档,但信息非常稀疏,我没有找到任何明确的答案,这应该如何工作。
游戏引擎的前一个贡献者在emscripten构建中添加了一个js库,它会覆盖fclose
以回调javascript。但是这个fclose覆盖似乎不再被调用,它根本不包含在最终的.js文件中。
Emscripten Filesystem API使用IndexedDB覆盖您的案例,但您可能需要添加除fopen
/ write
/ fclose
之外的一些代码。
这是Filesystem API overview。它有四种类型:
MEMFS
:易失性的内存存储。这是在运行时在/
上安装的默认文件系统类型。NODEFS
:这使用node.js fs api,这不是你的情况。IDBFS
:这使用了IndexedDB,您可以将它用于离线存储。WORKERFS
:这是为了在工人内部使用。您可以将IDBFS
与Emscripten自己的FS API一起使用(这是JavaScript端API)。您需要先安装它才能使用它。你可以使用FS.mkdir
,FS.mount
, and FS.syncfs
来实现它。这是C中的一个粗略示例:
#include <emscripten.h>
int main() {
// EM_ASM is a macro to call in-line JavaScript code.
EM_ASM(
// Make a directory other than '/'
FS.mkdir('/offline');
// Then mount with IDBFS type
FS.mount(IDBFS, {}, '/offline');
// Then sync
FS.syncfs(true, function (err) {
// Error
});
);
// Use fopen / write / fclose in C here.
int off_file = fopen('/offline/any_file');
...
// Don't forget to sync to make sure you store it to IndexedDB
EM_ASM(
FS.syncfs(function (err) {
// Error
});
);
}
来自Emscripten存储库的Here is a more detailed example。