2014-10-13 3 views
0

Я пытаюсь сравнить производительность больших изображений в Corona SDK.измерение прошедшего времени загрузки изображения в Corona SDK

local startTime = system.getTimer() 
local myImage = display.newImageRect("someImage.jpg", 1024, 768) 
local endTime = system.getTimer() 
print(endTime - startTime) -- prints 8.4319999999998 

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

Кроме того, FPS резко падает при загрузке большого изображения. Я отслеживаю это с помощью события enterFrame, и при загрузке изображения он печатает значения около 0,3 для 1 кадра.

Runtime:addEventListener("enterFrame", myListener) 

function onEnterFrame (event) 
    print(display.fps) 
end 

Рама занимает много времени, чтобы оказать при загрузке, даже тогда, когда загрузка изображения занимает меньше, чем 1/60 секунды. Я предполагаю, что это означает, что рендеринг происходит асинхронно в другом месте.

Итак, как я могу измерить время, необходимое для загрузки и отображения изображения?

+0

Вы можете использовать * .png вместо * .jpg. – Albert

+0

Как это изменит что-нибудь? – Pier

+0

Мне очень жаль, я попробовал png image (1600x1200) и потратил очень короткое время, но я использовал 'code'display.newImage, а не' code'newImageRect, а файл только 50 кб ... Мои глаза имеют некоторые ошибки, я должен исправить ошибки .... – Albert

ответ

1

Поскольку Corona SDK является закрытым источником, мы должны будем использовать документы и воображение.

Я вижу три возможности здесь:

  1. Corona делает то, что он говорит, и ваш субъективный опыт является неправильным.
  2. Corona загружает изображения в фоновый поток, поэтому вызов display.newImageRect не блокирует: он «начинает» загрузку изображения, а затем продолжается. Когда это происходит в других SDK (в основном, на основе javascript), вы получаете «готовый обратный вызов», который вы можете использовать на объекте изображения, но я не мог найти такого в документах.
  3. Corona быстро загружает изображение, но требует «дополнительной работы после». Например, он генерирует много мусора, который должен быть собран в мусор. Таким образом, изображение загружается быстро, но затем эта «дополнительная работа» замедляет приложение.

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

Я не использую Corona SDK, но быстрый google указал мне на storyboard module, в частности на storyboard.loadScene.

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

0

Скорее всего, изображение отображается во время цикла рендеринга сцены. Нет никакого события, указывающего на то, что изображение было отображено. Однако, если вы создаете экранный объект в обработчике события создания сцены или обработчике нажатия кнопки и регистрируете обработчик события enterFrame, вы можете измерить время между этим событием и событием первого кадра. Я не могу попробовать это здесь, но я предполагаю, что это даст вам оценку времени для рендеринга изображения. Не используйте FPS. Более крупное изображение, вероятно, даст вам большее измерение. Если вы измеряете время между событиями enterFrame, вы, вероятно, обнаружите, что оно намного меньше времени между событием create/click и событием первого кадра или между первыми двумя событиями кадра после события create/click. Опубликуйте комментарий, если вы хотите увидеть пример кода.