SDL2: как выполнить рендеринг без очистки экрана - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь сделать адаптер SDL2 для графической библиотеки.Я полагаю, что эта библиотека предполагает, что все объекты, которые она рисует на экранах, остаются на экране до тех пор, пока она ничего не рисует сверху.(Подробнее об этом см. В конце вопроса)

Как лучше всего это сделать?

Я встречал несколько решений, в том числе:

  • Аппаратный рендеринг без вызова SDL_RenderClear.Проблема в том, что SDL использует двойной буфер, поэтому содержимое может оказаться в любом из них, и я заканчиваю тем, что вижу только подмножество рендеринга за раз.
  • Программный рендеринг , в котором, если я правильно понимаю SDL, это будет означать наличие поверхности, которую я сопоставил текстуре, чтобы я мог рендерить текстуру и редактировать поле pixels поверхности в основной памяти.Это будет очень медленно, а также потому, что библиотека ожидает, что все визуализируется мгновенно и не имеет представления о кадрах, будет означать отправку данных в gpu каждый раз, когда происходит обновление (даже отдельные пиксели).

Я, вероятно, что-то упускаю из-за SDL2 и определенно из-за библиотеки ( Adafruit-GFX-Library ).Что означает транзакция api в этом контексте?Мне не удалось найти какую-либо информацию об этом, и я чувствую, что это может быть что-то важное.

1 Ответ

0 голосов
/ 14 февраля 2019

В моем понимании SDL2 и общего программирования приложений рендеринга SDL2 спроектирован так, что вы каждый раз рисуете полный кадр, то есть вы очищаете свое "текущее окно" либо с помощью вызовов API OpenGL

glClearColor(0, 1.0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);

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

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

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 0);

(Для другого кода установки OpenGL SDL2 см. этот репозиторий GitHub с моим общим вспомогательным классом

...