我在内存管理方面遇到了同样的问题。
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),最好将对象添加到显示组并修改整个小组。它更容易编码,并且优化了内存和速度。
虽然避免全局变量和函数并不总是可行的,但最好的做法是尽量减少使用。访问局部变量和函数的速度更快,尤其是在时间关键的例程中。
-谢谢
阿西夫