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

Производительность при отрисовке геометрии.

Страницы: 1 2 38 9 Следующая »
sanПостоялецwww6 дек. 201819:38#0
Раньше я имел дело в основном с фрагментными и компьют шейдерами, там скорость рендера напрямую связана с производительностью видеокарты. Грубо - умножаешь частоту на число коров и получаешь примерную оценку скорости работы. Теперь мне пришлось подняться на этаж выше и соорудить полноценную сцену. Вот тут меня ждал сюрприз - скорость отрисовки треугольников похоже почти не зависит от видеокарты. Что вообще-то очень странно. У меня не самая сложная сцена - 200.000 треугольников. Вывод такой сцены на Titan Xp занимает порядка 4-5 мс, что для случая ВР неприемлимо (там на два глаза дается 11 мс). Стал разбираться в чем дело и для начала сменил видеокарту на более слабую. Но скорость по сути не изменилась!
Вот картинка для AMD R9 Nano (далеко не самая быстрая видеокарта):

AMD_nano | Производительность при отрисовке геометрии.

а вот для Titan-V (быстрее карты пока нет)

Titan-V | Производительность при отрисовке геометрии.

Как говорится - найдите разницу. Если смотреть с микроскопом, то Титан-V быстрее где-то процентов на 5. Но не в 4 раза как я ожидал и как показывают все тесты на уровне пиксельных шейдеров.

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

Кстати включение-выключение MSAA 4x4 практически не влияет на скорость (изменение процентов на 10), значит вклад фрагментных шейдеров в общую скорость минимален.

Правка: 6 дек. 2018 19:43

MrShoorУчастникwww6 дек. 201820:57#1
san
> Как видно из графиков, CPU тут не загружено, значит дело не в нем.
Не видно. Помимо очереди адаптера нужно приводить графики своего приложения, в котором видно frame termination пакет. А еще желательно F8 прожать, чтобы был виден VSync.

Правка: 6 дек. 2018 20:58

sanПостоялецwww6 дек. 201821:25#2
MrShoor
> Не видно. Помимо очереди адаптера нужно приводить графики своего приложения, в котором видно frame termination пакет.
Нижняя строчка это загрузка процессора. Когда работает видеокарта процессор ждет (стоит Fence), что и видно на графике. Сама по себе работа CPU занимает 3 мс в начале цикла и потом идут 4 пакета проверки попадает ли обьект в фрустум. Два первых раза это лучи с очень узким фрустумом, потом собственно рендер для каждого глаза. Их тоже видно, они где-то по 200-300 мкс. В конце идет вывод на контрольный экран. Все, более ничего процессор не делает.

>А еще желательно F8 прожать, чтобы был виден VSync.
Желательно, но увы невозможно. Это Окулус, у него свой драйвер и его синк не попадает в профайлер.

Правка: 6 дек. 2018 21:25

MrShoorУчастникwww6 дек. 201821:59#3
san
> Нижняя строчка это загрузка процессора.
Но ведь интересна не загрузка процессора, а загрузка GPU. А её здесь не видно, потому что нет ни VSync-а, ни frame terminator-а. Просто два прямоугольника непонятно чего.

> Желательно, но увы невозможно. Это Окулус, у него свой драйвер и его синк не попадает в профайлер.
А если этот же рендер запустить на обычной видеокарте?

sanПостоялецwww6 дек. 201822:09#4
MrShoor
> Но ведь интересна не загрузка процессора, а загрузка GPU. А её здесь не видно,
Загрузка GPU это верхняя строчка. Там где Hardware Queue.  WPR это очень мощный тул который детально показывает загрузку всего - и CPU и GPU.  После просмотра с помощью GPUview все отлично видно, не понимаю что вам еще не хватает. Vsync может дать только синхронизацию начала цикла, что в данном случае некритично. Фактически Vsync для окулуса идет каждые 11 мс (90 fps), но поскольку время рендера немного вылазит за это значение, реальный вывод идет с частотом 45 fps.

>А если этот же рендер запустить на обычной видеокарте?
Ты понимаешь о чем говоришь? Что значит "запустить на обычной видеокарте"? Оно и так запущено на обычной видеокарте, просто она присоединена к экрану Окулус. Экран в данном случае совершенно не важен, это устройство пассивное.

