Эффективная система анимаций для Nintendo DS
Содержание
Постановка задачи (1)
Постановка задачи (2)
Существующее решение (1)
Существующее решение (2)
Существующее решение: итоги
Картридж NDS
Используем сильные стороны: идея
Первый вариант реализации
Первый вариант: результат
Удаляем ненужные узлы в иерархии
Ненужные узлы
Удаляем ненужные узлы в иерархии: результат
Избавляемся от дубликации в дисплей-листах
Удаление дубликации: результат
Что еще можно уменьшить?
Уменьшение частоты квантования: результат
Делаем анимации плавнее
Варианты интерполяции матриц
Интерполируем матрицы
Интерполяция матриц: результат
Морфинг геометрии
Интерполяция геометрии: результат
Проблемы не закончились!
Причины тормозов
Ручное ассемблирование: что и как?
Ручное ассемблирование: результат
Визуальные артефакты, борьба
Результаты
Дальнейшие улучшения
Выводы
Вопросы?

Эффективная система анимаций для Nintendo DS

1. Эффективная система анимаций для Nintendo DS

Ростислав Хлебников
Евгений Заякин
20 апреля 2008
900igr.net

2. Содержание

Постановка задачи
Эволюция анимационной системы
Проблемы и решения
Выводы (NDS animation best practices)
2

3. Постановка задачи (1)

300 вершин
40 костей
200 вершин
25 костей
Суммарно ~4000 кадров (около 2
минут) анимаций
3

4. Постановка задачи (2)

Анимации на DS
Анимация на уровне матриц
Анимация на уровне геометрии
Чтобы было быстро и красиво
На DS – учесть слабые и сильные стороны
платформы
4

5. Существующее решение (1)

Процесс получения результата
Сплайны
• Sampling сплайнов и создание матрицы по TRS
Матрицы local-to-parent
• Перемножение матриц в иерархии
Матрицы local-to-world
• Скиннинг
Результирующий меш
5

6. Существующее решение (2)

Исходные данные
+
6

7. Существующее решение: итоги

Плюсы
Алгоритмы написаны и много раз
проверены
Минусы
Низкая производительность
• Кроме того, нет возможности распараллелить
работу
7

8. Картридж NDS

Плюсы
Высокая скорость чтения данных (5 Мб/с)
Zero seek time
Минусы
Сравнительно небольшой объем
(максимум 128 Мб, а желательно
уложиться в 64 Мб)
8

9. Используем сильные стороны: идея

Preprocessing (PC)
Предрассчитываем данные для каждого
кадра:
• Матрицы local-to-parent
• Скинованная геометрия
Runtime (NDS)
Считываем необходимые данные
Считаем матрицы local-to-world
9

10. Первый вариант реализации

Preprocessing
Частота дискретизации - 30 fps
Формат записи:
• Матрицы - 16 значений fixed-32 (по 4 байта)
• Геометрия (дисплей-листы для непосредственной
отсылки на рендеринг)
Runtime
Дополнительный буфер для матриц
Для дисплей листов дополнительной памяти
не требуется
10

11. Первый вариант: результат

Размеры анимаций на картридже
огромны
Картиджи
32 Мб
64Мб
128 Мб
Данные
54 Мб
25 Мб
95 Мб
Основные данные + видео и звуки
Анимации геометрии
Анимации матриц
11

12. Удаляем ненужные узлы в иерархии

Узел является нужным, если:
1. С ним связана геометрия
2. Его позиция требуется игре (например,
позиция локатора для оружия)
Все остальные узлы являются
лишними!
12

13. Ненужные узлы

Ненужными
оказываются
30 – 90 % узлов!
13

14. Удаляем ненужные узлы в иерархии: результат

Объем уменьшили на 60%
Работает ощутимо быстрее
32 Мб
64Мб
128 Мб
Было
54 Мб
25 Мб
54 Мб
25 Мб
95 Мб
Стало
Анимации геометрии
35 Мб
Анимации матриц
14

15. Избавляемся от дубликации в дисплей-листах

