Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Поиск узкого места в производительности (2 стр)

Поиск узкого места в производительности (2 стр)

Страницы: 1 2 3 4 5 Следующая »
Роман ШуваловУчастникwww6 окт. 201713:19#15
innuendo
> ну не так пошло, не так :)
Т.е. если если возможность отсортировать и рисовтать только видимое, этого делать не надо и отправлять на отрисовку вообще всё, даже заведомо невидимое? Поясни.
innuendoПостоялецwww6 окт. 201713:21#16
Роман Шувалов
> Т.е. если если возможность отсортировать и рисовтать только видимое, этого
> делать не надо и отправлять на отрисовку вообще всё, даже заведомо невидимое?
> Поясни.

если камера статична, то в принципе можно

nonamezeroxПостоялецwww6 окт. 201713:24#16
Роман Шувалов

> перед носом у игрока может быть очень много объектов

> т.к. геометрия генерированная

А в процессе генерирования считать min/max по x,y,z, получив таким образом bounding box - не? Который потом и использовать для отсечения объектов?

innuendoПостоялецwww6 окт. 201713:24#17
Роман Шувалов

камера статична ?

nonamezeroxПостоялецwww6 окт. 201713:27#18
Роман Шувалов

Ты.
Для.
Каждого.
Объекта.
Находишь.
Bounding-геометрию.
Через фрустум проверяешь именно её.
Bounding-геометрию.
Не полигоны твоих моделей.
А Bounding Box, bounding Sphere и bounding cylinder.
Алгоритм нахождения наиюольшего числа в массиве знаешь? Ну там

for(int i = 0;i< arraysize;i++){
 if(x[i] > max){
 max = x[i];
 }
 if(x[i] < min){
 min= x[i];
 }
}

После чего,только ту геометрию, чьи bounding box прошли тест фрустумом уже отправляешь рисовать видеокартой.

Правка: 6 окт. 2017 13:32

innuendoПостоялецwww6 окт. 201713:29#19
делаем ставки в чём проблема :)
WraithПостоялецwww6 окт. 201713:54#20
Ставлю 3кг отстоя на
>GPU Intel HD4000
nonamezeroxПостоялецwww6 окт. 201714:07#21
Роман Шувалов
> если если возможность отсортировать и рисовтать только видимое

То для динамической камеры ты будешь каждый кадр  заново сортировать полигоны, после прогона через умножение на матрицу модель-вид-проекция на CPU. 

Роман ШуваловУчастникwww6 окт. 201714:57#22
nonamezerox
> для динамической камеры ты будешь каждый кадр заново сортировать полигоны
Я же написал, сортировать ровно 1 раз при загрузке.

Словами описать сложно, вот картинка. 5х4 = 20 сегментов. Каждый сегмент - VBO, с набором индексов для разных углов (например, 12 массивов: для 0..30°, 30..60° и т.д.). Фрустумом определяю сегменты, попавшие в кадр, и через glDrawElements() рисую те массивы индексов, углы которых "смотрят" в камеру.

Все объекты статические, камера динамическая.

My Frustum | Поиск узкого места в производительности

DampireУчастникwww6 окт. 201715:13#23
Роман Шувалов
Что ж ты творишь то, мать твою? Они и без тебя прекрасно отсекаются.
MisanthropeПостоялецwww6 окт. 201715:17#24
Роман Шувалов
> GPU Intel HD4000
гыгы, я тоже сейчас этой штукой трахаюсь, но мне именно филрейт на ретине жить не дает))
Роман ШуваловУчастникwww6 окт. 201715:18#25
Dampire
> Они и без тебя прекрасно отсекаются.
Ну так их много же и все статичные. И я заранее знаю, будут ли они отсекаться или нет. Я не пойму, почему меня тут пытаются убедить продолжать скармливать видеокарте то, что она заведомо отсечёт.
DampireУчастникwww6 окт. 201715:23#26
Потому что надо делать vbo и ebo, а не заливать индексы на видеокарту каждый кадр.
nonamezeroxПостоялецwww6 окт. 201715:24#27
Роман Шувалов

