game engine我用来运行我的 game在浏览器中运行 lua 并在我的游戏中使用正常的 fopen/write/fclose 保存文件。引擎C/C++代码通过emscripten编译为JS。让这些文件写入最终存储在本地存储或浏览器缓存位置中的其他位置的好方法是什么?我搜索了网络并查看了文档,但信息非常稀疏,我还没有找到任何明确的答案来说明它是如何工作的。
游戏引擎的先前贡献者在 emscripten 构建中添加了一个 js 库,该库将覆盖 fclose
以回调 JavaScript。但这个 fclose 覆盖似乎不再被调用,它根本不包含在最终的 .js 文件中。
最佳答案
Emscripten 文件系统 API 使用 IndexedDB 涵盖您的案例。
这是Filesystem API overview 。它有四种类型:
MEMFS
: volatile 内存存储。这是运行时安装在/
的默认文件系统类型。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
});
);
}
Here is a more detailed example来自 Emscripten 存储库。
关于emscripten - 如何使用 emscripten 将文件从 C 保存到浏览器存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54617194/