Правка: 6 дек. 2018 22:11

kasПостоялецwww6 дек. 201822:16#5
san
> WPR это очень мощный тул который детально показывает загрузку всего - и CPU и
> GPU
не понятно тогда что ты тут делаешь, если там так все детально и понятно

san
> Ты понимаешь о чем говоришь? Что значит "запустить на обычной видеокарте"? Оно
> и так запущено на обычной видеокарте, просто она присоединена к экрану Окулус
ну так отсоедини и померяй нормально. ЧСВ неплохо бы еще чуть поуменьшить, для начала

MrShoorУчастникwww6 дек. 201822:26#6
san
> После просмотра с помощью GPUview все отлично видно, не понимаю что вам еще не хватает.
Я тебе написал чего мне не хватает. Перечитай моё сообщение еще раз, если не дошло.
Так же возможно ты не умеешь пользоваться GPUview, если считаешь что на твоем скриншоте все видно.

> Ты понимаешь о чем говоришь? Что значит "запустить на обычной видеокарте"? Оно
> и так запущено на обычной видеокарте, просто она присоединена к экрану Окулус.
> Экран в данном случае совершенно не важен, это устройство пассивное.
Я не в курсе как там оно у окулосов, отдельная видеокарта или нет. Я предлагаю тебе для начала проверить твое приложение без окулуса. Есть проблема или нет. Еще предлагаю отснять нормальные логи в GPUView. Но лично ты конечно можешь продолжать говорить, что это хороший скриншот и все видно.
Я поддержу пожалуй kas, непонятно зачем ты вообще зашел на этот форум. Тебе тут пытаются помочь, и просят больше данных, а ты: "довольствуйтесь чем есть, там все хорошо". Ну хорошо, значит хорошо, мог бы и не отвечать на мой пост вообще.

sanПостоялецwww6 дек. 201822:41#7
kas
> не понятно тогда что ты тут делаешь, если там так все детально и понятно
Я не в работе профайлера разбираюсь, я привел графики, что бы показать, что две разные видеокарты с производительностью отличающееся в 4 раза выдают одинаковое время на том же самом приложении. Меня интересует как это можно обьяснить и если можно, то как можно ускорить работу. Само по себе приложение очень просто - посылает на отрисовку 200.000 треугольников (600.000 вершин). Всего 60 поверхностей (27 моделей).
Вот рендер сцены:
void Room_Scene::Render(XMMATRIX* projView, vec4 dir, vec4 atr, vec4 pos)
{
  for (int i = 0; i < Models.size(); i++)  // всего 27 моделей
  {
    Models[i]->Render(projView, dir, atr, pos, &frustum, activeCmdList);
  }
}
Вот рендер модели:
void Model::Render(XMMATRIX * projView, vec4 dir, vec4 atr, vec4 pos, BoundingFrustum *frustum, ID3D12GraphicsCommandList* CommandList)
{
...
  activeCmdList->IASetIndexBuffer(&IndexBufferView);
  activeCmdList->IASetVertexBuffers(0, 1, &VertexBufferView);
  for (int i = 0; i < m_Surface.size(); i++)
  {
    if (frustum) {
      BoundingBox box;
      m_Surface[i].BOX.Transform(box, XmodelMat);

      if (frustum->Contains(box) == DISJOINT)
        continue;
    }
    activeCmdList->DrawIndexedInstanced(m_Surface[i].size, 1, m_Surface[i].offset, 0, 0);
  }
}

Вертексный шейдер только умножает на матрицу, пиксельный - читает текстуру. Короче проще не бывает.
Почему время работы не зависит от видеокарты я убей не понимаю...

>Я предлагаю тебе для начала проверить твое приложение без окулуса. Есть проблема или нет. Еще предлагаю отснять нормальные логи в GPUView. Но лично ты конечно можешь продолжать говорить, что это хороший скриншот и все видно.
Я могу прислать полный лог, это портянка на два экрана, но что он вам может дать? Вопрос не в Окулусе, вопрос в производительности работы по отрисовке треугольников. Я не знаю - может так и должно быть и скорость карты не влияет на работу вертексного шейдера. И скорость работы карты определяется только фрагментной частью. Но это как-то странно.

Правка: 6 дек. 2018 23:30

sanПостоялецwww6 дек. 201822:44#8
MrShoor
> Я не в курсе как там оно у окулосов, отдельная видеокарта или нет.
Окулус это МОНИТОР. Ничего более. Забудьте вы об Окулусе плиз. Он тут совершенно не при чем.
Вы же не спрашиваете на каком мониторте работает юзер, это может быть Dell, Samsung или Sony. Какая разница? Окулус это такой же монитор, только и всего.

Правка: 6 дек. 2018 22:46

Che@terПостоялецwww6 дек. 201822:48#9
san
Возможно данные сидят не в ГПУ и это время = время пересылки данных в ГПУ. Упирается в производительность PCI шины, которая, можно считать, одинаковая для двух видеокарт.
sanПостоялецwww6 дек. 201822:55#10
Che@ter
> Возможно данные сидят не в ГПУ и это время = время пересылки данных в ГПУ. Упирается в производительность PCI шины, которая, можно считать, одинаковая для двух видеокарт.
Я об этом думал, потому и привел код самого рендера. Как можно видеть, ничего никуда не пересылается, передаются только указатель на хип и длина фрагмента. Сами вертексы сидят уже на карте. Они все в одном буфере (ID3D12Resource).
Не, может так и надо? Кто нибудь проверял чистое время отрисовки треугольников? Оно зависит от карты?

Правка: 6 дек. 2018 23:04

MrShoorУчастникwww7 дек. 20180:00#11
Тут типа был ответ, но я его удалил... сам давай как-нибудь. Ты слишком упорот, чтобы тебе помогать.
sanПостоялецwww7 дек. 20180:10#12
MrShoor
> ЗАМЕЧАТЕЛЬНО. Покажи мне теперь frame termination пакет на своём скриншоте. Я не вижу ни начало фрейма, ни конец на твоем GPUView скрине. Какие-то две рандомные полоски, с пустотой после.
Я могу показать тебе начало фрейма и конец, но я просто вырезал точно один фрейм для простоты. Какая разница где он начался - на время работы GPU это не сказывается. Хотя v-sync от окулуса и не показывается, но репер от него есть, просто я не стал загромождать картинку.

>У тебя два скриншота в РАЗНЫХ МАСШТАБАХ:
Учите матчасть. Это не масштаб, это общая длина записи. В первом случае 2.5 секунды, во втором полторы. Картинка вырезана примерно из середины этого интервала.

>А отснять нормальные скриншоты, вот такие:
Могу если это тебе поможет. Только сначала скажи - ты сам замерял время отрисовки просто треугольников на разных картах или просто хочется пофлеймить?
Если я выложу полный график (а я просто вырезал все лишнее для экономии места на странице), то что по нему ты можешь сказать полезного? У тебя есть конктерные подозрения на что-либо? Или просто хочется посмотреть?

0r@ngEУчастникwww7 дек. 20180:33#13
Из скринов нихрена не понял, потому просто спрошу - вы команд буфер собираете каждый кард?  Какие цифры будут если собрать комманд буфер раз и просто его рисовать?
sanПостоялецwww7 дек. 20180:44#14
0r@ngE
Я создаю буфер один раз, он содержит всю геометрию (600.000 вершин). Кроме того создается буфер индексов и массив поверхностей со смещением и размером каждого сегмента. При отрисовке я подключаю буфера и рисую каждый сегмент отдельно. Выше есть пример кода. Всего в сцене 27 моделей и 60 сегментов. В общем то весьма скромно. 5 мс на 1600х1080 это не так плохо, но почему это значение не зависит от карты, вот что меня изумляет.
Или ты говоришь об константном буфере? Он обновляется для каждой модели по каждому глазу, т.е 27х2 раз за кадр. Не думаю что это как-то может тормозить. И вообще дело-то не в тормозах а в независимости времени от железа.

Правка: 7 дек. 2018 0:59

Страницы: 1 2 38 9 Следующая »

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

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