Чтение онлайн

на главную

Жанры

DirectX 8. Начинаем работу с DirectX Graphics

Поздняков Константин

Шрифт:

 Comments:

 *********************************************************************/

#include <stdio.h>

#include <math.h>

#include <windows.h>

static float _0_47 = 0.47f;

static float _1_47 = 1.47f;

float__fastcall ulrsqrt(float x) {

 DWORD y;

 float r;

 _asm {

mov eax, 07F000000h+03F800000h // (ONE_AS_INTEGER<<1) + ONE_AS_INTEGER

sub eax, x

sar eax, 1

mov y, eax // y

fld _0_47 // 0.47

fmul DWORD PTR x // x*0.47

fld DWORD PTR y

fld st(0) // y y x*0.47

fmul st(0), st(1) // y*y y x*0.47

fld _1_47 // 1.47 y*y y x*0.47

fxch st(3) // x*0.47 y*y y 1.47

fmulp st(1), st(0) // x*0.47*y*y y 1.47

fsubp st(2), st(0) // y 1.47-x*0.47*y*y

fmulp st(1), st(0) // result

fstp y

and y, 07FFFFFFFh

 }

 r = *( float *)&y;

 // optional

 r = (3.0f - x * (r * r)) * r * 0.5f; // remove for low accuracy

 return r;

}

/*

 sqrt(x) = x / sqrt(x)

*/

float __fastcall ulsqrt(float x) {

 return x * ulrsqrt(x);

}

3

Нормализация векторов. Обычно делают неправильно, но сначала код:

//Обычно делают так:

void normaliseNormalise(Vector *v)
{

 float L, L_squared, one_over_L;

 L_squared = (v->x * v->x) + (v->y * v->y) + (v->z * v->z);

 L = sqrt(L_squared);

 one_over_L = 1.0 / L;

 v->x = v->x * one_over_L;

 v->y = v->y * one_over_L;

 v->z = v->z * one_over_L;

}

// А можно так:

#define ONE_AS_INTEGER ((DWORD)(0x3F800000))

float __fastcall InvSqrt(const float & x)
{

 DWORD tmp = ((ONE_AS_INTEGER << 1) + ONE_AS_INTEGER - *(DWORD*)&x) >> 1;

 float y = *(float*)&tmp;

 return y * (1.47f - 0.47f * x * y * y);

}

void Normalise(Vector *v)
{

 float L_squared, one_over_L;

 L_squared = (v->x * v->x) + (v->y * v->y) + (v->z * v->z);

 one_over_L = InvSqrt(L_squared);

 v->x = v->x * one_over_L;

 v->y = v->y * one_over_L;

 v->z = v->z * one_over_L;

}

По-моему

комментарии излишни :).

4 Разворачивание циклов

Обычно циклы разворачиваются. Наша цель максимально эффективно использовать кэш процессора, поэтому слишком глубокого разворачивания не нужно, достаточно повторений в цикле.

Для этого используем макросы, но оставляем возможность переключится на функции и не развернутые циклы для отладки (Отладка развернутых циклов сложна и неинформативна).

Опасайтесь разбухания кода!

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

1. Оптимизация рендеринга

Благодатная тема для описания, существует огромное количество способов сделать неправильно и один способ сделать правильно (Это заявление не относится к операционной системе Windows, для нее правильнее другое: Существует огромное количество способов сделать правильно, но они устарели и их лучше не использовать, а самый лучший способ — это как раз тот, в который мы недавно добавили большое количество NOP'ов и он работает как раз так, чтобы чуть-чуть тормозить на средней системе :)).

DirectX 8 и, в частности, Direct3D8 - это безусловно самая лучшая разработка Корпорации (ведь мы уже смело можем ТАК ее называть).

Итак, следуйте следующим указаниям:

1. Не используйте "тяжелые" функции в цикле рендеринга. Всегда функции

ValidateDevice, CreateVB, CreateIB, DestroyVB, Optimize, Clone, CreateStateBlock, AssembleVertexShader

помещайте в загрузку сцены и НИКОГДА в цикл рендеринга приложения. Создание буфера вершин может занять до 100 ms!

2. Использование DrawPrimitiveUP является ошибкой, вызывает задержки в работе процессора и всегда вызывает дополнительное копирование вершин.

3. Не позволяйте художникам контролировать ваш код. Если вам необходимо рисовать по 200+ вершин за проход, то геометрия должна удовлетворять этому требованию. Позволите себе рисовать по 2 вершины за вызов — и вы ТРУП :(.

4. Сортируйте по текстурам и по шейдерам. Если сложно сортировать по обоим параметрам, используйте кэширование. Создаем большую текстуру 4K×4K, в нее копируем текстуры, используемые в сцене, подправляем текстурные координаты геометрии и рисуем большой кусок с одной текстурой сортированный по шейдерам. Либо готовим геометрию таким образом, чтобы это кэширование не требовалось.

Поделиться:
Популярные книги

Бастард Императора

Орлов Андрей Юрьевич
1. Бастард Императора
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Бастард Императора

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Имя нам Легион. Том 7

Дорничев Дмитрий
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 7

Измена. Вторая жена мужа

Караева Алсу
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Вторая жена мужа

Буря империи

Сай Ярослав
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Буря империи

Пенсия для морского дьявола

Чиркунов Игорь
1. Первый в касте бездны
Фантастика:
попаданцы
5.29
рейтинг книги
Пенсия для морского дьявола

На изломе чувств

Юнина Наталья
Любовные романы:
современные любовные романы
6.83
рейтинг книги
На изломе чувств

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Сирота

Шмаков Алексей Семенович
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Сирота

Законы Рода. Том 9

Flow Ascold
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
Законы Рода. Том 9

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец

Огненный князь 4

Машуков Тимур
4. Багряный восход
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Огненный князь 4

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5

Инкарнатор

Прокофьев Роман Юрьевич
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Инкарнатор