Ответ 1
Насколько я могу судить, похоже, что игра может рисоваться в несколько этапов, и вы ловите ее между ними. IE, игра вызывает blit один раз для рендеринга фона, затем снова (возможно, несколько раз) для визуализации интерактивных "спрайтов". (Тем не менее, порядок вполне может быть отменен, что означает, что второй кадр, который вы захватили, на самом деле является первым слоем следующего цикла.)
Что касается backbufer, я смог найти это в документации MSDN для DirectDraw: https://msdn.microsoft.com/en-us/library/windows/desktop/gg426183(v=vs.85).aspx
BltFast всегда пытается использовать асинхронный blit, если он поддерживается аппаратным обеспечением.
Так что это может быть гонка, возможно, но я бы предположил, что любая попытка блокировки блокируется до тех пор, пока это не завершится.
Не вызывайте функции bitblt DirectDraw в битбтт из заблокированной области поверхности. Если вы это сделаете, битбит возвращает либо DDERR_SURFACEBUSY, либо DDERR_LOCKEDSURFACES. Функции GDI blit также бесшумно прерываются при использовании на заблокированной поверхности видеопамяти.
Это означает, что битбитт сам имеет блокирующую семантику. Учитывая, что GDI не имеет доступа к поверхности, которая явно заблокирована, также вероятно, что она не может получить доступ к поверхности в середине асинхронной операции blit.
Чтобы конкретно ответить на ваш вопрос, похоже, что GDI может иметь доступ к поверхности без ее блокировки.
Конечно, есть все виды странных вещей, которые могут быть сделаны во имя производительности, поэтому кто знает, какие другие хаки они могли бы сделать?
Я скажу, однако, что я не специалист каким-либо образом в DirectDraw, и я работаю в предположении, что backbuffer похож на любую другую поверхность.