{{notification.text}}

MirGames

11.07.09 07:21
0
Мне вот стало интересно, а как описанный вот тут (статья XProger'а) метод анимации морфингом можно оптимизировать в плане скорости?

Если модель статичная - тут всё относительно ясно - VBO, списки отображения.. А вот что можно сделать с анимированной моделькой? Причем без использования шейдеров?
#1
аксакал
11.07.09 08:21
0
1) Индексировать геометрию избавившись от TexFace
2) Оптимизировать индексы под кеш
3) Выводить при помощи вершинных массивов (gl*Pointer и glDrawElements)

А если всё же надумаешь с шейдером выводить, то ускоришь рендер на несколько порядков...
Отредактировано: 11.07.09 08:26
#2
11.07.09 19:26
0
Шейдеры... Пока не буду юзать то, что не понимаю) Как почитай, дойдёт более-менее - тогда и их черед придёт... Да и воспоминания о какой то старенькой GeForceFX ещё сильны, которая по чистой скорости уступала GeForce2GTS а при включении шейдерных эффектов вообще производительность помирала... Но это оффтоп.

А ежели по сути:
1 - не до конца понял... как-то повязать массивы Face и TexFace, чтобы хранить только один из них что ли? Или хранить в одном массиве? (отредактировано: видимо, имелось ввиду вот это http://www.gamedev.ru/code/forum/?id=87197 ?)
2 - вообще не понял, о чем речь, если честно...
3 - т.е., на каждом кадре вычисляем интерполированное состояние модели, забиваем его в вершинный массив, а уж потом выводим всё одним махом? Должно быть быстрее?
Отредактировано: 11.07.09 20:07
#3
аксакал
11.07.09 20:11
0
Если не будешь использовать VBO - ни о какой оптимизации можешь даже и не думать, а VBO тут применимо лишь напару с вершинным шейдером. Поэтому стоит не полениться и подучить матчасть.

1) Просто пересобрать меш, вершины имеющие несколько различных текстурных координат - продублировать.
2) Гугли NvTriStrip
3) Должно быть быстрее нежели чем тысячи вызовов glTexCoord/glVertex

#4
13.07.09 08:15
0
Уф. Написал код пересборки меша (при загрузке модели) и вывод через glDrawElements.
Тестил на 100 волчицах в кадре, у каждой в руках - автомат калашникова :) (т.е. суммарно 200 моделей в кадре).

На статике (вывод кадров анимации без интерполяции)
Было: 17 FPS
Стало: 55 FPS
Впечатляет.

На динамике (интерполяция)
Было: 11 FPS
Стало: 15 FPS
Не впечатляет.


(100 волчиц с автоматами в руках (200 моделей суммарно), полигонаж невысокий - изначально это была моделька в формате MD2 для Quake 2).

Получено на ноутбуке, со встроенной видюхой Radeon xpress 1150 и поцессор sempron 3200+.

Попробовал и с другими колличеством моделей - например, 25 моделей при выводе с интерполяцией дают 55 FPS, без неё - 185.

В общем, буду гуглить NvTriStripы и шейдерные конструкции... Как я понимаю, непосредственно интерполяцию быстрее сделать нереально (?), а это громаднейшее число вычислений в каждом кадре.
#5
13.07.09 12:48
0
можно заранее просчитать все кадры(фремы) увеличив их раза в 4, просчётов меньше(вообще убрать к чёртовой бабушке) но памяти расходоваться будет больше.....ещё попробуй сделать Vertex_Buffer_Object_Arb и каждый кадр "перезаливать" туда вертексы, ещё прирост будет....
#6
13.07.09 19:46
0
Хранить ВСЕ заранее просчитанные кадры (пусть даже с более низкой частотой) - оно конечно можно,... но расход памяти будет просто колоссальным, что не есть хорошо.
Статику тупо буду выводить с помощью VBO, а вот с динамикой ещё пошуршу...
XProger, lans Спасибо за рекомендации :)
#7
14.07.09 01:00
0
Реализовал VBO. Статика жутко обрадовалась, а анимации до фени)