Материалы, флаги, UV сохраняем
единожды
Вершины и нормали - для каждого
кадра
15

16. Удаление дубликации: результат

Объем уменьшили на 50%
Требуется дополнительная оперативная память
Информация о размещении динамических данных
Буфер для считывания анимированной геометрии
32 Мб
64Мб
128 Мб
Было
54 Мб
25 Мб
35 Мб
Стало
54 Мб 12
Анимации геометрии
35 Мб
Анимации матриц
16

17. Что еще можно уменьшить?

Можем изменить только частоту
квантования
Размер данных = размер кадра * частота
квантования * длина анимации
Уменьшаем ее вдвое
17

18. Уменьшение частоты квантования: результат

Точно влезем в 128 Мб!
Анимации стали «дерганными»
32 Мб
64Мб
128 Мб
Было
54 Мб 12
35 Мб
Стало
54 Мб 6 17 Мб
Анимации геометрии
Анимации матриц
18

19. Делаем анимации плавнее

Идея: интерполяция между ключевыми
кадрами
Классическое решение (основанное на
интерполяции сплайнов) не подходит!
Наше решение:
Интерполяция матриц
Морфинг геометрии
19

20. Варианты интерполяции матриц

Интерполяция координатных осей
+ Простое решение
– Требуется ортогонализация
– Проблемы с масштабированием
Интерполяция с помощью
кватернионов
+ Качественная интерполяция
– Двойное преобразование представлений
– Специальный код для масштабирования
20

21. Интерполируем матрицы

Используем кватернионы
Избавляемся от двойного
преобразования
На экспорте сохраняем по-отдельности:
1. Кватернионы
2. Компоненты Translate и Scale
Используем линейную, а не
сферическую интерполяцию
кватернионов
21

22. Интерполяция матриц: результат

Матричные анимации стали плавными
Объем уменьшили на 60%
26 байт вместо 64 на один узел на кадр
32 Мб
64Мб
128 Мб
Было
54 Мб 6 17 Мб
Стало
54 Мб 6 7
Анимации геометрии
Анимации матриц
22

23. Морфинг геометрии

Необходимые действия
Распаковка из формата графического ядра
Линейная интерполяция векторов
Обратная упаковка
Используем возможность упаковывать
три компоненты в 32 бита (vtx10)
23

24. Интерполяция геометрии: результат

Качество скиновой анимации улучшилось
Сэкономили еще 50% памяти
32 Мб
64Мб
128 Мб
Было
54 Мб 6 7
Стало
54 Мб 6 7
Анимации геометрии (3 Мб)
Анимации матриц (7 Мб)
24

25. Проблемы не закончились!

Зверские тормоза
Визуальные артефакты
25

26. Причины тормозов

Компилятор генерирует чрезвычайно
плохой ассемблерный код
Основная проблема - код внутренних
циклов интерполяции
Погружаемся в ARM ARM и
ассемблируем вручную
26

27. Ручное ассемблирование: что и как?

Ассемблируем функции интерполяции
s16Lerp / s32Lerp / getDotSign
lerpVtx10 (хит сезона)
Используем специфические команды
ARM, например SMLABB
Решаем проблемы компилятора,
который совершенно неспособен на
анализ asm-секций
27

28. Ручное ассемблирование: результат

Скорость стала такой, что стали
думать переписывать на ассемблере
всю игру
28

29. Визуальные артефакты, борьба

Причина дрожания – потеря точности
из-за формата vtx10
Решение
Для персонажей, на которых эффект
заметен возвращаем точность (таких
оказалось очень немного)
29

30. Результаты

30

31. Дальнейшие улучшения

Уменьшить размер данных и увеличить
скорость за счет неравномерного
квантования анимаций
Автоматический выбор ключевых кадров
и / или
Превью-плагин в Maya – WYSIWYG для
художников
31

32. Выводы

Используйте streaming и интерполяцию
ключевых кадров вместо просчета в
run-time
Сокращайте иерархии до минимума
Активное используйте ручное
ассемблирования time-critical кода
Будьте аккуратны с точностью
32

33. Вопросы?

33
English     Русский Правила