5edf7c19

FourCC YUV режим


// любой YUV цвет, где Y - между 100 и 110 и U

//or V - между 50, и 55 прозрачны

dwColorSpaceLowValue = YUVQUAD(100,50,50);

dwColorSpaceHighValue = YUVQUAD(110,55,55);

Переключающиеся поверхности и количество фреймов GDI

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

При вызове IDirectDrawSurface::Flip, поверхности, связанные с DirectDrawSurface переключаются. Поверхности, присоединенные к объектам DirectDrawSurface не изменяются. Например, в ситуации с двойным буфером, программа, рисующая в обратный буфер всегда использует тот же самый объект DirectDrawSurface. Поверхностьбудет переключена на передний буфер, когда вызовется метод  IDirectDrawSurface::Flip.

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

Это физическое требование делает вызов IDirectDrawSurface::Flip на видимых поверхностях асинхронной командой. Хорошо при построении игр, например, выполнить все не-визуальные элементы игры после того, как этот метод вызыван. Когда ввод, звук и операции с рисованием в памяти системы был завершены, начинают выполняться задачи, которые требуют получения доступа к видимым обратным буферам.


Когда ваша прикладная программа должна выполниться в окне и все еще требует переключающейся среды, DirectDraw будет пытаться создать переключающуюся оверлейную поверхность. Если аппаратные средства не поддерживают оверлеи, Вы можете создать основную поверхность с переключающимися страницами, и когда поверхность, о чем GDI не знает,  собирается стать первичной поверхностью, blit содержится в основной  поверхности, а GDI записывает в буфер, который собирается стать видимым. Это занимеат не много времени , потому что blits выполняется асинхронно. Это может, однако, потреблять значительную blitter bandwidth, которая зависит от экранной разрешающей способности и размера окна, которое переключается. Когда число кадров в секунду не опускается ниже 20 fps, GDI действует правильно.

Прежде, чем Вы инициализируете объект DirectDraw, GDI уже используете вашу память дисплея для отображения. Когда Вы вызываете DirectDraw к инициализированию основной  поверхности, адрес памяти той поверхности будет  использовать также и GDI.

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

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

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

Создать первичную поверхность с двумя обратными буферами.

Blit начальную первичную поверхность (GDI поверхность) на средний обратный буфер.

Flip (NULL) чтобы поместить GDI на последнее место и сделать вашу начальную копию видимой.

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

рPrimary- > Flip (pMiddle)


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