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

Высокополигональный рендер

Страницы: 1 2 Следующая »
#0
12:28, 6 авг. 2009

Сколько программирую на DirectX, никогда не задумывался над скоростью вывода полигонов. И вот недавно попробовал вывести ландшафт, который разбил на куски. Для проверки начальной работоспособности задумал вывести (без шейдеров, текстур, просто голые полигоны - функцией DrawIndexedPrimitive) все полигоны, а их: 32х32 объекта по 32х32х2 полигона, т.е. получается 2.097.152 полигона. По сути надо было в цикле вывести 1024 раза сетку 2048 полигонов. Посмотрев на FPS я ужаснулся было число ~40 и это на Radeon 4850 1gb и core 2 quad 3.4 ghz.
Далее я проделал следующее:
Сразу создал вершинный и индексный буффер

d3d9->CreateVertexBuffer(  1115136*sizeof(VER_TEX),0,D3DFVF_XYZ|D3DFVF_TEX1,D3DPOOL_DEFAULT,
      &r_vertex_buffer,NULL);
d3d9->CreateIndexBuffer(  3*2097152*sizeof(int),D3DUSAGE_WRITEONLY,D3DFMT_INDEX32,D3DPOOL_DEFAULT,
      &r_index_buffer,NULL);

а потом в каждом кадре отображаю

d3d9->DrawIndexedPrimitive(  D3DPT_TRIANGLELIST,0,0,
      r_position_current_vertex,0,
      r_position_current_polygon);

FPS уже ~170.

После всего проделанного скажу, очень медленно, в кадре всего 2.097.152 полигона. Если взять в пример Crysis, там в среднем в кадре 2,5 млн полигонов, и FPS у меня ~45, но... В игре есть AI, шейдеры (которые убивают львиную долю производительности), ну и собственно НЕСКОЛЬКО проходов рендера (для отражения/преломления/теней и т.д.).

Вот собственно и задумался я... неужели все так печально, или же я не правильно что-то создаю/рендерю и сколько должно быть FPS при зффективном рендеринге 2 млн полигонов?
И почему многократный вызов функции DrawIndexedPrimitive так влияет на производительность (т.е. в 4 раза, пусть циклы и т.д. убивают мощность, но все-таки)?

Ваши мнения.


#1
12:59, 6 авг. 2009

>И почему многократный вызов функции DrawIndexedPrimitive так влияет на производительность (т.е. в 4 раза, пусть циклы и т.д. убивают мощность, но все-таки)?

Надеюсь прояснит чуть-чуть тебе:
developer.nvidia.com/docs/IO/8230/BatchBatchBatch.pdf

#2
13:07, 6 авг. 2009

Всё очень просто - надо стараться минимизировать вызовы DIP, смены рендер стейтов, шейдеров и констант - тогда всё будет в порядке. Кроме того, надо, по возможности, минимизировать размер вертексов, а так же стараться оптимизировать геометрию под кэш.

Насчёт того, что шейдеры убивают львиную долю производительности - это не так, просто их надо грамотно писать и не менее грамотно оптимизировать. Использование ирли-з и куллинга так же может существенно ускорить рендер.

АИ, физику и всё остальное - можно считать параллельно с рендером. Поскольку он (рендер) обычно конкретный тормоз - если считать параллельно, скорее всего тормозов никаких они не прибавят.

#3
13:24, 6 авг. 2009

Fen1xL
http://blog.gamedeff.com/?p=235

#4
13:49, 6 авг. 2009

>Всё очень просто - надо стараться минимизировать вызовы DIP, смены рендер стейтов, шейдеров и констант - тогда всё будет в порядке. Кроме того, надо, по возможности, минимизировать размер вертексов, а так же стараться оптимизировать геометрию под кэш.
Это понятно, что всего надо поменьше). Тока у меня в кадре ничего и нет, только DIP (!без констант, шейдеров и т.д.) на 2 млн полигонов и все, а тормоза адские. Оптимизировать, то нечего, так что делать?. Флаг D3DPOOL_DEFAULT размещает вроде бы в памяте видюхи.

