Adobe AIR 可以使用的最大内存量是多少?
Posted
技术标签:
【中文标题】Adobe AIR 可以使用的最大内存量是多少?【英文标题】:What is the maximum amount memory Adobe AIR can utilize? 【发布时间】:2011-09-26 18:09:55 【问题描述】:我一直在为我正在考虑构建的游戏做一些快速原型设计。我想做的主要事情之一是为瓦片类型地图生成地图。在生成地图时,我最终使用了大量的内存。我正在将地图构建为我的测试的随机整数数组。当我尝试生成大规模闪存的地图时,出现内存不足错误:
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++)
tryba.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,我的实际问题是生成地图数据,而不是渲染实际图形。通过交错生成,我设法克服了对象大小的初始问题。仍然没有我想要的那么快,但是嘿:P 我认为 AIR 中没有任何硬性限制 - 操作系统决定何时发生此错误。但其他答案也是正确的——你应该找到一种在需要时生成或获取数据的方法,而不是试图一次将所有内容都保存在内存中。 【参考方案1】:我最近调查了这个问题,确实似乎存在内存阈值(取决于平台,而且似乎,尤其是在操作系统上),之后 AIR 应用程序将变得无响应/崩溃。 (虽然我没有设法得到内存不足错误#1000)。我在这里打开了一个 Adobe 错误:https://tracker.adobe.com/#/view/AIR-4198476。希望我们能尽快从 Adobe 获得更多信息。
【讨论】:
【参考方案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,否则应用会在没有警告的情况下简单地崩溃。
【讨论】:
你在这里说的很多东西都很有趣——你能在你的答案中包含一些来源吗? Adobe 尚未正式宣布是否调用 ActionScript rewrite 4.0。查看rivellomultimediaconsulting.com/actionscript-4-revealed 了解更多关于某些人如何称其为 AS4 的信息 谢谢你为我节省了大量时间。当文件超过一定数量时压缩内容在 Windows 7 上崩溃,这似乎就是原因。必须一次做一个文件。速度较慢但不会崩溃。【参考方案3】:不确定您是否已经使用此功能,但您可以使用属性System.totalMemory
来实时读取闪存当时正在使用的内存量(Flash Player/adl 的所有实例,所以请注意您是否打开了浏览器并播放了 Flash 内容)
链接:http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/System.html#totalMemory
它可能有助于在屏幕上显示文本字段中使用的内存,或者在调试时将其添加到监视列表中,以准确找出哪些类/方法正在占用所有内存!您还可以读取 totalMemory 并设置断点以在程序达到某个阈值时停止。
它也可能有助于仅生成一个足够大的地图以容纳屏幕上的内容,并在玩家朝某个方向移动并剔除超出范围的区域时生成更多区域。这种形式的剔除在 3D 游戏中很流行,用于消除看不见的几何图形,但也有助于解决大量地图和内存有限的问题。
【讨论】:
感谢您的回复,我已经用我的测试设置更新了问题。没有其他正在运行的闪存实例。我编写了一个系统,它只加载显示所需的数据。但是,这些数据必须存在。我的地图生成器目前是一个单独的元素。 这个link 有一篇处理类似问题的帖子。据我所知,独立的闪存播放器对其使用的内存量没有限制。在浏览器中是另一回事,但这个人似乎对 Flash 播放器有类似的问题。显然,Linux 中的 FP10 没有限制,但其他版本在某个点上会有所限制。运行你的测试我的上限为 900mb,但根据我的任务列表判断,我仍有一些空间。 我已经运行了几个测试(上面详述)这些都在 OSX 上。明天晚上晚些时候,我将在 W7 (64) 上再次运行相同的测试。看起来我确实达到了 ByteArray 对象的某种限制,但仍然没有找到关于大小限制的实际 adobe 文档。【参考方案4】:没有提供详细信息,但我的直觉是您遇到的问题不是内存不足(您的系统有足够的内存),而是算法欠佳和/或错误。您可能需要重新考虑生成地图的方式,并确保您不会在某处陷入无限循环。
如果您发布更多详细信息(可能在另一个问题中),也许我们可以提供更多帮助。
【讨论】:
感谢您的回复,最初我使用 Array 来存储 int 值,但后来转到 ByteArray。你认为我遇到了 Array/ByteArray 对象本身的限制吗? ByteArray 在内存/性能方面绝对比包含整数的通用数组要好。您的地图的最大尺寸是多少?你确定代码中没有错误会导致数组变得太大,最终进入无限循环或类似的东西吗? 嗨,我用我的测试细节更新了主要问题。我仍然不确定实时文档没有说的 ByteArray 的最大大小以上是关于Adobe AIR 可以使用的最大内存量是多少?的主要内容,如果未能解决你的问题,请参考以下文章
一个字符串在java中可以容纳的最大数据量是多少? [复制]