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

问题描述 投票:0回答:1

我正在尝试为图形库制作SDL2适配器。我相信这个库假设它在屏幕上绘制的所有内容都保留在屏幕上,只要它永远不会在屏幕上绘制内容。 (有关详细信息,请参阅问题的结尾)

最好的方法是什么?

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

  • 没有调用SDL_RenderClear的硬件渲染。这个问题是SDL使用了一个双缓冲区,因此内容可以最终出现在其中任何一个中,并且我最终一次只能查看渲染的一个子集。
  • 软件渲染,如果我正确理解SDL,它将意味着有一个我映射到纹理的表面,所以我可以渲染纹理,我会编辑主存储器中表面的pixels字段。这将是非常缓慢的,并且因为库期望立即呈现的所有内容并且没有帧的概念意味着每次有更新(即使是单个像素)时将数据发送到gpu。

我可能错过了一些关于SDL2的东西,而且肯定是关于库(Adafruit-GFX-Library)。在这种情况下,transaction api意味着什么?我无法找到任何有关它的信息,我觉得它可能是重要的。

c++ sdl sdl-2 adafruit
1个回答
0
投票

在我对SDL2和一般渲染应用程序编程的理解中,SDL2被设计为每次都绘制一个完整的框架,这意味着您可以通过OpenGL API调用清除“当前窗口”

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

它会清除当前的OpenGL上下文,即帧缓冲区,你可以使用2或使用我不熟悉的SDL2渲染器。然后你将交换缓冲区,然后重复。 (这与this architecture proposal I am relying on非常吻合)

所以你要么必须以某种方式从你的库重放第二帧的绘图命令,要么你也可以禁用双帧缓冲,至少对于OpenGL后端,

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 0);

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

© www.soinside.com 2019 - 2024. All rights reserved.