Введение в программирование трехмерных игр с DX9

       

Рисунок Параметры OffsetToLock



Рисунок  3.1. Параметры OffsetToLock и SizeToLock определяют блокируемую область памяти. Если обоим параметрам присвоить нулевые значения, будет заблокирован весь буфер

Параметры у обоих методов одинаковы.

OffsetToLock — смещение в байтах от начала буфера до начала блокируемой области (Рисунок  3.1).

SizeToLock — количество блокируемых байтов.

ppbData — Адрес для возврата указателя на начало заблокированной области памяти.

Flags — Флаги, задающие режим блокировки. Можно указать ноль, либо комбинацию из одного или нескольких перечисленных ниже флагов:

D3DLOCK_DISCARD — Этот флаг используется только для динамических буферов. Он приказывает аппаратуре оставить старый буфер и возвратить указатель на новый буфер, который должен быть создан. Данная возможность полезна потому что позволяет аппаратуре продолжать визуализацию с использованием старого буфера в то время как пользователь работает с новым буфером. Это предотвращает простои оборудования.

D3DLOCK_NOOVERWRITE — Данный флаг используется только для динамических буферов. Он сообщает, что вы будете только добавлять данные в буфер. Это значит, что вы не будете перезаписывать никакие данные, которые уже используются для визуализации. Следовательно видеокарта может продолжать выполнять визуализацию, в то время когда вы добавляете новые данные в буфер.

D3DLOCK_READONLY — Этот флаг указывает, что вы хотите заблокировать буфер только для чтения и ничего не будете записывать в него. Благодаря этому система может выполнить внутреннюю оптимизацию.

Флаги D3DLOCK_DISCARD и D3DLOCK_NOOVERWRITE опираются на тот факт, что в момент вызова функции блокировки часть памяти буфера может использоваться для визуализации. Если обстоятельства позволяют указывать эти флаги, то благодаря их использованию можно избежать простоев визуализации, которые могли бы произойти в ином случае.

Приведенный ниже пример демонстрирует обычный вариант использования метода Lock. Обратите внимание, что закончив работу мы сразу вызываем метод Unlock.

Vertex* vertices; _vb->Lock(0, 0, (void**)&vertices, 0); // заблокировать весь буфер

vertices[0] = Vertex(-1.0f, 0.0f, 2.0f); // записать данные вершин vertices[1] = Vertex( 0.0f, 1.0f, 2.0f); // в буфер vertices[2] = Vertex( 1.0f, 0.0f, 2.0f);

_vb->Unlock(); // разблокировать буфер, когда // мы закончили работать с ним



Содержание раздела