Как отрисовать 12000 спрайтов на мобилах и быстро!
Мы из i-Free / Zillion Whales
Александр Феер
Unity tech lead с версии Unity 2.0
Андрей Коротков
Game producerex. C++ 3D engine developer
Задача
Нужно срендерить 4 000 * 3 спрайтов, чтобы был стабильный FPS не ниже 30 на iOS / Android устройствах класса iPhone 4s.
Решение 1
Создать 4000 GameObject и в каждом внутри еще 2 GameObject.
Плюсы:Простое управление объектамиВозможность использовать анимацию юнити
Минусы:Низкий FPSОчень низкий FPSНевозможно низкий FPS
Решение 2
Создать большой Mesh через new Mesh().
Плюсы:Хороший контроль спрайтов (uv, position, color)
Минусы:Проблемы с анимациями юнити (Нужно анимировать вручную)Необходимо перестраивать меш каждый кадрЧуть быстрее предыдущего варианта (Низкий FPS)
Решение 3
Использовать Legacy Particles. По сути это тот же вариант №2, но уже на стороне юнити.
Плюсы:Хороший контроль спрайтов (uv, position, color)
Минусы:Проблемы с анимациями юнити (Нужно анимировать вручную)Чуть быстрее предыдущего варианта (Низкий FPS)
Решение 4
Использовать ParticleSystem. Решение передавать массив структур на сторону C++ (внутрь Unity), где уже происходит отрисовка и сортировка.
Плюсы:Быстро. Очень быстро. Нужный FPS.
Минусы:Проблемы с анимациями юнити (Нужно анимировать вручную)Нельзя задавать uv координаты каждого Particle в отдельности (blocker)
Решение можно использовать (Существует несколько хаков чем заменить передачу uv координат), но хотелось бы красивое решение.
Решение 5
Использовать класс GL из Unity.
Плюсы:-
Минусы:Иллюзия low-level APIInstant modeМедленно
Никогда не используйте этот класс, ни для чего кроме дебага!
Никогда->
Решение 6
Написать рендер плагин на С++.
Плюсы:Быстро. Очень быстро. Нужный FPS.Можно контролировать все что хочется, без оглядки на ограничения Unity.
Минусы:Нужно знать С++ и понимать, как работает рендер конвейерНастроить компиляцию под все платформы, в том числе поддержка минимум: OpenGL 2.x, OpenGL ES 2, Direct3D 9, Direct3D 11Забыть про Web :(
Что такое плагин в Unity?
Обычная библиотека (зависит от платформы).
Можно экспортировать простые статические функции.
У Unity нет C++ API.
Нужно писать C# враппер.
Unity Render Plugin API
Проблема 1
Как быстро передать массив данныхиз C# в C++?
Beware of mem copy!
Самый быстрый способ
Проблема 2
Совмещение рендеринга из Unity и из плагина.
Вызываем рендер
MonoBehaviour.OnPostRender() - тоже подойдет
Блендинг :(
Результат
Вопросы?
Репозиторий с прототипом: https://bitbucket.org/megaDRONe86/shroomz/
Александр: https://github.com/chromealex
Андрей: dronprogs.org
Top Related