Привет, друзья!
Я бы хотел показать вам результаты беглого сравнения трех наиболее популярных библиотек для 2D рендера, работающих на Stage3D:
Starling, ND2D, Genome2D.
Я скачал последние доступные билды и исходники этих библиотек и написал простое AIR приложение, в котором отображается некоторое количество изображений. Все они вращаются, двигаются, скейлятся и меняют альфу каждый кадр
Изображения размещаются по всей видимой области в несколько итераций (каждый кадр добавляется заданное количество изображений, пока их общее количество не достигнет заданного предела).
Для всех изображений используется одна и та же текстура — квадрат 25 на 25 с небольшим количеством альфы.
Я прогнал это приложение на своем стационарном PC и на двух мобильных устройствах — iPad1 с iOS 5.0.1 и GalaxyTab 10.1 с Android 3.1.
Итак, вот что я получил:
Starling изGitHub’а Commit:9aa93a8195c47252253fd4d2b671115e19d16b6f, 24.03.2012:
iPad 1:
1350 изображений на 30 FPS
RAM: 6.4 МБ
GalaxyTab 10.1 (OC 1.4ГГц):
1350 изображений на 30 FPS
RAM: 6.2 МБ
PC (i7 4.8 ГГц, Radeon 6790):
10000 изображений на 30 FPS
RAM: 19.7 МБ
RAM на 1000 изображений: 9.1 МБ
Starling — отличный опенсорсный фреймворк. Он имитирует классический DisplayList, имеет большое сообщество (во многом благодаря Adobe) и очень подробную API документацию. По этому изучать и вносить изменения в эту библиотеку достаточно просто.
ND2D из GitHub’а Commit:453531f7aee46b00a112c6f0d5d8b46d62075287, 05.03.2012:
Эта библиотека позволяет отрисовывать большое количество спрайтов в одинаковой текстурой двумя разными «способами» — добавляя спрайты в Sprite2DCloud или в Sprite2DBatch. Я протестировал оба.
Sprite2DCloud:
iPad 1:
~1150 изображений на 30 FPS
RAM: 6.4 МБ
GalaxyTab 10.1 (OC 1.4ГГц):
~1150 изображений на 30 FPS
RAM: 6.2 МБ
PC (i7 4.8 ГГц, Radeon 6790):
16000 изображений на 30 FPS с падением до 16 FPS во время добавления изображений (добавлялось по 100 штук в кадр), этого падения не должно быть заметно если добавлять все спрайты сразу.
RAM: 37 МБ
RAM на 1000 изображений: 9.5 МБ
Sprite2DBatch:
iPad 1:
~1150 изображений на 30 FPS
RAM: 6.6 МБ
GalaxyTab 10.1 (OC 1.4ГГц):
~1150 изображений на 30 FPS
RAM: 6.1 МБ
PC (i7 4.8 ГГц, Radeon 6790):
10800 изображений на 30 FPS
RAM: 23.2 МБ
RAM на 1000 изображений: 9.1 МБ
ND2D это еще один прекрасный опенсорсный фреймворк для отрисовки 2D с использованием Stage3D. У него также имеется большое сообщество (хоть и меньше, чем у Starling), однако API документация страдает — она заполнена очень поверхностно (однако, зачастую и этого достаточно) и при этом фреймворк сравним по производительности со Starling.
Данную библиотеку также просто использовать, т.к. своей архитектурой визуальных объектов она тоже напоминает классический DisplayList, который мы привыкли видеть во Flash, к тому же для библиотеки доступны примеры использования.
Genome2D Nightly 0.9.0.1093:
Эта библиотека отчетливо выделяется. Достаточно посмотреть на результаты бенчмарков!
iPad 1:
1900 изображений на 30 FPS
RAM: 6.5 МБ
GalaxyTab 10.1 (OC 1.4ГГц):
3800 изображений на 30 FPS
RAM: 10 МБ
PC (i7 4.8 ГГц, Radeon 6790):
~40000 изображений на 30 FPS
RAM: 68.7 МБ
RAM на 1000 изображений: 9.1 МБ
Это просто хардкорный фреймворк! Библиотека работает с потрясающей скоростью, однако для нее нет вообще никакой API документации, у нее скромное сообщество и нет актуальных примеров для последних Nightly билдов (на данный момент последний nightly билд ушел далеко вперед по сравнению с последним релизным).
Новичку использование данного вреймворка может показаться чересчур сложным.
Итак, что у нас есть для создания 2D приложений на Stage3D:
Starling — самый приятный. Однако, в некоторых тестах проигрывает ND2D в производительности.
ND2D — компромиссный вариант — в некоторых случаях он быстрее Starling’а, но отсутствие (на данный момент) адекватной API документации немного портит впечатление (so far).
Genome2D — в некоторых случаях (как в моем, например) может показывать небывалую производительность и оставлять конкурентов далеко позади, однако использовать его я бы порекомендовал лишь хардкорным разработчикам с навыками «ниндзжениринга») Я надеюсь, этот фреймворк станет дружелюбнее к разработчику в будущих релизах.
По моему мнению, все три библиотеки сопоставимы по функциональным возможностям — во всех есть система частиц, блендинг и другие продвинутые дополнения. И все три активно разрабатываются и обрастают новыми возможностями.
Так же, хотелось бы отметить, что iPad1 и разогнанный до 1.4 ГГц GalaxyTab 10.1 во многих случаях держались наравне. Я подозреваю, что дело в разрешении и каким-то образом компенсирующих друг друга других HW и SW отличиях.
Так что если вы сейчас задумались о портировании своей (не требовательной к ресурсам) игры с комфортом и без лишних сложностей, то я бы смело рекомендовал попробовать Starling. Если же вам требуется максимум производительности (и приключений) — посмотрите в сторону Genome2D. А если что-то между — то я бы посоветовал ознакомиться с ND2D.
В качестве бонуса привожу ссылку на архив со всеми бенчмарками для Android (и AIR 3.2 p6 Runtimes для Android):
http://codestage.ru/files/flood/android/benchmark.zip
Если вы считаете, что я где-то ошибся в тестах — пишите — я буду рад исправить свою ошибку!
*Обновление 1*
Недавно я обновил расширение для Starling — starling-imagebatch, автором которого является Philippe, чтобы оно заработало с последней версией Starling’а. Заодно проверил его в деле.
Вот результаты:
iPad 1:
2000 изображений на 30 FPS
RAM: 6.4 МБ
GalaxyTab 10.1 (OC 1.4ГГц):
2000 изображений на 30 FPS
RAM: 5.1 МБ
PC (i7 4.8 ГГц, Radeon 6790):
>16000 изображений на ровных 60 FPS (больше изображений добавить не получилось из-за ограничения размеров буфера)
RAM: 14.9 МБ
RAM на 1000 изображений: 8.4 МБ
Баг с распуханием памяти)
Пока я ковырялся с ImageBatch, случайно наткнулся на очень неприятный баг, из-за которого потребление памяти начало ощутимо скакать.
Я пока так и не понял откуда у него ноги растут, но наткнуться похоже на него не очень сложно, если часто пользуешься свернутыми условями (хорошо, что у меня такой привычки нет).
Вот первый кусок кода:
var k:Number = (premultipliedAlpha ? item.alpha : 1) / 255;
А вот второй:
var k:Number = premultipliedAlpha ? item.alpha : 1; k /= 255;
По сути никакой разницы, верно?
Только вот при очень многократном выполнении первого куска происходит распухание памяти со скоростью где-то 5 мб/сек и примерно какждые 3-5 секунды оно чистится — получается такая гармошка на графике потребления памяти)
А если первый кусок заменить на второй — всё работает как часы без каких-либо проблем с памятью.
Хороший обзор. Как я и ожидал Genome2d оставил позади всех, поэтому я и сделал ставку на него.
Должен не согласится с термином «приключения». Автор написал первые два туториала, и надо сказать что все в коде грамотно и логично, никаких трудностей в понимании быть не должно. Плюс есть примеры и форум.
Ссылки на все это:
Тутор1 — http://blog.flash-core.com/?p=838
Тутор2 — http://blog.flash-core.com/?p=875
AsDoc — http://www.flash-core.com/g2d/doc/
Примеры — https://github.com/pshtif/Genome2D/tree/master/examples
Форум — http://blog.flash-core.com/?forum=genome2d-forum
Спасибо за комментарий и за полезные ссылки! Genome действительно очень быстрый фреймворк, однако в определённых случаях (множество изображений из одной текстуры) в ровень с ним идёт старлинговский ImageBatch (из *Обновление 1*). Очень здорово, что у нас есть выбор, чем пользоваться — можно отдавать предпочтение тому или иному продукту исходя из потребностей!
Согласен, когда есть выбор всегда хорошо.
Спасибо за ссылку на ночные сборки Genome2d, я не знал о ней ))
Рад помочь! Кстати, в комментах к параллельной английской ветке блога есть немало полезной инфы от создателя Genome2D: http://blog.codestage.ru/2012/03/26/comparison-stage3d-2d-frameworks/#comments
прогнали на
Acer Iconia Tab A501
Процессор: NVIDIA Tegra Dual-core
Частота процессора: 1 ГГц
Код процессора: T250
Количество ядер: 2 шт
Размер экрана: 10.1 » (дюйм)
Разрешение: 1280×800 пикс
Starling1
60 — 22.7 RX — 0 6.8+ — 6.8GRX+ — 6.08 (постоянно растет там где +, через минуту начал греть)
Starling2
60 — 22.7 RX — 0 6.8+ — 6.8GRX+ — 6.08 (постоянно растет там где +, через минуту начал греть, растет быстрее первого)
ND2D —
Sprite2DBatch
60 — 20.9 R X — 0 8.38 — 7.9 GRX — 5.53
Sprite2DCloud
60 — 27.8 RX — 0 6.41 — 641 GRX — 5.89
Genom2D
60 — 20,5 RX — 0 14.68 — 15.24 G R X — 7.05
По поводу бага с разбуханием памяти, есть довольно подробный пост у Jean-Philippe Auclair.
http://jpauclair.net/2012/02/25/epic-memory-track-down/
Спасибо за комментарий! Однако, кому как не мне знать о том баге — я был инициатором его поимки) Но если вы читали ту статью — там он проявляется при совсем других условиях, по-этому нельзя достоверно сказать что корни у бага одни и те же.
Упс… не заметил вас в комментариях к тому посту.