Тяжела и неказиста жизнь GFX программиста

Сидел за компьютером, пытался оптимизировать наш проект. Аллоды Онлайн, проект в чем-то похож на WoW. Открытые пространства, террейн, в кадре полтысячи объектов на нем. Освещение в лайтмапах, Dx9. Вся эта красота жрет 40% времени в драйвере NVidia, 10% времени в D3D9.dll.

Руки опускаются – это говно, которое называется графикой на PC, невозможно оптимизировать. Под катом – плач и сожаления.

Наперво замечаю, что драйвер видяхи в ядре не просто бессмысленно и уныло дрочит, ожидая изменения volatile переменной, а занимается полезной деятельностью. Хот-спот от VTune – это 6 movups + 6 movaps в цикле – memcpy, видать.

Читатель наверняка ожидает от меня разоблачения драйвера. А вот фиг. Не знаю я, что там драйвер копирует. Эмбедит константы вершинных шейдеров в командный буфер? Эмбедит вершинный шейдер в командный буфер? Копирует пиксельный шейдер а потом патчит константы? Не знаю я. Что мог подпереть – подпер. Вон, в пиксельном шейдере константы не меняю почти. Вершинный шейдер редко меняю тоже.

Я легко руками могу сделать командный буфер для этой дурацкой G70. Но понять, что именно делает драйвер из моих безобидных D3D9 вызовов, я не могу. Запускать kernel debug ( а он требует второй машины и нетривиального сетапа ) и копаться в голом коде без символов – это выше моих слабых сил и больше моей  лени.

Даже если найду причину тормозов в драйвере, то как лечить – лично мне совершенно непонятно.

Отлично, на низком уровне ( тупо переупорядочивая D3D вызовы ) оптимизировать нельзя. Давайте на высоком уровне оптимизировать. Десять одинаковых елок стоят на уровне?  У каждой елки свой вершинный лайтмап, свои матрицы. И свой индексный буфер, предрасчитаный на 3 уровня LOD. Инстансинг, говорите? Ах, не смешите.

Еще, не дай Бог, для каждого объекта появляется свой набор локальных источников света. С источниками света вообще туши свет.

Есть еще такая оптимизация – слить все кусками в вершинный буфер и генерировать индексы на лету. Разбивать на корзины по динамическим характеристикам. Если идти этим путем – то можно даже додуматься считать освещение от локальных источников света на CPU, кешировать его. Это не ахтунг, это алярм.

Вот тупая такая задача, прошлого века задача. Есть тысяча одинаковых объектов с разными матрицами трансформации, есть много точечных источников света. Надо нарисовать, с простым вершинным освещением. Без всякого бампа, без всяких изысков. Что-нибудь изменилось за последние десять лет в способах решения этой задачи? Да хрен там. Говорите, deferred освещение? Пусть прозрачные объекты еще есть в сцене. Для красоты.

Стоит на домашнем столе PS3.  Могу нарисовать на ней хоть тысячу объектов, хоть десять тысяч. На SPU освещение посчитать. Отсортировать по текстуркам, если DIPы попрут. Прозрачные объекты отсортировать тоже могу. Вблизи могу отсортировать на уровне полигонов прямо. Можно, наконец, делать игру про большие пространства с кучей объектов и с динамическим освещением.

Я конечно понимаю, мне сейчас скажут про DX10, про DX11, про прогресс. Про мощь GPU и многоядерность CPU, про многопоточное заполнение дисплейлистов и цену DIP.

