Войти
ПрограммированиеФорумГрафика

Оптимизация рендеринга моделей

Страницы: 1 2 3 4 Следующая »
#0
18:55, 30 окт. 2009

Есть игровое пространство, для игры танчики. Все оно строится из одинаковых по размеру, но разных по форме, объектов. Каждый такой объект состоит из модели и натянутой на нее текстуры. Все объекты по смыслу и функционалу разбиты на группы и находятся в своих списках. Рендерятся они все по очереди, список за списком, объект за объектом. Оптимизация пока что одна - использование вбо. Дак вот, до вчерашнего дня про вбо только слышал и читал, использовал обычные вершинные буферы, вот и решил внедрять вбо у себя. После внедрения общая производительность не увеличилась, как было 38-40 fps (на моей GeForce FX 5200), так и осталось. Единственное что изменилось (это показало профилирование метода рендера Draw), дак это загруженность проца. Теперь метод Draw работает в два раза быстрее.
Вот теперь думаю, как бы еще оптимизировать, чтобы увеличить fps. Есть вариант создать еще один список, в который помещать объекты для рендеринга в порядке, определяемом сортировкой всех объектов по текстуре и модели. Поможет ли это существенно поднять fps?
Сейчас все объекты рисуются в разнобой, т.е. для каждого объекта bindится и текстура и вбо буфер. Может, стоит один раз забиндить текстуру, и отрендерить все объекты с такой текстурой, но с порядком определяемым сортировкой по моделям, чтобы и модели также bindились один раз для данной текстуры, потом переходить к следующей текстуре. А то где то проскакивало сообщение, что если bindится много раз подряд одна и та же текстура, то это может снижать производительность. Так ли это?


#1
19:42, 30 окт. 2009

louken
> Может, стоит один раз забиндить текстуру, и отрендерить все объекты с такой
> текстурой,
да и тоже самое с буферами геометрии.. один раз выставил, все такие модели нарисовал (в идеале)

#2
19:44, 30 окт. 2009

 L 
Спасибо, будем пробовать

#3
19:47, 30 окт. 2009

также тяжела смена фрагментного шейдера (вершинный полегче), дороги  и смены стейта девайса. 

#4
19:56, 30 окт. 2009

Ну шейдеров пока у меня нету, но все равно спасибо за информацию.

#5
20:44, 30 окт. 2009

 L 
Увеличится ли скорость отрисовки, если кроме сортировки использовать drawRangeElements, чтобы нарисовать всю геометрию с одинаковой текстурой и шейдером?
Есть предположение, что эта функция заменяет несколько вызовов drawElements, но профит неочевиден.

#6
21:36, 30 окт. 2009

Кстати, у меня тоже самое, причём рендерю один объект, а производительность такая же, как и через оперативку.
Почему это так (может из-за доубле буфера)? Тогда есть ли смысл использовать ВБО?

#7
0:23, 1 ноя. 2009

Сделал очередь рендера, теперь текстуры bindятся только по одному разу и модели bindятся, для данной текстуры, тоже однократно. Непомогло, FPS совсем не изменился, ну разве что в пределах погрешности. Видимо тормоз в чем то другом. Надо попробовать вставить сортировку от ближнего к дальнему.

#8
0:28, 1 ноя. 2009

louken
Сколько раз за кадр вызывается glDrawElements/DrawIndexedPrimitive?

#9
0:35, 1 ноя. 2009

San
> Сколько раз за кадр вызывается glDrawElements/DrawIndexedPrimitive?
glDrawArrays - для каждого объекта по разу. Пока объектов около 300.

#10
0:40, 1 ноя. 2009

Т.е. я bindю текстуру, bindю вбо, по разу для многих объектов, а потом рендерю сами объекты:

var OffsetPtr: PmtVertex_T2F_V3F;
begin
// ... Устанавливаю позицию ...
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
OffsetPtr := nil;
glVertexPointer(3, GL_FLOAT, SizeOf(TmtVertex_T2F_V3F), @OffsetPtr^.Point);
glTexCoordPointer(2, GL_FLOAT, SizeOf(TmtVertex_T2F_V3F), @OffsetPtr^.TexPoint);
glDrawArrays(GL_TRIANGLES, FIndex, FCount);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
end;
примерно таким образом

#11
0:48, 1 ноя. 2009

Вот примерно такая сценка получается:
04 | Оптимизация рендеринга моделей
Да простят меня авторы игры, из которой я выдрал модельки:-]. Использую их для разработки игры, пока еще свои модельки не будут сделаны.
Вобщем такая сцена рендерится всего с 40 fps, на GeForce FX 5200, с выключенной VSync, ничего другого, пока, не происходит в сцене.

#12
1:21, 1 ноя. 2009

Сколько полигонов в сцене? Думаю, на такой простенькой сцене тебя сортировки не спасут. Проблема скорей всего в другом месте.
В свое время тоже решил познать что такое VBO. Дело было на работе. Написал простенькую демку, в которой можно было переключать VA/VBO, с замером фпс + генератором меша. Видюха, как помню, была GF 7300LE, проц (что-то с двумя ядрами). Написал. Запустил и удивился. Свич с VA на VBO не давал прироста фпс нисколько. Проверял на диапазоне от 1 до 2кк полигонов -- тормоза VA == VBO. Пришел вечером домой, запускаю на своем компе(p4 Radeon9600 -- слабее тачка в несколько раз) и о чудо!. На 1кк полигонов я получаю прирост в разы. Тест еще на парочке компов дал теже результаты. Разбираться почему на рабочем компе нет профита не стал.

#13
1:35, 1 ноя. 2009

_sz
> Сколько полигонов в сцене?
Под полигонами понимается количество треугольников, так? На вскидку прикинул, примерно 6-8к.

#14
1:57, 1 ноя. 2009

1) геометрию положить в один вершинный буфер и биндить его 1 раз?
2) если камера предполагается такая, как на скрине, текстуры можно запихнуть в атлас
3) из неразрушаемых объектов можно сгенерировать один меш и рисовать за один glDrawArray

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.