Multithreading 如何解决FlasCC中巨大的pthread内存开销?

Multithreading 如何解决FlasCC中巨大的pthread内存开销?,multithreading,actionscript-3,memory,pthreads,flascc,Multithreading,Actionscript 3,Memory,Pthreads,Flascc,我们已经有了大量的代码库编译并开始在FlasCC中运行。当您刚刚打开.swf时,播放器的内存使用量约为300MB。它或多或少是好的,因为它看起来仍然有大约300 MB的动态分配内存可用于C++代码。p> 当我们创建线程时,问题就开始了,每个线程在内存中复制.swf并在沙箱中运行。这是否意味着每个pthread都会占用播放器打开.swf时使用的~300MB内存 似乎是这样。我已经完成了生成pthread和转储内存使用(flash.system.system向我们报告的内容,以及CModule.ra

我们已经有了大量的代码库编译并开始在FlasCC中运行。当您刚刚打开.swf时,播放器的内存使用量约为300MB。它或多或少是好的,因为它看起来仍然有大约300 MB的动态分配内存可用于C++代码。p> 当我们创建线程时,问题就开始了,每个线程在内存中复制.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_调试器已退出(崩溃),且没有任何错误消息

这基本上意味着我们没有线程。在启动2个线程之后,只有50MB的内存可以用于C++代码。 AdobeScout对内存使用情况进行了更深入的分析。下面是当.swf使用2个后台线程运行时它报告的内容:

在生成这两个空闲pthread之后,“Other”块已从11 MB膨胀到800 MB。记忆进入了“其他玩家”和“未分类”


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

< P>如果你考虑AS3的工作服API,你就有能力通过任何SWF文件来执行。 大多数示例(在AS3中)建议传递当前的SWF字节,然后使用类似于
Worker.current.isPrimordial的方法来决定该做什么

因此,虽然我不认为您可以避免这样一个事实,即您将拥有与线程一样多的播放器实例,但一个更好的方法是使其不会像主SWF那样回收那么多内存


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

是的,我考虑过从不同的模块生成Worker。这意味着我们应该去掉和隔离由独立的FLASCC目标中的后台线程运行的所有C++代码。从代码模块化的角度来看,这是一种好方法,但如果需要在不同假设下编写的大型C++代码库上,那么它将带来大量的工作。所以我希望有一些神奇的技巧来避免重写所有的东西。