корона: проблема с памятью? - PullRequest
0 голосов
/ 23 августа 2011

На самом деле у меня мало вопросов, надеюсь, кто-нибудь может мне помочь.

1) В чем разница между

print(collectgarbage("count"))

и

print(system.getInfo( "textureMemoryUse" ))

2) У меня есть игра, которая после того, как вы ее закончите, вернется на 1-ю страницу, и вы можете просто поиграть в нее снова, я попытаюсь положить textureMemoryUse, она не показывает утечку памяти, но игра становится все более медленнойкаждый раз, когда я играю в нее, есть ли какая-либо другая причина, из-за которой происходит задержка, кроме утечки памяти?

3) Как правильно удалить объект?то, что я пытаюсь сделать, это:

object:removeSelf()
object = nil

, но если я выложу его с помощью команды collectgarbage ("count"), он не покажет ничего другого до и после его использования.

gameотстают от игры каждый раз, когда меня мучают в течение 2 дней, я действительно не могу найти, что не так в моем коде, надеюсь получить помощь здесь.


вот мой код на удаление всей памяти

--remove all the transition that store in a table
local k, v
for k,v in pairs(transitionTable) do
    --print(k)
    timer.cancel( v )
    v = nil; k = nil 
end

transitionTable = nil
transitionTable = {}

-- remove movie clip
playButtonAnim:removeSelf()
playButtonAnim = nil

-- remove displayGroup and it's child
displayGroup.x = display.contentHeight + 10
displayGroup.x = display.contentWidth + 10
if(displayGroup ~= nil and displayGroup.numChildren ~= nil) then
    for i=1,displayGroup.numChildren do
        print("child on display group : "..displayGroup.numChildren)
        displayGroup:remove(1)
    end
    displayGroup:removeSelf()
end

я пытаюсь:

    collectgarbage("collect")
print( "collectgarbage is " .. collectgarbage("count")  )

в каждой строке и обнаружил, что удаление фрагмента фрагмента ролика освобождает память, я думаю, что это неправильный способ удалить ее?

Ответы [ 4 ]

1 голос
/ 24 августа 2011
  1. collectgarbage("count") возвращает объем памяти, выделенный Lua VM. system.getInfo("textureMemoryUse") возвращает объем выделенной памяти текстур.

  2. Любое количество причин, включая sleep(number_of_replays) в коде. ; -)

  3. Чтобы полностью удалить объект из памяти, запустите collectgarbage("collect") несколько раз после его удаления (в некоторых случаях этого может быть недостаточно).

    При этом, как правило, гораздо лучше запускать collectgarbage("step") на каждом кадре. (Вы можете настроить шаг GC и сделать паузу.)

0 голосов
/ 08 августа 2013

немного поздно, но вы никогда не знаете:

вы забыли установить ссылку на вашу displayGroup на ноль.Кстати, если вы уничтожаете группу и не имеете никаких ссылок на дочерние элементы, вам не нужно явно уничтожать дочерние элементы.

неправильная очистка экранных объектов замедляет корону, что, скорее всего, является причиной вашей задержки.

0 голосов
/ 24 августа 2011

1) Как объясняет Александр, collectgarbage («count») - это память, используемая виртуальной машиной Lua, а system.getInfo («textureMemoryUse») - используемая память текстур. Иными словами, первый - это объем используемой Corona оперативной памяти, а второй - объем используемой Corona памяти на графическом процессоре.

2) Многие вещи могут вызвать отставание; Нам нужно знать намного больше, чем просто общее описание проблемы. Тем не менее, с симптомами, которые вы описываете, утечка памяти - это первое, на что я обращаю внимание.

3) Это правильный путь. Обратите внимание, что числа, возвращаемые этой командой, могут колебаться, и обычно использование памяти в начале непрерывно увеличивается, пока сборщик мусора в конечном итоге не догонит и не уменьшится использование памяти. Вы не столько хотите проверять использование памяти после отдельной строки, сколько наблюдать за использованием памяти с течением времени во время работы программы.

Для отладки вы можете поместить эту команду в слушатель enterFrame, чтобы непрерывно наблюдать за использованием памяти, а затем закомментировать эту часть, когда закончите с ней.

Кстати, на форуме Corona я опубликовал довольно подробное объяснение того, как работает удаление объектов: http://developer.anscamobile.com/forum/2011/01/14/how-do-i-tell-if-my-game-leaking#comment-16568

0 голосов
/ 23 августа 2011

Чтобы увидеть изменения в использовании памяти с помощью collectgarbage , вам нужно запустить collectgarbage("collect") перед вызовом collectgarbage("count")

...