Производительность короны? - PullRequest
7 голосов
/ 23 октября 2011

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

При тестировании с android sdk 2.2 производительность кажется низкой, хотя мы выполняем все этапы управления памятью и избегаем утечек, касающихся глобальных переменных, таймеров, переходов, экранных объектов и т. Д.

Кто-нибудь имеет представление о такой проблеме производительности? При поиске в сети большинство говорит, что это ошибка в самой короне.

Ответы [ 6 ]

3 голосов
/ 18 января 2012

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

Убедитесь, что вы display.remove() спрайтов и изображений.

Тем не менее, после некоторой настройки нашей собственной игры Corona, производительность была хорошей.

2 голосов
/ 23 октября 2011

Я не знаю, как на Android, но я работаю с Corona для iPhone, и у меня нет этих проблем ...

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

Вот хороший пост о утечках памяти и производительности: Corona SDK Предотвращение утечек памяти 101

1 голос
/ 02 июня 2012

Я не заметил каких-либо проблем с производительностью на Android 2.2, даже с относительно большими изображениями и спрайт-листами. Может быть, с большим количеством физических объектов.

Единственными узкими местами, с которыми я столкнулся, было количество отображаемых экранных объектов. Например, в меню выбора уровня, где у каждого уровня есть своя кнопка с текстом над ним. Но это было более 200 отображаемых объектов и все еще было прилично с точки зрения производительности с небольшим падением FPS во время анимации смахивания.

Другой случай был с упругой змеей, где у меня был алгоритм, определяющий самопересечения в каждом кадре, и поток за линией заполнял закрытую область (если она была). Это было очень дорого, но у Corona нет функции рисования сложных фигур, только примитивы. Так что это был единственный вариант.

Так что все зависит от того, что вы с ним делаете. Корона отлично подходит для большинства вещей, но не для всех.

0 голосов
/ 07 ноября 2016

Я столкнулся с такими же проблемами в отношении управления памятью. Corona сообщает нам, что вы используете библиотеку Composer, она будет автоматически обрабатывать память и объекты, но это не так.

Попробуйте удалить каждый объект сцены вручную в фазе Hide () и установите для этой группы ссылку nil.

Вы можете использовать следующий блок кода для определения утечки памяти в вашем приложении / игре.

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

В короне можно использовать следующую функцию для проверки выделения памяти:

локальная функция 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

0 голосов
/ 27 июня 2012

У меня есть приложение, http://itunes.apple.com/app/rocket-space/id531141378
Оно отлично работает на любых устройствах iOS и показывает 60FPS даже на iPhone 3GS.

Но на андроиде у меня 10-15 FPS, даже на верхнем Androidустройства с Tegra 2.
Amazon Kindle Fire работает лучше, но не так гладко, как iOS, он показывает только 19-23 FPS на устройстве.
Я пытался использовать разные версии SDK, стабильные 704 и 840 и много лотов.ежедневных сборок.Но это не помогает, я получил повышение производительности в 2-3 FPS на разных версиях, но это также оставило кучу ограничений для кода.Я оптимизировал код везде, где смогу, кэшировал кучу переменных, оптимизировал вычисления onFrame, но это не помогает) =

Так что я думаю, что Corona - очень хороший SDK для разработки проектов только для iOS, но не для Android.Так как Corona очень плохо оптимизирована для Android.Для нашей следующей игры мы решили перейти на Unity.

0 голосов
/ 26 июня 2012

По моему опыту, производительность на Corona для Android отстает от сопоставимых проектов Corona для iPhone, даже если предпринимаются усилия по оптимизации -

Эта проблема повторяется на форумах Corona - http://developer.anscamobile.com/forum/2011/04/20/terrible-performance-samsung-galaxy-s-crashes-tegra-devices

...