Emscripten:IDBFS 的 RAM 效率是否高于 MEMFS?
Emscripten: is IDBFS more RAM efficient than MEMFS?
我正在使用 emcc --preload-file
命令为我的 WebAssembly 游戏打包数据,该命令将其放入 MEMFS 并保存在 RAM 中,直到网页关闭。
游戏通常会打开一个文件,读取它的内容,然后关闭它,并且再也不会触及该文件,它没有使用 mmap
。
在首次启动时将所有游戏数据下载到 IndexedDB / Emscripten IDBFS 会不会更节省内存? Web 浏览器是否将整个 IndexedDB 加载到 RAM 中,它是否在关闭 IDBFS 中的文件后释放 RAM?
我的目标硬件是 iPhone XS 上的 Safari,内存为 2GB,游戏数据约为 60 MB。
正如您所提到的,MEMFS 是一个内存中的“文件系统”,它可以在任何浏览器中运行。 IndexedDB 是一个合适的数据库,它的最佳用例是存储大量数据(超过 RAM 可以容纳的数据)。
第一次加载应用程序或网站时,通常需要进行大量 API 调用、身份验证和其他工作。每次打开应用程序时都这样做并不是最佳选择,因此 IndexedDB 可以用作加速重复访问的一种方式。这样,最新的应用程序状态可以存储在 IndexedDB 中,然后应用程序可以在后台同步(参见 stale-while-revalidate)。
如果您认为您的游戏可以从中受益,那么您可以考虑使用它。如果您认为您也可以这样做,那么 MEMFS,但是,我建议您这样做,因为 IndexedDB 有一些细微差别。
在 IOS 上的 safari 的特定情况下,您不能将 blob
存储在 IndexedDB 中。但是,您可以将 blob
转换为 ArrayBuffer
,但您还必须将 MIME 类型与缓冲区一起存储以便正确进行转换(因为 ArrayBuffer
不有 MIME 类型,但 blob
有)。
写入 IndexedDB 中的存储也可能会失败。发生这种情况的原因有多种。也许用户正在使用私有模式,或者他们没有足够的磁盘 space.
如果用户清除了 phone 上的缓存,IndexedDB 数据也可能会被清除。您可能需要处理这个问题。
我在过去使用 IndexedDB 时 运行 遇到过其中一些错误,这可能会让人头疼。我会推荐 Memfs。
至于 IDBFS 的实现细节,它可能会或可能不会跨浏览器和平台保持不变。然而,我可以肯定地说的是,除非您在第一个应用程序中保存了大量需要计算的数据,否则请尝试分析 memfs,如果它运行良好,那么您可以坚持使用它。
我认为接受的答案没有强调有关 Emscripten 的 IDBFS 的重要技术细节。
IDBFS 是 MEMFS 之上的附加层,具有通过 syncfs 调用添加的持久性功能。
所有文件系统内容都存在于内存中,并且可以选择在使用前从 IndexedDB 加载(通过调用 syncfs(true, ...)
)and/or 在使用后保存到 IndexedDB 中(syncfs(false, ...)
)。
在当前的实现中,您无法通过使用 IDBFS 来阻止额外的内存使用。 IDBFS就像一个可以同步from/into持久化存储的ramdisk。它不像直接挂载持久存储。
我正在使用 emcc --preload-file
命令为我的 WebAssembly 游戏打包数据,该命令将其放入 MEMFS 并保存在 RAM 中,直到网页关闭。
游戏通常会打开一个文件,读取它的内容,然后关闭它,并且再也不会触及该文件,它没有使用 mmap
。
在首次启动时将所有游戏数据下载到 IndexedDB / Emscripten IDBFS 会不会更节省内存? Web 浏览器是否将整个 IndexedDB 加载到 RAM 中,它是否在关闭 IDBFS 中的文件后释放 RAM?
我的目标硬件是 iPhone XS 上的 Safari,内存为 2GB,游戏数据约为 60 MB。
正如您所提到的,MEMFS 是一个内存中的“文件系统”,它可以在任何浏览器中运行。 IndexedDB 是一个合适的数据库,它的最佳用例是存储大量数据(超过 RAM 可以容纳的数据)。
第一次加载应用程序或网站时,通常需要进行大量 API 调用、身份验证和其他工作。每次打开应用程序时都这样做并不是最佳选择,因此 IndexedDB 可以用作加速重复访问的一种方式。这样,最新的应用程序状态可以存储在 IndexedDB 中,然后应用程序可以在后台同步(参见 stale-while-revalidate)。
如果您认为您的游戏可以从中受益,那么您可以考虑使用它。如果您认为您也可以这样做,那么 MEMFS,但是,我建议您这样做,因为 IndexedDB 有一些细微差别。
在 IOS 上的 safari 的特定情况下,您不能将 blob
存储在 IndexedDB 中。但是,您可以将 blob
转换为 ArrayBuffer
,但您还必须将 MIME 类型与缓冲区一起存储以便正确进行转换(因为 ArrayBuffer
不有 MIME 类型,但 blob
有)。
写入 IndexedDB 中的存储也可能会失败。发生这种情况的原因有多种。也许用户正在使用私有模式,或者他们没有足够的磁盘 space.
如果用户清除了 phone 上的缓存,IndexedDB 数据也可能会被清除。您可能需要处理这个问题。
我在过去使用 IndexedDB 时 运行 遇到过其中一些错误,这可能会让人头疼。我会推荐 Memfs。
至于 IDBFS 的实现细节,它可能会或可能不会跨浏览器和平台保持不变。然而,我可以肯定地说的是,除非您在第一个应用程序中保存了大量需要计算的数据,否则请尝试分析 memfs,如果它运行良好,那么您可以坚持使用它。
我认为接受的答案没有强调有关 Emscripten 的 IDBFS 的重要技术细节。
IDBFS 是 MEMFS 之上的附加层,具有通过 syncfs 调用添加的持久性功能。
所有文件系统内容都存在于内存中,并且可以选择在使用前从 IndexedDB 加载(通过调用 syncfs(true, ...)
)and/or 在使用后保存到 IndexedDB 中(syncfs(false, ...)
)。
在当前的实现中,您无法通过使用 IDBFS 来阻止额外的内存使用。 IDBFS就像一个可以同步from/into持久化存储的ramdisk。它不像直接挂载持久存储。