четверг, 26 августа 2010 г.

Slow GLSL linking

Я только диву даюсь, какие сюрпризы можно отгребрать, юзая ГлюкоGL.

В портируемом рендерере кости для персонажей заливаются небольшими порциями: по 15-50 костей на секцию (лицо, руки, ноги и т. д.) Вот пришла в голову такая оптимизация: кости для всех видимых в кадре skinned персонажей заливать за один "присест" в bindable buffer, а в шейдере использовать offset для выборки. Т. к. костей (матрицы 3x4) много (> 5000), то по идее мы нехило разгружаем драйвер, делая такой батчинг. В D3D9 так поступить не смогли, ну а тут сам бог велел: у нас GLSL + SM 4.0 min. sys. req.

Т. к. float4 получается много (5000 * 3 = 15000 и более), а максимальный размер bindable buffer - 4K float4, то пришлось использовать 5 буферов, и хранить дополнительно индекс буфера, из которого шейдер должен сделать выборку. И вот тут то у меня и ждал "приятный сюрприз": время компоновки шейдеров при использовании магических строчек вида
bindable uniform vec4 bones[4096];
начало дико увеличиваться: для ~100 пар vs/ps с 10 с. до 10 минут! Да-да. Меняю размеры буферов и их количество до одного - время уменьшается. OMFG, что же ты там, зараза, можешь такое делать?! Какой индус решил повы*быв***ся своими знаниями в оптимизации кода при компоновке этих шейдеров? Эту компоновку, как известно, все нормальные разработчики видели в гробу, в белых тапочках... Короче кидаюсь на Mac, начинаю лихорадочно проверять работу кода на GF и ATI - всё нормально, ~100 пар линкуется за 5 с! Слава фюреру Стиви, в Apple следят за качеством OpenGL драйверов.

Ну хоть батчинг не придётся сливать в унитаз, а вот отладка в Windows превратилась в кошмар - > 10 мин на загрузку уровня.

7 комментариев:

  1. > Ну хоть батчинг не придётся сливать в унитаз, а вот отладка в Windows превратилась в кошмар - > 10 мин на загрузку уровня.

    Но линковку из рантайма ведь никак не выкинуть? Т.е. в релизе тоже 10 минут??

    ОтветитьУдалить
  2. Тормозит glLinkProgram(). Поэтому всё равно, какая конфигурация. Но важен только Mac (Windows - для отладки), на котором этой проблемы нет.

    ОтветитьУдалить
  3. И причём тут OpenGL? Тут уместен заголовок: "Slow fucking Windows(TM)", не?

    ОтветитьУдалить
  4. Разработчики из Microsoft никак не контролируют, что происходит в закрытых драйверах NVidia. При чём тут Windows?

    ОтветитьУдалить
  5. Ну, ну, не будем так наивны, хех)

    ОтветитьУдалить
  6. Компилятор GLSL (Cg) поставляет NVidia. Как он реализован для Windows - думаю до этого MS нет никакого дела.

    ОтветитьУдалить
  7. Недальновидные люди есть везде. В том числе и в Microsoft.

    http://discussms.hosting.lsoft.com/SCRIPTS/WA-MSD.EXE?A2=ind1012A&L=DIRECTXDEV&F=&S=&P=4323

    ОтветитьУдалить