5edf7c19

Доступ к буферу изображения


Объекты DirectDrawSurface представляют поверхностную память в архитектуре DirectDraw. DirectDrawSurface позволяет прикладной программе непосредственно получать доступ к этой поверхностной памяти через IDirectDrawSurface::Lock. Программа вызывает этот метод, передавая структуру RECT, которая определяет прямоугольник на поверхности, к которому требуется доступ. Если вызов IDirectDrawSurface::Lock происходит с параметром  RECT NULL, принимается, что запрашивается исключительный доступ ко всей поверхностной памяти. Этот метод заполняет структуру DDSURFACEDESC информацией, необходимой для прикладной программы, чтобы получить доступ к поверхностной памяти. Эта информация включает размер и формат пикселя поверхности, если от отличен от формата пикселя основной поверхности. Когда прикладная программа закончила работу с поверхностной памятью, поверхностная память должна быть сделана доступной методом IDirectDrawSurface::Unlock.

Опыт показывает что имеется несколько общих проблем, с которыми Вы можете столкнуться при записи непосредственно в DirectDrawSurface. Следующий список описывает некоторые решения для этих проблем:

Никогда не принимайте шаг дисплея постоянным. Всегда исследуйте информацию шага, возвращенную  IDirectDrawSurface::Lock. Этот шаг может измениться по ряду причин, включая расположение поверхностной памяти, тип платы дисплея, или даже версию используемого драйвера DirectDraw.

Существуют ограничения по обращению к IDirectDrawSurface:: Lock и IDirectDrawSurface::Unlock. IDirectDrawSurface::Lock проводит блокировку WIN16 при получении доступа к памяти поверхности для безопасного прохождения операции и IDirectDrawSurface:: GetDC метод неявно называет IDirectDrawSurface:: Lock. Блокировка WIN16 преобразовывает в последовательную форму доступ к GDI и USER, закрывая Windows для продолжительных задержках между операциями Lock и Unlock, а также между операциями GetDC и ReleaseDC.

Убедитесь, что Вы копируете выравненные данные в память. Windows 95 использует драйвер неисправности страниц, Vflatd. 386, чтобы переслать виртуальный плоский буфер для плат дисплея с  банками переключаемой памяти. Этот модуль позволяет этим устройствам  представлять линейный буфер фреймов(LFB) в DirectDraw. Копирование невыравненных данных в  память может заставить систему приостановить операции, если копия охватывает несколько банков памяти.



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