我一直在为我正在考虑建造的游戏做一些快速原型制作。我想要做的主要事情之一是瓷砖类型地图的地图生成。在生成地图时,我最终使用了大量的ram。我正在为我的测试构建一个随机整数数组。当我尝试生成大规模闪存的地图时,会给出内存不足错误:
Error: Error #1000: The system is out of memory.
我已经想过我可以写一个文件来解决这个问题。但有人知道实际的最大尺寸吗?我试过四处寻找无济于事。
活动监视器报告ADL使用大约500MB“实际内存”和大约700MB“虚拟内存”。 System.privateMemory属性似乎与“实际内存”值匹配。
作为旁注,我正在开发OSX Snow Leopard(64),8gb ram
编辑:
这里是我正在运行的示例测试
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的ram。 现在将目标值增加到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 i获得大致相同的内存使用读数(我知道这种情况会有所不同)。然而,常量是字节数组的最终长度:
浏览器(火狐):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
我的测试方法可能并不完美,但我不知道如何进行更深入的分析。
答案 0 :(得分:2)
从Windows 7开始,AIR 3.3 Adobe AIR应用程序的内存分配限制在1GB左右。一旦Adobe AIR变为64位,这将改变。 Adobe计划对该平台进行2次不同的重写。第一次重写将在2012年底完成。这次重写将为Flash,AIR运行时添加多线程。第一次重写可能无法修复现有的内存分配问题和限制。但第二次重写肯定会在2013年推出,代号为“Next”。这次重写是“ActionScript 4.0”,它包括64位运行时,内存分配增强,编程语言增强,新编译器以及性能的巨大改进。在此之前不要尝试分配超过900MB的RAM,否则会在没有警告的情况下轻松崩溃。
答案 1 :(得分:0)
没有提供详细信息,但我的直觉是你所遇到的问题不是缺乏记忆(你的系统有足够的记忆),而是次优和/或错误的算法。您可能需要重新考虑生成地图的方式,并确保您不会在某个地方以无限循环结束。
如果你发布更多细节(可能在另一个问题中),我们可能会更有帮助。
答案 2 :(得分:0)
不确定您是否已经使用此属性,但您可以使用属性System.totalMemory
来获取当前Flash正在使用的内存量的实时读数(Flash Player / adl的所有实例) ,请注意,如果您打开浏览器播放Flash内容,请注意
链接:http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/System.html#totalMemory
显示屏幕上文本字段中使用的内存或在调试时将其添加到监视列表可能会有所帮助,以确切了解哪些类/方法占用了所有内存!您还可以读取totalMemory的读数并输入断点以在程序达到某个阈值时停止该程序。
也可能有助于仅为屏幕上的内容生成足够大的地图,并在玩家沿某个方向移动并剔除超出范围的区域时生成更多区域。这种形式的剔除在3D游戏中非常流行,可以消除看不见的几何图形,但也有助于解决大量地图和有限内存的问题。
答案 3 :(得分:0)
我最近对此问题进行了调查,实际上似乎存在内存阈值(取决于平台,似乎特别是在操作系统上),之后AIR应用程序将无响应/崩溃。 (虽然我没有设法获得内存错误#1000)。我在这里打开了一个Adobe错误:https://tracker.adobe.com/#/view/AIR-4198476。希望我们能尽快从Adobe获得更多信息。