为什么我无法在 chrome/edge/Firefox 上预加载任何大小超过 10 MB 的.data 我使用了 set_target_properties(test.js PROPERTIES LINK_FLAGS "--preload-file ../folder") 文件夹的大小 > 10 MB。该文件夹有 dat 文件,但即使使用 --use-preload-plugins,它也能与 png 一起使用
环境:emscripten 1.39.16/Linux(wsl 20.04)
test.js:1 Uncaught RangeError: offset is out of bounds
at Uint8Array.set (<anonymous>)
at processPackageData (test.js:1)
at test.js:1
at XMLHttpRequest.xhr.onload (test.js:1)
file_packager.py model.data --preload ../folder --js-output=model.js 的替代方法 后来添加了一些运行时函数 FS_createPath、addRunDependency、getMemory 但遇到了同样的错误。
var ptr = Module['getMemory'](byteArray.length);
Module['HEAPU8'].set(byteArray, ptr);
file_packager.py
有大小大于 256 MB 的条件,如果我打包 250+MB 目录,我确实会收到该条件
# TODO: sha256sum on data_target
if start > 256 * 1024 * 1024:
print('warning: file packager is creating an asset bundle of %d MB. '
'this is very large, and browsers might have trouble loading it. '
'see https://hacks.mozilla.org/2015/02/synchronous-execution-and-filesystem-access-in-emscripten/'
% (start / (1024 * 1024)), file=sys.stderr)
包装适用于所有类型的尺寸
警告:文件打包程序正在创建 468 MB 的资源包。这是非常大的,浏览器可能无法加载它。
set(EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} --use-preload-plugins -s WASM=1 -s TOTAL_MEMORY=1024MB")
-> 不工作
wasm 默认堆内存为 16 MB。
我使用了错误的 cmake 选项。
1GB 内存的正确选项:
set(CMAKE_CXX_FLAGS "-s TOTAL_MEMORY=1024MB")
更新为 2024 年。(TOTAL_MEMORY 已过时)
add_compile_options(-sINITIAL_HEAP=0KB -sINITIAL_MEMORY=1024MB)