И возвращаясь к теме хардварного скиннинга. Я начитался всяких статей по оптимизации и решил изучить это дело подробно. В частности, например утверждается, что стрипы работают быстрее фанов.
Ну это понятно почему происходит - стрипы более эффективно используют место, в результате в вертексный кэш влезает больше вертексов, а значит и скорость их обработки выше - за счёт того, что нам не надо трансформировать дважды (а то и трижды) уже оттрансформированные треугольники. Реализаций построения strip-sequence существует две штуки: NvTriStrip и TriStripper. Я не говорю, что нету каких-то других реализаций, просто на гей-деве рекомендует именно эти. Про них упоминается в лекции по повышению производительности, про них же упоминается в подсказках.
Три-стрип я качать не стал, поскольку это оффлайн-тулза, работает как и все тулзы от нвидии крайне неторопливо (я помню как nvdxt жевала текстуры по 20 секунд). Поэтому я сразу перешёл к проверке Tri STripper.
Тулза написана отвратительно. Во первых в качестве стандартных аргументов она принимает исключительно std::vector. Я мигом догадался, что её писали мудаки, после чего уже не рассчитывал на какие-либо прорывы. Так и оказалось . Эта зараза трудилась над многими моделями порядка 40-50 секунд, но на некоторых модельках проскакивала за тысячные доли секунды. Никакого прироста она мне так же не дала.
Тогда я подумал, что стрипы - это не самоцель, а всего лишь один из методов оптимизации вертексного кэша, что и являлось моей конечной целью. Тогда я скачал простейшую программку vcacheopt, реализованную в одном-единственном хидере. Программка тоже мудацкая, тоже хочет std::vector на вход. Ну да ладно. И вот какие интересные результаты она мне показала: 1 промах кэша на меш любого размера. Понимаете?
Ведь халфовские модели изначально содержат фан-стрип секвенции, для максимального увеличения производительности. Не стоит однако думать, что это изобретение самой вальвы. Код этот был написан Кармаком еще для первого квейка. Тем не менее меня полученный результат вполне удивил, поскольку еденичный промах кэша на моделях любого размера - это просто идеальный результат, вполне возможно я где-то ошибся при инициализации программы. Я еще раз всё перепроверил и отрисовал модельку с уже изменёнными индексами - модель не покорёжилась, фпс не изменился. Тогда я подумал, что возможно сам код неочень корректный и скачал Одну из версий реализации кода Linear-Speed Vertex Cache
Optimization от Tom Forsyth. Я честно игрался с размером вертексного кэша, но ни в одном случае не получил ни прироста ни падения фпс.
На основании проведённых исследований считаю возможным сделать заявление: халфовские модели достаточно неплохо оптимизированы для минимизации промахов вертексного кэша и любые сторонние оптимизации здесь излишни.
Впрочем, моё исследование нельзя признать совсем уж объективным - ведь я проводил его только на одной видеокарте. Ну чтож, давайте еще немного потестируем - я выложил в соседней теме очередное обновление бенчмарка.
Правила тестирования таковы:
1. запускаем бенчмарк, замеряем FPS в Hardware Mode.
2. выходим из программы (именно так! никаких рестартов и перезагрузок карты), открываем config.cfg и находим строчку vcache_size. По умолчанию она равна 32. Допустимые значения 10 - 64. Попробуйте подставить в переменную следующие значения: 10, 16, 24, 32, 48, 64. После каждого изменения следует сохранить config.cfg, запустить бенчмарк и замерить FPS в Hardware mode.
3. Если вы обнаружите серъезные отличия в FPS, ну например у вас было 100 фпс при vcache_size 32 и вдруг стало 180 FPS при vcache_size 10, то обязательно отпишитесь об этом. Если же при любых изменениях vcache_size результат колеблется в пределах 5-10 фпс, то сообщать об этом не следует, т.к. это укладывается в пределы погрешности.
Сразу предупреждаю - с большой долей вероятности никаких изменений большинство из вас не заметит. С меньшей долей вероятности могу сказать, что изменений не будет ни у кого, поскольку, повторюсь, студиомодельки изначально имеют оптимальный порядок следования вертексов и индексов, который не нуждается ни в каких дополнительных оптимизациях. При этом остаётся открытым вопрос, каким же образом ребята с гей-дева таки получали ощутимый прирост, который заметен не на словах, а вполне на деле (есть демка в соответствующей теме, её можно скачать и убедиться самому). Но тут у меня два дополняющих варианта. Во первых все эти изыскания по производительности проводились в 2005-2006 годах и как следствие ситуация могла в чём-то измениться. А во вторых, тамошний народ обожает юзать текстовые некомпилированные модели, например формата OBJ. Это просто такой дамп треугольников, навроде SMD. Кстати SMD они тоже любят грузить самостоятельно. Я ни разу не видел, чтобы кто-то где-то юзал mdl, но зато есть статьи посвящённые загрузке SMD движком. Откуда такая любовь к сырью - понимать отказываюсь. Возможно это doom головного мозга.
Ну так вот - возвращаясь к проблеме, модели такого типа, естественно не имеют ровным счётом никаких оптимизаций, это просто накиданные как попало треугольники и после прогонки этой кучи через оптимизатор, получение положительных результатов становится вполне реальным.
Чего не скажешь о халфовских студиомоделях.
Ну вроде всё сказал, тестируем, отписываемся, в случае получения каких-либо положительных результатов.
Дядя Миша писал: Откуда такая любовь к сырью - понимать отказываюсь. Возможно это doom головного мозга.
Ларчик, как всегда, открывается просто. MDL - проприетарный формат Valve, и его запрещено использовать в сторонних движках. Признайся, ты думал, что я в волатиле свой формат моделей из вредности или из тупости придумал?
Я, честно говоря, сколько ни читал про эти оптимизации под кэш - так и не нашёл информации об их пользе на более или менее современном железе. Вроде как размер кэша на Unified shader architecture не ограничен, и все эти "идеальные цифры" - просто результат тестов на предмет "с каким магическим числом работает лучше".
Добавлено 07-02-2014 в 02:45:
А вообще молодец, что начал статьи читать. Это полезное дело. Раньше ты надо мной смеялся, мол, зачем это всё читать, я вон лучше в сорцах чьих-нибудь погляжу, а теперь видишь как.
Единственное, что я хочу сказать - актуальность статей 10-летней давности и более ранних зачастую под вопросом.
Дядя Миша писал: Индексы в OBJ пишутся? Или самому надо генерить?
Там они подразумеваются. Тупо строчка за строчкой с токеном "v".
Цитата:
v -0.5 0.5 -0.5
v -0.120537996 -0.137472004 0.519999981
v -0.120537996 -0.102374002 0.519999981
v 0.0694542006 0.136417001 0.519999981
...
И соответственно у полигонов:
Цитата:
f 2 5 6 1
f 2 3 4 1 6 5
f 7 17 16 15 14 13 12 11 10 9 8
...
Добавлено 07-02-2014 в 00:01:
Цитата:
XaeroX писал: Я, честно говоря, сколько ни читал про эти оптимизации под кэш - так и не нашёл информации об их пользе на более или менее современном железе.
В волатиловских модельках не будет этой оптимизации?
XaeroX писал: MDL - проприетарный формат Valve, и его запрещено использовать в сторонних движках
Может с сорсовским форматом дело именно так и обстоит, но первохалфвоский формат моделек юзают довольно многие и никому ничего за это не было. Да и как он может быть проприетартным, ежели по нему есть полные спеки. Частично это alias из первокваки, частично структуры из древного 3д-макса. Я так это понимаю.
Цитата:
XaeroX писал: Признайся, ты думал, что я в волатиле свой формат моделей из вредности или из тупости придумал?
Вообще не задумывался. Ну придумал и придумал.
Цитата:
XaeroX писал: А вообще молодец, что начал статьи читать. Это полезное дело. Раньше ты надо мной смеялся, мол, зачем это всё читать, я вон лучше в сорцах чьих-нибудь погляжу, а теперь видишь как.
Очевидно, что я начал читать эти статьи тогда, когда не нашёл ответа в сорцах
Сорцы для меня попрежнему приоритетнее статей, поскольку на словах можно рассуждать как угодно, а практическая реализация порой имеет с этим мало общего. Не доверяю я словам.
Цитата:
XaeroX писал: Единственное, что я хочу сказать - актуальность статей 10-летней давности и более ранних зачастую под вопросом.
Я это учитывал при свои исследованиях, разумеется.
Товарищи, вот объясните мне что у вас с головой?
Пишу прямым текстом:
Цитата:
Дядя Миша писал: Если же при любых изменениях vcache_size результат колеблется в пределах 5-10 фпс, то сообщать об этом не следует, т.к. это укладывается в пределы погрешности.
Цитата:
Дядя Миша писал: тестируем, отписываемся, в случае получения каких-либо положительных результатов.
Два раза написал - если нету изменений, то отписываться не надо.
И что вы пишите?
Цитата:
nemyax писал: В тесте с жонглированием размером кеша во всех случаях (10, 16, 24, 32, 48, 64) около 467.
Цитата:
LokiMb писал: 318 во всех случаях
Цитата:
Government-Man писал: Попробовал разные размеры кэша - ФПС около 647 и не меняется.
Ну ладно бы, фанат лошадок с головой не дружил, нео ведь серъезные уважаемые люди не способны ВДУМЧИВО ОСОЗНАТЬ ПРОЧИТАННОЕ.
Я не знаю, вы может посты набиваете? Или это какой-то коллективный разум?