То есть у тебя половина отправленых на рендер сегментов, судя по картинке,  не попадает в камеру, ооок.

А теперь смотри фокус-покус

Картинка | Поиск узкого места в производительности

Это просто отсечение bounding volume по фрустуму

Правка: 6 окт. 2017 15:25

Роман ШуваловУчастникwww6 окт. 201715:26#28
Dampire
> а не заливать индексы на видеокарту каждый кадр.
Да ёшкин крот, с чего вы взяли что я делаю это каждый кадр? VBO и индексы залью я ровно один раз - при загрузке уровня. Далее буду только вызывать нужные мне индексы для нужных углов. Каждый кадр не будет делаться вообще ничего.

nonamezerox
> А теперь смотри фокус-покус
Предлагаешь сделать несколько сотен тысяч VBO для каждого объекта и проверять его на фрустум вручную на CPU? Не, не годится. И в реальности у меня сегментов будет побольше, так что число твоих красных крестиков в итоге будет небольшим.

nonamezeroxПостоялецwww6 окт. 201715:38#29
Роман Шувалов
> Предлагаешь сделать несколько сотен тысяч VBO для каждого объекта и проверять
> его на фрустум вручную на CPU? Не, не годится. И в реальности у меня сегментов
> будет побольше, так что число твоих красных крестиков в итоге будет небольшим.

Предлагаю для каждого объекта посчитать bounding box. Это делается в процессе этой твоей генерации наилегчайшим алгоритмом вида

GenerateNewVertex(...){

...
vec3 min, max;

min.x = min.x < newvertex.x ? newvertex.x:min.x;
min.y = min.y < newvertex.y ? newvertex.x:min.x;
min.z = min.z < newvertex.z ? newvertex.x:min.x;
max.x = min.x > newvertex.x ? newvertex.x:min.x;
max.y = min.y > newvertex.y ? newvertex.x:min.x;
max.z = min.z > newvertex.z ? newvertex.x:min.x;


}

На выходе мы получим два vec3, описывающих параллелипипед AABB, в который помещается твой объект.

И фрустумом мы проходимся по этим самым коробкам, где алгоритм примерно таков:

int FrustumAABBIntersect(Plane *planes, Vector &mins, Vector &maxs) { 
   int    ret = INSIDE; 
   Vector vmin, vmax; 

   for(int i = 0; i < 6; ++i) { 
      // X axis 
      if(planes[i].normal.x > 0) { 
         vmin.x = mins.x; 
         vmax.x = maxs.x; 
      } else { 
         vmin.x = maxs.x; 
         vmax.x = mins.x; 
      } 
      // Y axis 
      if(planes[i].normal.y > 0) { 
         vmin.y = mins.y; 
         vmax.y = maxs.y; 
      } else { 
         vmin.y = maxs.y; 
         vmax.y = mins.y; 
      } 
      // Z axis 
      if(planes[i].normal.z > 0) { 
         vmin.z = mins.z; 
         vmax.z = maxs.z; 
      } else { 
         vmin.z = maxs.z; 
         vmax.z = mins.z; 
      } 
      if(Vector::DotProduct(planes[i].normal, vmin) + planes[i].d > 0) 
         return OUTSIDE; 
      if(Vector::DotProduct(planes[i].normal, vmax) + planes[i].d >= 0) 
         ret = INTERSECT; 
   } 
   return ret;
} 

И даже сотни тысяч коробок спокойно скушаются твоим процессором.

Предлагаешь сделать несколько сотен тысяч VBO для каждого объекта и проверять его на фрустум вручную на CPU?

Не пойму, ты упорно путаешь вызов DrawArrays и VBO, по ходу.

Нахера тебе сотни нефти VBO, если ты можешь ну вот все объекты в один VBO запихнуть и затем glDrawArrays(Elements), в которых ты задаешь и с какой вершины в буфере(то бишь какой объект, есличо) и сколько вершин (тог есть где твой объект заканчивается и начинается следующий)

Правка: 6 окт. 2017 15:44

Страницы: 1 2 3 4 5 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр