Может ли игра DirectDraw получить доступ к буферу без блокировки?
Я работаю над старой игрой для Windows DirectDraw. Я создал DirectDraw прокси. Он регистрирует каждый вызов IDirectDraw и IDirectDrawSurface. Backbuffer выглядит так после одного BltFast
вызов:
И так до следующего BltFast
вызов:
Эти фотографии сбрасываются Lock
ING-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 всегда пытается асинхронный блиц, если он поддерживается аппаратным обеспечением.
Так что это может быть гонка, возможно, но я бы предположил, что любая попытка блокировки заблокирует, пока это не завершится.
Не вызывайте функции DirectDraw bitblt для bitblt из заблокированной области поверхности. Если вы это сделаете, bitblt возвращает либо DDERR_SURFACEBUSY, либо DDERR_LOCKEDSURFACES. Функции GDI blit также молча терпят неудачу при использовании на заблокированной поверхности видеопамяти.
Это подразумевает, что сам bitblt имеет семантику блокировки. Учитывая, что GDI не разрешен доступ к поверхности, которая явно заблокирована, также вероятно, что он не может получить доступ к поверхности в середине асинхронной блиц-операции.
Таким образом, чтобы конкретно ответить на ваш вопрос, похоже, что GDI может получить доступ к поверхности, не блокируя ее.
Конечно, есть много странных вещей, которые можно сделать во имя исполнения, так кто знает, какие еще виды взлома они могли бы совершить?
Я скажу, однако, что я не являюсь экспертом в DirectDraw, и я работаю в предположении, что backbuffer подобен любой другой поверхности.