但是,在使用Android SDK 2.2进行测试时,性能似乎很差,尽管我们遵循了所有的内存管理步骤并避免了泄漏,包括全局变量、定时器、转换、显示对象等等。
有人对这种性能问题有什么想法吗?当在网络上搜索时,大多数人说这是Corona本身的一个bug。
确保您使用display.remove()
方法来移除精灵和图像。
话虽如此,通过对我们自己的Corona游戏进行调整后,性能良好。
我不知道安卓上的情况,但我正在为iPhone使用Corona开发,我没有这些问题...
确保在每次场景更改时删除所有对象,停止计时器,nil变量,删除事件侦听器...并清除内存。
这里有一篇关于内存泄漏和性能的好文章:Corona SDK内存泄漏预防101
local textMem = system.getInfo( "textureMemoryUsed" ) / 1000000
print( "TexMem: " .. textMem )
endRuntime:addEventListener( "enterFrame", monitorMem ) 如果每次重新启动或场景更改时内存都会增加,那么就有问题了... - networ我在Android 2.2上没有注意到任何性能问题,即使是相对较大的图像和精灵表。但如果有大量的物理对象,可能会有问题。
我遇到的唯一瓶颈是显示屏幕对象的数量。例如,在关卡选择菜单中,每个关卡都有自己的按钮和文本。但是那里有超过200个显示对象,仍然在性能方面表现良好,在滑动动画期间略微降低了FPS。
另一个情况是弹性蛇,我有一个算法在每帧检测自交并逐行填充封闭区域(如果有)。这非常昂贵,但Corona没有绘制复杂形状的功能,只有基本图形。所以那是唯一的选择。
所以这完全取决于你用它做什么。Corona对大多数事情都很棒,但不是全部。
我有一个应用程序,http://itunes.apple.com/app/rocket-space/id531141378
它在任何iOS设备上都运行良好,即使在iPhone 3GS上也能显示60FPS。
但是在Android上,我只有10-15FPS,即使在搭载Tegra 2的顶级Android设备上也是如此。
亚马逊Kindle Fire效果更好,但不如iOS流畅,设备上只显示19-23FPS。
我尝试使用不同版本的SDK,包括稳定版704和840以及许多每日构建版本。但这并没有帮助,不同版本只提高了2-3FPS的性能,但同时也给代码带来了很多限制。我在能优化的地方进行了代码优化,缓存了大量变量,对onFrame计算进行了优化,但这并没有帮助 )=
所以我认为Corona是一个非常适合开发仅限于iOS项目的优秀SDK,但对于Android来说并不理想。因此,我们决定在下一个游戏项目中转向Unity。
我曾经遇到过与内存管理相关的问题。 Corona 告诉我们,如果使用 Composer 库,它会自动处理内存和对象,但实际上并不是这样。
尝试在 Hide() 阶段手动删除每个场景对象,并将该组引用设置为 nil。
您可以使用以下代码块来引用应用程序/游戏中的内存泄漏。
内存泄漏: 这是由于不必要的内存分配而导致内存不断增加的概念。当设备中的内存耗尽时,泄漏就会发生,任何尝试分配更多内存的操作都会导致应用程序终止或对性能产生负面影响。
在 Corona 中,以下函数可用于检查内存分配:
local function printMemUsage()
local memUsed = (collectgarbage("count"))/1000
local texUsed = system.getInfo("textureMemoryUsed")/1000000
print("\n---------MEMORY USAGE INFORMATION---------")
print("System Memory Used:", string.format("%.03f", memUsed), "Mb")
print("Texture Memory Used:", string.format("%.03f", texUsed), "Mb")
print("------------------------------------------\n")
return true
结束
Runtime:addEventListener("enterFrame", function() collectgarbage("step") end)
timer.performWithDelay(2000, printMemUsage, -1)
设备支持的最大纹理尺寸有限制。如果超过此限制,纹理将自动缩小以适应最大尺寸。您可以使用system.getInfo("maxTextureSize")命令确定特定设备的最大纹理尺寸。有关更多信息,请参见system.getInfo()。
内存泄漏预防:
避免过载内存: 避免将太多图像加载到一个lua场景中。 处理全局变量: 不要忘记卸载全局变量。大多数情况下使用本地变量。 释放内存: 在切换到另一个场景之前,删除所有不必要的计时器、转换运行时事件侦听器和显示对象。 使用以下方法释放内存- timer.cancel(timer_name); timer_name = nil -- 删除计时器 transition.cancel(tran_name); tran_name = nil -- 删除转换 display_object:removeSelf(); display_object = nil -- 删除显示对象 runtime:removeEventListener() -- 删除运行时侦听器 在不再需要音频文件时处理所有音频文件: audio.dispose(audio_name); audio_name = nil -- 处理音频文件。
如果您需要将多个显示对象的特定属性设置或转换为相同的值 - 例如,将整个叠加菜单淡化为alpha = 0 - 最好将对象添加到显示组中并修改整个组的属性。这样编码更容易,可以优化内存和速度。