Zillion Whales: как отрисовать 12 000 спрайтов в Unity

Post on 11-Aug-2015

941 views 2 download

Transcript of Zillion Whales: как отрисовать 12 000 спрайтов в Unity

Как отрисовать 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