В общем, вывод 100 волчиц с 100 автоматами, заметки начинающего :)

без анимации/вывод кадров через смещение:
Простое рисование: 17 FPS
Рисование через вертексные массивы : 55 FPS
Рисование через память видюхи (VBO): 80 FPS

с анимацией посредством интерполяции :
Простое рисование: 11 FPS
Рисование через вертексные массивы : 13 FPS
Рисование через память видюхи (VBO): 14-15 FPS

Правда, стоит учесть, что для интерполяции данные беру не из памяти видюхи, а храню отдельно. Ещё немного покопаюсь и переползу к шейдерам всерьёз, благо мне относительно простую вещь нужно реализовать (как мне кажется, пока почитал чуток про них).
#8
аксакал
14.07.09 03:27
0
Nubilius
Пересобрал меши с умом или как по той ссылке с геймдев.сру (VertexCount = TrianglesCount * 3)?
Как-то смутил низкий прирост от VBO...
#9
14.07.09 05:15
0
Ещё немного облагородил вывод - теперь даёт 30 FPS при выводе плавной анимации. Учитывая, что начинал с 11, прогресс налицо :)

XProger
Взял оттуда, переделав под себя. А как ещё можно пересобрать? :blush: Как я понял, нужно просто повторяющиеся вершины продублировать. А раз возрастёт число вершин, то и число Face возрастёт до числа TexFace, так? Или что-то ещё не учел? В идеале конечно нужно это писать не в загрузке модели, а предварительно конвертиовать, или вообще код скрипта переделать (конечно, он уже не будет таким простым, но результат того стоит, так что буду пилить).

До пересборки:
VertexCount = 387
FaceCount = 773
T_Count = 493

После пересборки:
VertexCount = 723
Остальное без изменений.

Правда, на Wingman's OpenGL ещё упоминалось, мол, можно пойти "иным путём" с использованием "шагов треугольника". И даже упоминается, что "Вы можете посмотреть урок "загрузка Quake BSP", чтобы увидеть этот процесс в действии.". Но вот беда - такого урока я не нашел... Так что вотъ.

Конечно, к шейдерам вершинным я всё-равно обращусь (мало ли, вдруг ещё поднимет скорость), но и текущей вариант (лично для меня)- достижение :ninja: .
Отредактировано: 14.07.09 05:39
#10
14.07.09 06:49
0
Nubilius
Скорость будет практически как при отрисовки статики.. Т.к собсно статикой и будеш отрисовывать, а будешь только параметры костей передавать...
#11
14.07.09 07:03
0
Тут не кости ведь, а вершины... изменяется положение всех вершин, их интерполяцией (как понимаю), в шейдерном варианте будет заниматься GPU, а не CPU, а значит фиг знает, достигнет ли скорость уровня статики... :huh:
#12
14.07.09 08:49
0
Впринципе тоже будет быстрее т.к ты передаш текушее положение вершил ч-з VBO и следующее(через вертексные атрибуты тоже через VBO) т.е Key Frame только передашь и потом только нужно передать коэффициэнт интерполяции.. Но всеровно каждый новый Key Frame нужно будет перезаливать VBO... Благо их не так много... А на счёт того что работу будет делать GPU а не CPU не переживай GPU будет намного быстрей делать эти операции даже с учётом того что ей придётся делать их намного чаше чем CPU...
#13
аксакал
14.07.09 09:14
0
Nubilius
Пересобираешь вроде адекватно, я вот так делаю.
FPS какой-то низкий для сотни таких низкополигональных моделей. Что за карточка?
#14
14.07.09 18:33
0
JKot
логично, ну, завтра увижу, сегодня нет времени на кодинг... "В жизнь пришла весна" (с)XProger (не дословно).