Я послушаю-послушаю, а завтра с новыми силами буду чинить нечинимые тормоза. За то зарплату и платят, ага.

  • kayru

    А у самой нвидии спрашивал? Возможно, они смогут что-то подсказать на основе пикс-дампа?

  • IronPeter

    Мне известно несколько шаблонов взаимодействия с NV.

    Шаблон первый – это автоматизированные “отчеты о производительности”, которые в свое время можно было получить с московского офиса. Много красивых графиков на разном железе. Автоматизированный дамп с NVPerfHUD, не более того.

    Шаблон второй – это специальные умные люди из NV, которые приезжают делать фичи на топовом железе. DX10 так пропихивали.

    Я не знаю шаблона взаимодействия, чтобы тратилось время квалифицированного специалиста на решение рутинных задач. Тормозит у всех, NV одна.

  • http://zeux.livejournal.com/ Zeux

    Мы вот не умеем пока десять тысяч объектов нарисовать. Ну точнее умеем, но меееедленно…
    Зато шейдеры патчить уже научились!

  • Aliot

    Петр!
    Не мог бы ты набрать мой телефонный номер? В контексте “больших пространств с кучей объектов и с динамическим освещением” на PS3.
    Никак не могу связаться с тобой.
    +7 916 685 25 63 – телефон
    163605134 – аськ

    Заранее благодарен.

  • kayru

    2IronPeter
    Есть еще паттерн когда ты пишешь непосредственно кому-то из девелопер саппорта. Можно общаться, как-раз, на тему странного поведения драйверов и утилит.
    Не знаю как с этим в России, правда.

  • KPAH

    очень похоже что там тупо выравниваются данные: драйверу дали к примеру вертекс лист не выровненный на 16 байт вот он и фигачит movups/movaps.

  • AK

    Izvestnaya problema, skoree vsega na ATI ne proyavliaetsia. NV driver schitaut chto tvoi index buffera – dinamicheskie i kopiruut iz nix indeksi v command buffer. Ubedis’ chto ti delaesh Lock() index bufferu tol’ko odin raz posle ego sozdaniya, dolzhno pomoch’

  • tomat

    2IronPeter
    а нарисовать все пачками в текстуры и повывешивать билборды?
    ну и апдейтить их иногда

  • IronPeter

    AK, по поводу индексов – веселая идея, что-то такое слышал. Погляжу. Драйверок чтоли написать, чтобы командный буфер дампил.

    Меня бесят такие методы решения простых проблем.

    tomat, наверное можно, чисто теоретически, но мне оно не нравится. Лаги при повороте камеры ( или слишком большой расход памяти ), неконтролируемый расход памяти / качество.

  • IronPeter

    Мистика, мистика.

    В экранном режиме сладкая парочка movaps-movups существует независимо от флагов Lock, пула для буферов, etc. Если сделать дипы по одному треугольнику, то сладкая парочка исчезает.

    В полноэкранном режиме ( тупо пересоздание устройства ) сладкая парочка не замечена ни при каких условиях и fps примерно в полтора раза больше.

  • CEMEH

    Any chance it’s Vista?…

  • IronPeter

    До нашей глуши она исчо не дошла. XP.

  • http://assen.shtrak.com/ YE

    The NVIDIA dev support isn’t what it used to be – I’m waiting two weeks for a simple NVDXT fix which shouldn’t take more than 15 minutes if somebody still remembers how to compile it. Years ago, the previous NVDXT maintainer used to email me new versions with requested features just hours after I emailed him…

  • http://_foreseer.livejournal.com Foreseer

    гы. welcome to the club :) Чую, скоро оставишь свой идеализм и отряхнешь от пыли пресловутый mmx-ный код :)

    не очень понятно почему ты пишешь об отсутствии прогресса в контексте pc, ведь, наверно, сейчас ты можешь рассчитывать на гарантированное наличие pixel shader-ов 2.0! :)

    с nv еще есть шаблон “написать программу, в которой добавление одной строчки вызывает ошибку и снабдить ее комментарием что именно сломано” в результате всего через год бага будет исправлена в очередных драйверах и еще через год можно попытаться рассчитывать на то, что все успели обновить драйвера :)

    на экранный режим предлагаю забить.

  • IronPeter

    Я немного неправильно написал. Не “экранный режим”, а “оконный”. Надеюсь, все поняли правильно. Отказаться от него не могу, так как рабочий режим для игры – именно оконный. С точки зрения маркетинга.
    Шейдеры 2.0 это хорошо, но на нашей заявленной минимальной конфигурации ( NV 5xxx ) нужно писать на 1.3-1.4. Иначе не взлетит.
    Есть ощущение, что mmx не решение. Тормозной. И считай не поддерживается на платформе x86.
    Есть более другое решение. Отказаться от PC. Быть на 6 SPU и RSX. Не думаю, что там сильно проще, однако. Ты там останешься один-на-один с хардверными багами, без содомистской прослойки драйверов.

  • look4awhile

    c хардверными багами нетяжело. тяжелее с чёрным ящиком, глючным и тормозным.

  • IronPeter

    Проблема с movups – movaps исчезла. Буквально рассосалась, без участия с моей стороны. Я чуть меньше рендерстейтов стал устанавливать – она и исчезла.

    Ежели та PS3 – это черный глючный тормозной ящик…

    То тут этот ящик аккуратно завернут в ватное одеяло, и с ним как-то предполагается работать, через одеяло. Причем иногда один ящик целиком завернут, иногда два, иногда осьмушка.

    Чем больше я программирую, тем больше у меня удивления: “КАК ЖЕ, БЛЯТЬ, ОНО ВООБЩЕ РАБОТАЕТ?!”

  • Aliot

    Я думаю, Боря имел в виду PC, а не PS3. PS3 не тормозная, а девкит хоть и тяжелый (20кг), но не черный.

  • http://aruslan.livejournal.com/ aruslan

    Как это не черный?
    Или ты про растаможку?