Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Скорость воспроизведения в Direct3D


Автор: Bitter 18.12.2006, 23:03
Всем привет.

Возникло у меня два спорных вопроса, а именно:
 
1. Использование индексного буфера увеличивает скорость воспроизведения? То, что этот способ значительно экономит память, я знаю, меня интересует именно скорость воспроизведения.

2. Программирование без VCL увеличивает скорость воспроизведения? Ведь в этом случае в качестве таймера используется обычный while, а не какие-нить там системные таймеры.

И вообще, может есть еще какие-нить способы повысить скорость воспроизведения? Я это к тому, что постоянно вижу игры, в которых куча полигонов рисуется в миг, а у меня, 1-2 тысячи и всёёёё тормозаааа. Хотя конечно я пишу на Delphi 7, но думаю, что особой разницы нет, так как  вроде в 7-м компилятор снабжен какими-то оптимизаторами кода, так что... 

Вобщем, у кого какие мысли? Всем спасибо.

Автор: Bitter 25.12.2006, 04:01
Вот некоторые тонкости, которые позволяют увеличить скорость работы графического приложения:
1.Размеp пакета данных. Чем больше полигонов будет прорисовано за один вызов процедуры DrawPrimitive, тем быстрее прорисуется кадр. Хоpошим показателем является рисование объектов, в сpеднем, более 100 полигонов за один вызов упомянутой процедуры.

2. Изменение режима воспроизведения. Функции SetRenderState являются "доpогими" опеpациями, особенно смена текстуp. По этой пpичине, важно минимизиpовать вызовы данной функции при перерисовке каждого кадpа. 

3. Параллельные потоки. Увеличивае производительность и распараллеливание потоков на Рендеринг и Расчет.

4. Использование нескольких буфеpов вершин. К сожалению, ничего по этому поводу сказать не могу, однако такую версию слышал.

5. Загpузка текстуp. Загpузка текстуp в видео память уменьшает её размеры. Следовательно меньше места остается под вершины, и следовательно, они будут расположены в системной памяти. 

6. Смена контекста. Пеpеключение с 3D- на 2D-опеpации, такие как опеpации блиттинга (blitting) или блокиpования (locking) повеpхности кадpа могут вызвать большие затраты времени. По этой пpичине следует избегать подобных опеpаций насколько это возможно. Большинство 2D-компонент сцены, такие как инфоpмационные панели, к пpимеpу, могут быть выполнены чеpез 3D-пpимитивы, как пpавило повышая пpоизводительность.

Ну и на последок, ещё один трюк, который, может кому-то известен (может он не совсем относится к графике, но всё же):

Если есть два цикла: по n и по p, при этом n>p (например n=100, а p= 1000), то конструкция:

for i := 1 to n do
 for j := 1 to p do

работает быстрее, чем 

for j := 1 to p do
 for i := 1 to n do

хотя казалось бы....

А по поводу заданных мной вопросов, я выяснил, что использование индексного буфера всё таки повышает производительность, так как процессор в данном случае, вычисляет меньшее количество матриц трансформаций. А вот на счет VCL, я так и не выяснил.

Автор: Beltar 25.12.2006, 09:01
Я буквально только что начал изучать DirectX. Тоже на Delphi Приобрел кижечку Фленова. Первое с чего там начинается первый проект это удаление из него формы и забывание, что она там есть. smile Дальше все на голом API. Если глянуть в исходники VCL, то пока дойдешь до уровня API запариться можно, так что безо всех этих прослоек д/б быстрее. smile

Автор: Beltar 25.12.2006, 09:19
Кстати, такой вопрос, стоит ли вообще связываться с DirectDraw. По нему много материалов, но он с DX 8 уже не развивается. Не проще ли даже 2D-графику делать в D3D?

Автор: Bitter 25.12.2006, 12:59
Цитата

Не проще ли даже 2D-графику делать в D3D? 


В основном так и делают. для этого есть класс ID3DXSprite.

Автор: arilou 26.12.2006, 20:54

 ! 
arilou
Beltar, пожалуйсьа один топик - один вопрос

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)