Ширина и шаг (Direct3D 9)
Хотя ширину и шаг терминов часто используются неофициально, они имеют очень важное значение, и по-разному, смыслы. В результате вы должны понимать значения для каждого из них и интерпретировать значения, которые Direct3D использует для их описания.
Direct3D использует структуру D3DSURFACE_DESC для переноса информации, описывающей поверхность. Помимо прочего, эта структура определяется для хранения сведений о измерениях поверхности, а также о том, как эти измерения представлены в памяти. Структура использует элементы Height и Width для описания логических измерений поверхности. Оба элемента измеряются в пикселях. Таким образом, значения высоты и ширины для поверхности 640 x 480 совпадают с тем, является ли он 8-разрядной поверхностью или 24-разрядной поверхностью RGB.
При блокировке поверхности с помощью метода IDirect3DSurface9::LockRect метод заполняет структуру D3DLOCKED_RECT, содержащую шаг поверхности и указатель на заблокированные биты. Значение в элементе "Шаг" описывает шаг памяти поверхности, который также называется шагом. Шаг — это расстояние в байтах между двумя адресами памяти, представляющими начало одной растровой линии и началом следующей строки растрового изображения. Так как шаг измеряется в байтах, а не пикселях, поверхность 640x480x8 имеет очень другое значение тона, чем поверхность с теми же измерениями, но другим форматом пикселей. Кроме того, значение шага иногда отражает байты, зарезервированные Direct3D в качестве кэша, поэтому небезопасно предположить, что шаг — это только ширина, умноженная на число байтов на пиксель. Скорее, визуализировать разницу между шириной и шагом, как показано на следующей схеме.
На этой схеме передний буфер и задний буфер имеют значение 640x480x8, а кэш составляет 384x480x8.
При непосредственном доступе к поверхностям следует следить за тем, чтобы оставаться в памяти, выделенной для измерений поверхности, и оставаться вне памяти, зарезервированной для кэша. Кроме того, при блокировке только части поверхности необходимо оставаться в прямоугольнике, указанной при блокировке поверхности. Не соблюдая эти рекомендации, будут иметь непредсказуемые результаты. При отрисовке непосредственно в память поверхности всегда используйте поле, возвращаемое методом IDirect3DSurface9::LockRect. Не предполагайте шаг, основанный исключительно на режиме отображения. Если приложение работает на некоторых адаптерах отображения, но выглядит на других, это может быть причиной проблемы.
Дополнительные сведения см. в непосредственного доступа к памяти Surface (Direct3D 9).
Связанные разделы