我一直在为我正在考虑构建的游戏进行一些快速原型设计。我想做的主要事情之一是生成瓦片类型地图的地图。在生成地图时,我最终使用了大量的内存。我正在将地图构建为随机整数数组以进行测试。当我尝试生成大规模闪存的地图时,出现内存不足错误:
Error: Error #1000: The system is out of memory.
我已经想到我可以写入文件来解决这个问题。但有人知道实际的最大尺寸吗?我尝试四处寻找但无果。
活动监视器报告 ADL 正在使用大约 500MB“实际内存”和大约 700MB“虚拟内存”。 System.privateMemory 属性似乎与“实际内存”值匹配。
顺便说一句,我正在 OSX Snow Leopard (64) 中使用 8GB 内存进行开发
编辑:
这是我正在运行的示例测试
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 运行此脚本时,我得到大致相同的内存使用读数(我知道无论如何都会有所不同)。然而,不变的是字节数组的最终长度:
浏览器(火狐):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
我的测试方法可能并不完美,尽管我不知道如何进行更深入的分析。
从 Windows 7 和 AIR 3.3 开始,Adobe AIR 应用程序的内存分配限制为 1GB 左右。一旦 Adobe AIR 成为 64 位,这种情况就会改变。 Adobe 计划对该平台进行 2 次不同的重写。第一次重写将于 2012 年底进行。这次重写将为 Flash、AIR 运行时添加多线程。第一次重写可能不会解决现有的内存分配问题和限制。但第二次重写肯定会在 2013 年进行,代号为“Next”。这次重写就是“ActionScript 4.0”,其中包括 64 位运行时、内存分配增强、编程语言增强、新编译器以及性能的巨大改进。在此之前,请勿尝试分配超过 900MB 的 RAM,以免冒着应用程序在没有警告的情况下简单崩溃的风险。
没有提供任何细节,但我的直觉是,您遇到的问题不是缺乏内存(您的系统有足够的内存),而是算法不理想和/或有缺陷。您可能需要重新考虑生成地图的方式,并确保您不会在某个地方陷入无限循环。
如果您发布更多详细信息(可能在另一个问题中)也许我们可以提供更多帮助。
不确定您是否已经了解了这一点,但您可以使用属性
System.totalMemory
来获取 Flash 此时使用的内存量的实时读数(Flash Player/adl 的所有实例,因此请注意如果您打开浏览器并播放 Flash 内容)
链接:http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/System.html#totalMemory
它可能有助于在屏幕上的文本字段中显示使用的内存,或者在调试时将其添加到监视列表中,以准确找出哪些类/方法正在消耗所有内存!您还可以读取总内存并设置断点,以便在程序达到某个阈值时停止程序。
它也可能有助于仅生成一张足够大的地图来容纳屏幕上的内容,并在玩家朝某个方向移动时生成更多的领土并剔除出界的领土。这种剔除形式在 3D 游戏中很流行,可以消除看不见的几何图形,但也有助于解决海量地图和有限内存的问题。
我最近调查了这个问题,确实似乎存在内存阈值(取决于平台,而且似乎尤其是操作系统),之后 AIR 应用程序将变得无响应/崩溃。 (不过我没能得到内存不足错误#1000)。我在这里打开了一个 Adobe bug:https://tracker.adobe.com/#/view/AIR-4198476。希望我们很快就能从 Adobe 获得更多信息。
探索附近的CSL Plasma中心及其营业时间,以方便捐献血浆。全国范围内有许多地点,捐赠既方便又方便。通过为挽救生命的治疗做出贡献,帮助挽救生命,同时为您的时间赚取补偿。加入我们的捐助社区并产生积极影响。找到离您最近的 CSL Plasma 中心,查看他们的营业时间,今天就开始做出改变!