Подтвердить что ты не робот

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

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

enter image description here

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

enter image description here

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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