SDL2:如何在不清除屏幕的情况下进行渲染

时间:2019-02-14 10:49:22

标签: c++ sdl sdl-2 adafruit

我正在尝试为图形库制作SDL2适配器。我相信该库假定它在屏幕上绘制的所有内容都保留在屏幕上,只要它从不在其顶部绘制任何内容即可。 (有关此问题的详细信息,请参阅问题的结尾)

最好的方法是什么?

我遇到了多种解决方案,包括:

  • 硬件渲染,而无需调用SDL_RenderClear。问题在于SDL使用了一个双缓冲区,因此内容可以在其中任何一个中结束,而我最终一次仅选择渲染的一个子集。
  • 软件渲染,其中,如果我正确地理解了SDL,则意味着将表面映射到纹理,这样我就可以渲染纹理,然后编辑{{ 1}}主存储器中表面的字段。这将非常慢,并且由于库希望所有内容都能立即渲染并且没有帧的概念,因此每次更新(甚至单个像素)时都将数据发送到gpu。

我可能缺少有关SDL2的东西,也肯定缺少有关库(Adafruit-GFX-Library)的东西。 transaction api在这种情况下是什么意思?我找不到任何有关它的信息,我觉得这可能很重要。

1 个答案:

答案 0 :(得分:0)

根据我对SDL2和常规渲染应用程序编程的了解,SDL2的设计目的是每次绘制一个完整的框架,这意味着您可以通过OpenGL API调用清除“当前窗口”

greeterMaker.standardGreeting = "Hey there!";

清除当前的OpenGL上下文,即帧缓冲区,您将拥有其中的2个,或者使用我不熟悉的SDL2渲染器。 然后,您将交换缓冲区,然后重复。 (最适合this architecture proposal I am relying on

因此,要么必须以某种方式重播库中的draw命令以获取第二帧,要么通过

至少对于OpenGL后端禁用双帧缓冲。
glClearColor(0, 1.0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);

(有关其他OpenGL SDL2设置代码,请参见this GitHub repository with a general helper class of mine