【问题标题】:Corona performance?电晕性能?
【发布时间】:2011-10-23 12:53:26
【问题描述】:

我和我的团队正在使用 corona sdk 开发游戏,我们的游戏应该可以在 iphone 和 android 设备上运行。

使用 android sdk 2.2 进行测试时,性能似乎很差,尽管我们遵循所有内存管理步骤并避免泄漏,涉及全局变量、计时器、转换、显示对象等。

有人知道这样的性能问题吗?在网上搜索时,大多数人说这是电晕本身的一个错误。

【问题讨论】:

  • ...在哪些 Android 设备上进行测试?因为在 iPhone 4 上运行良好的游戏可能无法在 HTC Wildfire 上运行得那么好,仅由于硬件的差异......
  • 我们在galaxy的设备上测试,我们还没有在iphone上测试
  • 众所周知,与 iOS 相比,Corona 在 Android 上的性能较差。您对此无能为力。在最新的每日构建中,情况有所改善,但没有什么了不起的。如果您在 Corona 论坛中环顾四周,您会看到一些讨论它的线程。官方的回应始终是“Android 是碎片化的,除非您提交错误报告并附上代码示例来证明问题和受影响的设备,否则我们无法为您提供帮助”。
  • 你使用物理引擎吗?如果你有“太多”的物理对象,它会变得非常慢非常快。

标签: android iphone performance coronasdk


【解决方案1】:

除了内存泄漏之外,您还需要确保图形(和音频)资产得到妥善处理。通过在单个图像文件上使用精灵表来保持低纹理内存并进行优化。更重要的是,保持图像文件的大小尽可能小,并记住,图像文件的大小在内存中并不重要,重要的是尺寸(一旦加载,图像将作为纹理存储,与压缩无关。 )

确保您display.remove() 精灵和图像。

也就是说,在对我们自己的 Corona 游戏进行了一些调整之后,性能还不错。

【讨论】:

    【解决方案2】:

    我不知道它在 android 上的情况如何,但我用 Corona for iPhone 开发,我没有这个问题......

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

    这是一篇关于内存泄漏和性能的好文章: Corona SDK Memory Leak Prevention 101

    【讨论】:

    • thx 网络,但我们确实删除了对象、计时器和侦听器,但似乎这是另一个问题,事实是我们有大量对象通过 transition.to 移动,但我不认为这可能是表现如此糟糕的原因
    • 您是否在 iPhone 上测试过您的应用程序?因为它可能是真正的错误,但如果 iPhone 上的性能也很差,那么你的应用程序中可能会有一些内存泄漏......试试这个: local monitorMem = function() collectgarbage() print( "MemUsage: " 。 . collectgarbage("count") ) local textMem = system.getInfo("textureMemoryUsed") / 1000000 print("TexMem:" .. textMem) end Runtime:addEventListener("enterFrame", monitorMem) 如果你每次重启都记忆犹新,或者场景变化上升它有问题......
    【解决方案3】:

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

    我遇到的唯一瓶颈是显示的屏幕对象数量。例如,在关卡选择菜单中,每个关卡都有自己的按钮,上面有文字。但这是超过 200 个显示对象,并且在性能方面仍然不错,在滑动动画期间 FPS 略有下降。

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

    所以这一切都取决于你用它做什么。 Corona 适用于大多数事情,但不是全部。

    【讨论】:

      【解决方案4】:

      根据我的经验,Android 的 Corona 的性能远远落后于 iPhone 的类似 Corona 项目,即使进行了优化 -

      这个问题得到了 Corona 论坛上的回应 - http://developer.anscamobile.com/forum/2011/04/20/terrible-performance-samsung-galaxy-s-crashes-tegra-devices

      【讨论】:

      • 请在你的答案中引用链接的相关部分,理想情况下应该是自读的:)(链接腐烂、参考等)
      【解决方案5】:

      我有一个应用程序,http://itunes.apple.com/app/rocket-space/id531141378
      它适用于任何 iOS 设备,即使在 iPhone 3GS 上也能显示 60FPS。

      但在 Android 上,我有 10-15 FPS,即使在配备 Tegra 2 的顶级 Android 设备上也是如此。
      Amazon Kindle Fire 效果更好,但不如 iOS 流畅,它在设备上仅显示 19-23 FPS。
      我尝试使用不同版本的 SDK,稳定的 704 和 840 以及大量的日常构建。但这无济于事,我在不同版本的 2-3 FPS 上获得了性能提升,但它也给代码留下了一堆限制。我尽可能优化了代码,缓存了一堆变量,优化了 onFrame 计算,但这无济于事)=

      所以我认为 Corona 是非常好的 SDK,用于开发仅限 iOS 的项目,而不是 Android。由于 Corona 针对 Android 进行了非常糟糕的优化。对于我们的下一个游戏,我们决定迁移到 Unity。

      【讨论】:

        【解决方案6】:

        我在内存管理方面遇到了同样的问题。 Corona 告诉我们,你使用 Composer 库,它会自动处理内存和对象,但不是。

        尝试在 Hide() 阶段手动删除每个场景对象并将该组引用设置为 nil。

        您可以使用以下代码块来引用您的应用/游戏中的内存泄漏。

        内存泄漏: 这是由于不必要的内存分配而不断增加内存使用的概念。据说一旦设备中的内存耗尽就会发生泄漏,任何分配更多内存的尝试都会导致应用程序自行终止,否则会对性能产生负面影响。

        在 corona 中可以使用以下函数来检查内存分配:

        本地函数 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 -- 删除定时器 转换.取消(tran_name); tran_name = nil -- 删除转换 display_object:removeSelf(); display_object = nil -- 移除显示对象 runtime:removeEventListener() -- 移除运行时监听器 不再需要时处置所有音频文件: audio.dispose(audio_name); audio_name = nil -- 处理音频文件。

        如果您需要将多个显示对象的特定属性设置或转换为相同的值(例如,将整个叠加菜单淡化为 alpha=0),最好将对象添加到显示组并修改整个小组。它更容易编码,并且优化了内存和速度。

        虽然避免全局变量和函数并不总是可行的,但最好的做法是尽量减少使用。访问局部变量和函数的速度更快,尤其是在时间关键的例程中。

        -谢谢 阿西夫

        【讨论】:

          猜你喜欢
          • 2018-03-29
          • 2017-03-19
          • 1970-01-01
          • 1970-01-01
          • 2013-04-12
          • 2013-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多