Пытаясь изучить 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 просто скопированным в буфер графического вывода графической картой, которая реализует двойную буферизацию? Что мне не хватает? Буду очень признателен за любую помощь!