Corona 性能?

7
我和我的团队正在使用Corona SDK开发游戏,我们的游戏应该能在iPhone和Android设备上运行。
但是,在使用Android SDK 2.2进行测试时,性能似乎很差,尽管我们遵循了所有的内存管理步骤并避免了泄漏,包括全局变量、定时器、转换、显示对象等等。
有人对这种性能问题有什么想法吗?当在网络上搜索时,大多数人说这是Corona本身的一个bug。

1
测试在哪些安卓设备上进行?因为一个在iPhone 4上运行良好的游戏,在HTC Wildfire上可能由于硬件差异而无法良好运行... - lxt
我们正在 Galaxy S 设备上进行测试,但我们还没有在 iPhone 上进行测试。 - Israa.Kh
2
众所周知,与iOS相比,Corona在Android上的性能较差。你几乎无法对此做什么。最新的每日构建版本情况有所改善,但并没有什么惊人之处。如果你在Corona论坛中四处看看,就会发现有一些关于这个问题的帖子。官方回应总是说:“Android存在碎片化问题,除非您提交一个包含代码示例和受影响设备的错误报告,否则我们无法为您提供帮助”。 - devius
你使用物理引擎吗?如果你拥有“太多”的物理对象,它会变得非常缓慢。 - Philipp Lenssen
6个回答

3
除了内存泄漏之外,您还需要确保图形(和音频)资源得到很好的处理。使用精灵表而不是单独的图像文件来保持纹理内存较低并进行优化。更重要的是,尽可能使图像文件大小小,并记住一旦加载到内存中,图像文件的大小并不重要,重要的是其维度(加载后,图像将作为纹理存储,独立于压缩)。

确保您使用display.remove()方法来移除精灵和图像。

话虽如此,通过对我们自己的Corona游戏进行调整后,性能良好。


2

我不知道安卓上的情况,但我正在为iPhone使用Corona开发,我没有这些问题...

确保在每次场景更改时删除所有对象,停止计时器,nil变量,删除事件侦听器...并清除内存。

这里有一篇关于内存泄漏和性能的好文章:Corona SDK内存泄漏预防101


谢谢您的回复。我们已经移除了对象、定时器和监听器,但似乎还存在其他问题。事实上,我们有大量的对象通过transition.to进行移动,但我不认为这可能是导致性能如此差的原因。 - Israa.Kh
你在iPhone上测试过你的应用吗?因为它可能会有很多bug,但如果在iPhone上性能也很差,那么你的应用程序可能存在一些内存泄漏问题...试试这个:local monitorMem = function() collectgarbage() print( "MemUsage: " .. collectgarbage("count") )local textMem = system.getInfo( "textureMemoryUsed" ) / 1000000 print( "TexMem: " .. textMem )endRuntime:addEventListener( "enterFrame", monitorMem ) 如果每次重新启动或场景更改时内存都会增加,那么就有问题了... - networ

1

我在Android 2.2上没有注意到任何性能问题,即使是相对较大的图像和精灵表。但如果有大量的物理对象,可能会有问题。

我遇到的唯一瓶颈是显示屏幕对象的数量。例如,在关卡选择菜单中,每个关卡都有自己的按钮和文本。但是那里有超过200个显示对象,仍然在性能方面表现良好,在滑动动画期间略微降低了FPS。

另一个情况是弹性蛇,我有一个算法在每帧检测自交并逐行填充封闭区域(如果有)。这非常昂贵,但Corona没有绘制复杂形状的功能,只有基本图形。所以那是唯一的选择。

所以这完全取决于你用它做什么。Corona对大多数事情都很棒,但不是全部。


0

请在您的回答中引用链接的相关部分,最好是自我可读的 :)(链接腐烂,参考文献等)。 - Nikana Reklawyks

0

我有一个应用程序,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。


0

我曾经遇到过与内存管理相关的问题。 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 - 最好将对象添加到显示组中并修改整个组的属性。这样编码更容易,可以优化内存和速度。
尽管无法在全局范围内始终避免使用全局变量和函数,但最佳实践是尽可能少地使用它们。访问本地变量和函数更快,特别是在时间关键的例程中。
-谢谢 Assif

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