Может ли игра DirectDraw получить доступ к буферу без блокировки?

Я работаю над старой игрой для Windows DirectDraw. Я создал DirectDraw прокси. Он регистрирует каждый вызов IDirectDraw и IDirectDrawSurface. Backbuffer выглядит так после одного BltFast вызов:

И так до следующего BltFast вызов:

Эти фотографии сбрасываются LockING-copying-Unlockбэкбуфер до и после любого BltFast вызов. Между этими двумя другими вызовами IDirectDraw(Surface) нет BltFast звонки, особенно нет Lock/Unlock звонки. Как это возможно?

1 ответ

Насколько я могу судить, похоже, что игра может рисоваться в несколько этапов, и вы попадаете в промежуток между ними. То есть, игра вызывает blit один раз для отображения фона, а затем снова (возможно, несколько раз) для отображения интерактивных "спрайтов". (Тем не менее, порядок может быть полностью изменен, это означает, что второй кадр, который вы захватываете, фактически является первым слоем следующего цикла.)

Что касается backbufer, я смог найти это в документации MSDN для DirectDraw: https://msdn.microsoft.com/en-us/library/windows/desktop/gg426183(v=vs.85).aspx

BltFast всегда пытается асинхронный блиц, если он поддерживается аппаратным обеспечением.

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

А также... https://msdn.microsoft.com/en-us/library/windows/desktop/gg426208%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

Не вызывайте функции DirectDraw bitblt для bitblt из заблокированной области поверхности. Если вы это сделаете, bitblt возвращает либо DDERR_SURFACEBUSY, либо DDERR_LOCKEDSURFACES. Функции GDI blit также молча терпят неудачу при использовании на заблокированной поверхности видеопамяти.

Это подразумевает, что сам bitblt имеет семантику блокировки. Учитывая, что GDI не разрешен доступ к поверхности, которая явно заблокирована, также вероятно, что он не может получить доступ к поверхности в середине асинхронной блиц-операции.

Таким образом, чтобы конкретно ответить на ваш вопрос, похоже, что GDI может получить доступ к поверхности, не блокируя ее.

Конечно, есть много странных вещей, которые можно сделать во имя исполнения, так кто знает, какие еще виды взлома они могли бы совершить?

Я скажу, однако, что я не являюсь экспертом в DirectDraw, и я работаю в предположении, что backbuffer подобен любой другой поверхности.

Другие вопросы по тегам