Как реализована двойная буферизация в SDL2?

Пытаясь изучить SDL2, я прочитал о двойной буферизации. Я знаю, что SDL сама по себе использует двойную буферизацию. Однако я смущен тем, как двойная буферизация может быть реализована в программном рендеринге.

Во-первых, вам нужно создать окно:

SDL_Window *window = SDL_CreateWindow("SDL2 Window",
                                      SDL_WINDOWPOS_CENTERED,
                                      SDL_WINDOWPOS_CENTERED,
                                      680, 480,
                                      0);

Затем вы получаете указатель на поверхность окна ОДИН РАЗ:

SDL_Surface *window_surface = SDL_GetWindowSurface(window);

Теперь вы можете использовать этот указатель, чтобы вывести что-то на поверхность и отобразить это, обновив поверхность окна:

 SDL_BlitSurface(image, NULL, window_surface, NULL);
 SDL_UpdateWindowSurface(window);

Я знаю, что UpdateWindowSurface() эквивалентен Flip() SDL1.2. Это означает, что здесь выполняется подкачка буфера. Теоретически буфер, который был задним буфером окна (тот, на который указывает window_surface), теперь должен быть передним буфером, и вам нужен еще один указатель на старый передний буфер, который теперь является новым задним буфером - по крайней мере, в моем сознании . Но это не так. Вы можете снова скопировать и обновить, как указано выше, чтобы отобразить возможно измененный кадр. Как это возможно?

Здесь (Где я могу найти определение "SDL_Window") вы можете видеть, что структура SDL_Window также имеет только ОДИН элемент SDL_Surface* surface. Нет задней поверхности и передней поверхности. Поверхность также не имеет двух буферов, которые могли бы действовать как передний и задний буфер. Так как же здесь работает двойная буферизация? UpdateWindowSurface() больше не флип? Является ли WindowSurface просто скопированным в буфер графического вывода графической картой, которая реализует двойную буферизацию? Что мне не хватает? Буду очень признателен за любую помощь!


person Ruperrrt    schedule 01.05.2021    source источник
comment
Если вам небезразлично, как это реализовано, почему бы просто не прочитать исходники?   -  person HolyBlackCat    schedule 01.05.2021
comment
@HolyBlackCat Честно говоря, я не думал об этом до сих пор. Я только что понял это, и это было немного ошеломляюще, так как я новичок в программировании. UpdateWindowSurface() вызывает UpdateWindowSurfaceRects(), который вызывает UpdateWindowFrameBuffer(), который является указателем функции в исходном файле, который я сейчас читаю. Я не могу найти реализацию UpdateWindowFrameBuffer(). Мне было бы достаточно знать, как в основном реализована двойная буферизация, а не знать каждую деталь реализации, которая, скорее всего, в любом случае ошеломила бы меня.   -  person Ruperrrt    schedule 01.05.2021
comment
@Ruperrrt зависит от платформы; github.com/libsdl-org/ SDL/blob/ , github.com/libsdl-org/SDL/blob/ , ...   -  person keltar    schedule 01.05.2021