zillion whales: как отрисовать 12 000 спрайтов в unity

22
Как отрисовать 12000 спрайтов на мобилах и быстро!

Upload: sasha-semenov

Post on 11-Aug-2015

941 views

Category:

Mobile


2 download

TRANSCRIPT

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

Как отрисовать 12000 спрайтов на мобилах и быстро!

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

Мы из i-Free / Zillion Whales

Александр Феер

Unity tech lead с версии Unity 2.0

Андрей Коротков

Game producerex. C++ 3D engine developer

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

Задача

Нужно срендерить 4 000 * 3 спрайтов, чтобы был стабильный FPS не ниже 30 на iOS / Android устройствах класса iPhone 4s.

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

Решение 1

Создать 4000 GameObject и в каждом внутри еще 2 GameObject.

Плюсы:Простое управление объектамиВозможность использовать анимацию юнити

Минусы:Низкий FPSОчень низкий FPSНевозможно низкий FPS

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

Решение 2

Создать большой Mesh через new Mesh().

Плюсы:Хороший контроль спрайтов (uv, position, color)

Минусы:Проблемы с анимациями юнити (Нужно анимировать вручную)Необходимо перестраивать меш каждый кадрЧуть быстрее предыдущего варианта (Низкий FPS)

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

Решение 3

Использовать Legacy Particles. По сути это тот же вариант №2, но уже на стороне юнити.

Плюсы:Хороший контроль спрайтов (uv, position, color)

Минусы:Проблемы с анимациями юнити (Нужно анимировать вручную)Чуть быстрее предыдущего варианта (Низкий FPS)

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

Решение 4

Использовать ParticleSystem. Решение передавать массив структур на сторону C++ (внутрь Unity), где уже происходит отрисовка и сортировка.

Плюсы:Быстро. Очень быстро. Нужный FPS.

Минусы:Проблемы с анимациями юнити (Нужно анимировать вручную)Нельзя задавать uv координаты каждого Particle в отдельности (blocker)

Решение можно использовать (Существует несколько хаков чем заменить передачу uv координат), но хотелось бы красивое решение.

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

Решение 5

Использовать класс GL из Unity.

Плюсы:-

Минусы:Иллюзия low-level APIInstant modeМедленно

Никогда не используйте этот класс, ни для чего кроме дебага!

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

Никогда->

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

Решение 6

Написать рендер плагин на С++.

Плюсы:Быстро. Очень быстро. Нужный FPS.Можно контролировать все что хочется, без оглядки на ограничения Unity.

Минусы:Нужно знать С++ и понимать, как работает рендер конвейерНастроить компиляцию под все платформы, в том числе поддержка минимум: OpenGL 2.x, OpenGL ES 2, Direct3D 9, Direct3D 11Забыть про Web :(

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

Что такое плагин в Unity?

Обычная библиотека (зависит от платформы).

Можно экспортировать простые статические функции.

У Unity нет C++ API.

Нужно писать C# враппер.

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

Unity Render Plugin API

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

Проблема 1

Как быстро передать массив данныхиз C# в C++?

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

Beware of mem copy!

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

Самый быстрый способ

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

Проблема 2

Совмещение рендеринга из Unity и из плагина.

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

Вызываем рендер

MonoBehaviour.OnPostRender() - тоже подойдет

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

Блендинг :(

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

Результат

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

Вопросы?

Репозиторий с прототипом: https://bitbucket.org/megaDRONe86/shroomz/

Александр: https://github.com/chromealex

Андрей: dronprogs.org