Emscripten:如何从 16 MB 增加堆内存

问题描述 投票:0回答:2

为什么我无法在 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")

-> 不工作

emscripten
2个回答
0
投票

wasm 默认堆内存为 16 MB。

我使用了错误的 cmake 选项。

1GB 内存的正确选项:

set(CMAKE_CXX_FLAGS "-s TOTAL_MEMORY=1024MB")

0
投票

更新为 2024 年。(TOTAL_MEMORY 已过时)

https://emscripten.org/docs/tools_reference/settings_reference.html?highlight=environment#initial-memory

add_compile_options(-sINITIAL_HEAP=0KB -sINITIAL_MEMORY=1024MB)

© www.soinside.com 2019 - 2024. All rights reserved.