В портируемом рендерере кости для персонажей заливаются небольшими порциями: по 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 с! Слава
Ну хоть батчинг не придётся сливать в унитаз, а вот отладка в Windows превратилась в кошмар - > 10 мин на загрузку уровня.
> Ну хоть батчинг не придётся сливать в унитаз, а вот отладка в Windows превратилась в кошмар - > 10 мин на загрузку уровня.
ОтветитьУдалитьНо линковку из рантайма ведь никак не выкинуть? Т.е. в релизе тоже 10 минут??
Тормозит glLinkProgram(). Поэтому всё равно, какая конфигурация. Но важен только Mac (Windows - для отладки), на котором этой проблемы нет.
ОтветитьУдалитьИ причём тут OpenGL? Тут уместен заголовок: "Slow fucking Windows(TM)", не?
ОтветитьУдалитьРазработчики из Microsoft никак не контролируют, что происходит в закрытых драйверах NVidia. При чём тут Windows?
ОтветитьУдалитьНу, ну, не будем так наивны, хех)
ОтветитьУдалитьКомпилятор GLSL (Cg) поставляет NVidia. Как он реализован для Windows - думаю до этого MS нет никакого дела.
ОтветитьУдалитьНедальновидные люди есть везде. В том числе и в Microsoft.
ОтветитьУдалитьhttp://discussms.hosting.lsoft.com/SCRIPTS/WA-MSD.EXE?A2=ind1012A&L=DIRECTXDEV&F=&S=&P=4323