multithreading - 如何解决 FlasCC 中巨大的 pthread 内存成本?

标签 multithreading actionscript-3 memory pthreads flascc

我们有相当庞大的代码库正在编译并开始在 FlasCC 中运行。刚打开 .swf 时,播放器的内存使用量约为 300MB。它或多或少很好,因为似乎仍有大约 300MB 的动态分配内存可供 C++ 代码使用。

当我们创建线程时,问题就开始了。 According to documentation ,每个线程都将 .swf 复制到内存中并在沙箱中运行。这是否意味着每个 pthread 都会占用播放器打开 .swf 所用的大约 300MB 内存?

好像是这样。我已经完成了生成 pthread 和转储内存使用情况的简单测试(flash.system.System 向我们报告的内容,以及 CModule.ram.length)。这是日志:

Starting 10 threads.
Memory usage: total=288MB private=335MB free=2MB CModule=33MB
Thread 0 started.
Memory usage: total=683MB private=732MB free=1MB CModule=36MB
Thread 1 started.
Memory usage: total=1071MB private=1121MB free=1MB CModule=37MB
Thread 2 started.
Memory usage: total=1459MB private=1510MB free=1MB CModule=38MB

此时 plash_player_debugger 已退出(崩溃),没有任何错误消息。

这基本上意味着我们没有线程。启动 2 个 pthread 后,只剩下约 50MB 的内存可用于 C++ 代码。

Adobe Scout 提供了更深入的内存使用情况分割。以下是 .swf 以 2 个后台线程运行时报告的内容:(a picture from the same question on Adobe forums)

在生成这 2 个空闲 pthread 后,“其他” block 已从 11 MB 膨胀到 800 MB。内存进入“其他玩家”和“未分类”。

所以主要问题是:如何解决这个问题?也许有办法让 AS3 worker 消耗更少的内存?

最佳答案

如果您考虑 AS3 worker API,您可以传递任何 SWF 文件来执行。

大多数示例(在 AS3 中)建议传递当前 SWF 字节,然后使用类似 Worker.current.isPrimordial 的内容来决定要做什么。

因此,虽然我认为您无法避免玩家实例与线程一样多的事实,但更好的方法是使 worker SWF a separate module不会回收与主 SWF 一样多的内存。

具体对于您的情况,我意识到这可能非常困难,因为您依赖于 Adob​​e 的 pthread 与工作人员的实现,这显然只是作为工作人员传入主 SWF 文件。此外,将使用线程的现有 C/C++ 代码库迁移到 AS3 worker 绝非易事。

关于multithreading - 如何解决 FlasCC 中巨大的 pthread 内存成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15371381/

相关文章:

java - 创建的 Runnables 的 lambda 的不同行为

actionscript-3 - "Warning: 1090: Migration issue"尽管显式注册了事件处理程序

macos - 在 OSX 上以编程方式确定物理内存大小

memory - cvShowImage和Kinect SDK的内存问题:骨架查看器

c - 将 2D 数组存储在 3D 数组中

android - 通过蓝牙发送对象或两个字符串?

java - 重新创建 ServerSocket 后我的 GUI 卡住

c++ - 如果另一个线程导致它在 Windows 上崩溃,我该如何延迟销毁我的进程?

apache-flex - 使类变量可用于外部 itemRenderer 类

flash - Flash 中的 'static void Main' 是什么?