>Надеюсь прояснит чуть-чуть тебе: developer.nvidia.com/docs/IO/8230/BatchBatchBatch.pdf
Не прояснил(((, перескажи вкрацце

#5
14:03, 6 авг. 2009

>Тока у меня в кадре ничего и нет, только DIP (!без констант, шейдеров и т.д.) на 2 млн полигонов и все, а тормоза адские. Оптимизировать, то нечего, так что делать?
Ну, у тебя на отрисовку ландшафта на 2кк поликов уходит 1000 дип, у меня 8-16 дип.
У тебя как есть 2кк трис на ландшафте - так и есть, у меня с ЛОДом 8кк трис превращаются в 200-400к трис.
А оптимизировать, говоришь, нечего, да? ))))

Да 1000 дипов на на слабой видюхе, даже если по 2 трис на дип - это тормоза будут ))) То, что 4850 не слаба и может работать быстрее - не говорит о том, что думать об этом не надо...

>Не прояснил(((, перескажи вкрацце
Если вкратце - в самом названии пдфки кратко описано то, что находится внутри )))

#6
14:21, 6 авг. 2009

>А оптимизировать, говоришь, нечего, да? ))))
Я про второй описанный случай, когда только один раз вызываю DIP, вот там-то нечего оптимизировать

>Ну, у тебя на отрисовку ландшафта на 2кк поликов уходит 1000 дип, у меня 8-16 дип.
>У тебя как есть 2кк трис на ландшафте - так и есть, у меня с ЛОДом 8кк трис превращаются в 200-400к трис.
про оптимизацию, уменьшения полигонов я уже сделал, меня собственно DIP волнует

#7
14:30, 6 авг. 2009

Во втором случае ты получаешь 170 фпс - этого мало для 2кк поли? O_O
2кк трис при 170 фпс т.е. порядка 340 мтрис/сек. Этого мало? O_O

#8
14:38, 6 авг. 2009

вот я про это и пишу. Какие предположения?

#9
14:59, 6 авг. 2009

Есть предположение, что это более, чем достаточная скорость )))
А в первом случае просто скорость убивается большим кол-вом ДИПов.

#10
15:12, 6 авг. 2009

slava_mib
> Да 1000 дипов на на слабой видюхе, даже если по 2 трис на дип - это тормоза
> будут ))) То, что 4850 не слаба и может работать быстрее - не говорит о том,
> что думать об этом не надо...
это конечно же не правда. видюха тут не причом. дипкост на цпу весь. на железке переключение всякого копейки, даже если не фильтровать (за редкими исключениями)

#11
15:32, 6 авг. 2009

Да, конечно, проц влияет в первую очередь, это я забыл просто упомянуть, увлёкшись видюхами )
Но когда я тестил отрисовку 5000 дип по 10 трис почти нулевого размера, скорость работы ХД4850 была в 1,5-2 раза выше чем у ХД3650 - это из моего собственного опыта.

#12
16:09, 6 авг. 2009

Разные дрова - разный цпу кост. Наивно думать, что это видеокарта сама по себе стала отрисовывать в 2 раза быстрее 10000 треугольников.

#13
16:24, 6 авг. 2009

Fen1xL, а пробовал число поликов увеличить после изменений?
В статье говорится о том, что есть зависимость числа batch-ей от производительности ЦПУ
Таким образом полностью нагрузив проц у тебя будет простаивает видяйка без расчетов(например, могла бы в этот момент выполнять шейдерную программу без падения фпс)

#14
16:26, 6 авг. 2009

kas
> это конечно же не правда. видюха тут не причом. дипкост на цпу весь.

я конечно не такой умный как ты :) почему же тогда на DX10 железе DX9 и DX10 dip cost разный ?

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

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