XProger
собственно я практически так и делаю, разве что переделал под несколько кадров, ну и повторяющиеся для разных кадров куски убрал.
Но у меня интерполяция делается так
1) По старому методу, из массива "Vertex" (НЕ VBO) высчитываю интеполяцию
2) Обновляю VBO через glBufferSubDataARB
т.е. mapping памяти не юзаю. Только вот понятие mappinga до меня не дошло - это копирование куска видеопамяти в оперативку, или даётся указательн, ведующий прямо в видео память? Просто в первом случае скорость ниже будет, поидее...
Статика же выдаётся как смещение, причем все вершины уже загнаны в VBO.
Плюс, все данные держу в разных буферах.
Ну и, напоследок - вывожу все модельки циклом for, причем для вывода каждой использую всё-таки glPushMatrix();/glPopMatrix(); (каждая моделька крутится и масштабируется отдельно).
Да, ещё - модельки несинхронно анимированны, в смысле - для каждой текщуий кадр анимации хранится отдельно.

Видеокарта - Radeon Xpress 1150 (ноутбук Dell Inspiron 1501), собственная память у видюхи отсуствует (так и не смог понять, если ли у неё своя память под FrameBuffer или нет, везде данные противоречивые, rivatuner любой версии её не узнаёт), она юзает кусок оперативки (до 256 мб. кушает из оперативы).
Отредактировано: 14.07.09 18:41
#15
14.07.09 20:59
0
Цитата(Nubilius @ Сегодня, 16:33)
[snapback]96124[/snapback]
Только вот понятие mappinga до меня не дошло - это копирование куска видеопамяти в оперативку, или даётся указательн, ведующий прямо в видео память?

Первое. Впрочем, если ты указываешь в флагах, что из VBO читать не будешь - просто выдаст новый кусок памяти, который потом отошлет в видяшку.
Цитата(Nubilius @ Сегодня, 16:33)
[snapback]96124[/snapback]
собственная память у видюхи отсуствует

Такие видюхи сильно медленные.
#16
14.07.09 21:10
0
Цитата(Vga @ Сегодня, 18:59)
[snapback]96126[/snapback]
Такие видюхи сильно медленные.

Я уже заметил, ноут не игровой, потом ещё потестю разницу на GeForce 6600...
#17
16.07.09 02:52
0
Всё-таки самые страшные тормоза вызывают не слабые видюхи, а кривые руки, способные даже самую хорошую идею завалить.
Я ещё раз перетряхнул код - и теперь волчицы выдают 49-52 FPS. А до шейдеров я так и не дошел, другие сейчас проблемы решаю...
P.S. Проверил с новым кодом, но без VBO. Не выше 18 кадров. Так что VBO - сила. Ч.т.д.
#18
16.07.09 07:00
0
Кстать, интересно, затестил сегодня, сотня волчиц в кадре+сотня автоматов (теперь ППШ дисковые :D), суммарный полигонаж ~93900 Face (40000 вершин).

На ноутбуке (AMD Sempron 3200+, 1 GB DDR2 RAM, интегрированная Radeon Xpress 1150 ):
Статика: 86-92 FPS
Анимация: 55-56 FPS

На настольном компе (P4 3.2, 1 GB DDR400, GeForce 6600 256 mb)
Статика: 86-92 FPS
Анимация: 84-85 FPS

О чем это интересно говорит? Юзание шейдеров уже почти бесполезно будет, т.к. скорость статики и динамики сравнялась O_o
#19
аксакал
16.07.09 07:34
0
Вертикальная синхронизация точно отключена? )
#20
16.07.09 15:07
0
Цитата
Юзание шейдеров уже почти бесполезно будет, т.к. скорость статики и динамики сравнялась O_o

ну, тесты в вакууме... ты возьми проц нагрузи чем-то еще помимо анимации, вот тогда fps сразу просядет :)
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}