Adobe AIR最多能利用多少内存?

12

我一直在为我想要制作的游戏进行快速原型设计。其中一个主要任务是生成一个瓷砖类型地图。在生成地图时,我最终会使用大量的RAM。我正在为我的测试构建一个随机整数数组作为地图。当我尝试生成大规模的地图时,Flash会提示内存不足错误:

Error: Error #1000: The system is out of memory.

我已经想到可以将内容写入文件来解决这个问题。但是有没有人知道实际的最大大小?我已经尝试搜索,但没有结果。

活动监视器报告ADL正在使用约500MB的“实际内存”和约700MB的“虚拟内存”。System.privateMemory属性似乎与“实际内存”值匹配。

另外一件事,我正在使用8GB RAM的OSX Snow Leopard(64位)进行开发。

编辑:

这是我正在运行的示例测试。

var ba:ByteArray = new ByteArray();
for(var i:uint = 0; i<100000000; i++)
{
    ba.writeInt(int(Math.random()*100));
}

trace("end", ba.length, System.totalMemory);

这个例子运行良好,之后总内存属性报告使用了约500MB的内存。 现在将目标值增加到400,000,000,最终收到“内存不足”错误。

注意:在Flash CS5.5中进行测试,超时时间设置为120秒(测试从未达到该时间)

编辑:

我已创建一个更好的测试例子:

var i:uint = 0;
var loopLength:Number = 500000000; // 500,000,000
var ba:ByteArray = new ByteArray();

for(i=0;i<loopLength;i++){
    try{ba.writeInt(1);}
    catch(e:Error){
        MEM_TI.appendText(e.message);
        break;
    }
}    

ba.position = 0;
MEM_TI.appendText("\nTM: "+System.totalMemory+" FM: "+System.freeMemory+" PM: "+System.privateMemory+" BALENGTH: "+ba.bytesAvailable/4);
当我从浏览器、独立调试器或AIR运行这个脚本时,我得到了大致相同的内存使用读数(我知道它们总是会有所不同)。然而,最终字节数组的长度却是恒定的:
浏览器(Firefox):TM: 540413952 FM: 19116032 PM: 562573312 BALENGTH: 134217728
独立调试器:TM: 540577792 FM: 1810432 PM: 545361920 BALENGTH: 134217728
AIR(2.6):TM: 5410816 FM: 1159168 PM: 551464960 BALENGTH: 134217728
我的测试方法可能不完美,但我不知道如何进行更深层次的分析。

抱歉,我去度假了。无论如何,从设计角度来看,你可能走错了方向。你需要那么大的地图干什么?如果你确实需要它,那就将其实现为稀疏地图(只分配具有实际内容的点),而不是完整的 5 亿点地图。 - jpop
嗨jpop,我的实际问题是生成地图数据,而不是渲染实际图形。我通过交错生成解决了对象大小的初始问题。虽然还不够快,但已经好多了:P - bigtallbill
1
我认为在AIR中没有硬性限制 - 操作系统决定何时发生此错误。但其他答案也是正确的 - 当您需要数据时,应找到一种生成或获取数据的方法,而不是尝试一次性将所有内容保存在内存中。 - fenomas
4个回答

2
自Windows 7和AIR 3.3以来,Adobe AIR应用程序的内存分配被限制在约1GB左右。一旦Adobe AIR变为64位,这将发生改变。Adobe计划对平台进行两个不同的重写。第一个重写将在2012年底完成。此次重写将向Flash、AIR运行时添加多线程功能。这个第一个重写可能无法解决现有的内存分配问题和限制。但是第二个重写肯定会解决,它将于2013年发布,代号为“Next”。这个重写是“ActionScript 4.0”,包括64位运行时、内存分配增强、编程语言增强、新编译器以及大幅提高性能。在那之前,请不要尝试分配超过900MB的RAM,否则应用程序可能会突然崩溃而没有任何警告。

4
你所说的很多内容都很有趣 - 你能否在回答中包含一些来源? - Marty
Adobe尚未正式宣布他们是否将ActionScript重写称为4.0。请访问http://www.rivellomultimediaconsulting.com/actionscript-4-revealed/以获取有关一些人如何称其为AS4的更多信息。 - FlashDictionary
谢谢,你帮我省了很多时间。在Windows 7上,当文件数量超过一定数量时,压缩内容会崩溃,这似乎就是原因。现在只能一个文件一个文件地处理,虽然速度慢了些,但不会崩溃。 - Mark

0

虽然没有提供详细信息,但我的直觉告诉我,你遇到的问题不是缺乏内存(你的系统有充足的内存),而是算法不够优化或存在错误。你可能需要重新考虑生成地图的方式,并确保你没有陷入无限循环。

如果你发布更多详细信息(可能在另一个问题中),也许我们可以提供更多帮助。


谢谢回复,最初我使用了一个数组来存储int值,但后来改用了ByteArray。您认为我是否遇到了Array/ByteArray对象本身的限制? - bigtallbill
ByteArray从内存/性能方面来说,肯定比包含整数的通用数组更好。你的地图的最大尺寸是多少?你确定代码中没有错误会导致数组变得太大,进入无限循环或类似的情况吗? - jpop
嗨,我已经更新了主要问题,并附上了我的测试细节。我仍然不确定ByteArray的最大大小,因为官方文档中没有提到。 - bigtallbill

0

不确定您是否已经了解,但您可以尝试使用属性System.totalMemory来玩弄Flash正在使用的内存量(所有Flash Player / adl实例),因此请注意如果您有一个带有Flash内容播放的浏览器打开)。

链接:http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/System.html#totalMemory

在调试时,将内存使用情况显示在屏幕上的文本字段中或将其添加到监视列表中可能会有所帮助,以找出究竟是哪些类/方法耗尽了所有内存!您还可以对totalMemory进行读数,并设置断点以在达到某个阈值时停止程序。

仅为屏幕上的内容生成足够大的地图,并在玩家向某个方向移动并剔除超出范围的领土时生成更多的领土,这也可能有所帮助。这种剔除形式在3D游戏中很受欢迎,可消除看不见的几何图形,但也有助于解决您的大型地图和有限内存问题。


谢谢回复,我已经更新了我的测试设置。没有其他正在运行的Flash实例。我编写了一个系统,仅加载显示所需的数据。但是,这些数据必须存在。目前,我的地图生成器是一个单独的元素。 - bigtallbill
这个链接有一篇帖子涉及类似的问题。据我所知,独立的flash播放器在使用内存方面没有限制。在浏览器中则是不同的情况,但此人似乎与flash播放器有相似的问题。显然,Linux中的FP10没有限制,但其他版本会达到某个点后停止增加。运行您的测试时,我的内存使用量最高达到900MB,但根据我的任务列表还有一些剩余空间。 - Josh Mohan
我已经运行了几个测试(如上所述),这些都在OSX上进行。明天晚些时候,我会在W7(64)上再次运行相同的测试。似乎我正在遇到ByteArray对象的某种限制,仍然找不到有关大小限制的Adobe实际文档。 - bigtallbill

0

我最近调查了一下这个问题,确实似乎存在一个内存阈值(取决于平台和操作系统,尤其是操作系统),超过这个阈值后,AIR应用程序将变得无响应/崩溃。(虽然我没有成功获得内存不足错误#1000)。我在这里打开了一个Adobe bug:https://tracker.adobe.com/#/view/AIR-4198476。希望我们很快能从Adobe那里得到更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接