c++ - SDL2:如何在不清除屏幕的情况下进行渲染
问题描述
我正在尝试为图形库制作 SDL2 适配器。我相信这个库假设它在屏幕上绘制的所有东西都保留在屏幕上,只要它从不在屏幕上绘制任何东西。(有关此问题的详细信息,请参阅问题的结尾)
最好的方法是什么?
我遇到了多种解决方案,包括:
- 无需调用的硬件渲染
SDL_RenderClear
。这样做的问题是 SDL 使用双缓冲区,因此内容可以在其中任何一个中结束,并且我最终一次只能看到渲染的一个子集。 - 软件渲染,如果我对 SDL 的理解正确,这意味着拥有一个映射到纹理的表面,因此我可以渲染纹理,并且我将
pixels
在主内存中编辑表面的字段。这将非常慢,而且由于库希望所有内容立即呈现并且没有帧的概念,这意味着每次有更新(甚至是单个像素)时都将数据发送到 gpu。
我可能遗漏了一些关于 SDL2 的东西,当然还有关于图书馆(Adafruit-GFX-Library)的东西。在这种情况下,事务 api意味着什么?我找不到任何关于它的信息,我觉得它可能很重要。
解决方案
在我对 SDL2 和一般渲染应用程序编程的理解中,SDL2 被设计为每次都绘制一个完整的帧,这意味着您可以通过 OpenGL API 调用清除“当前窗口”
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 存储库以及我的通用帮助程序类
推荐阅读
- python - Python的解释器如何识别函数中未定义的全局变量?
- javascript - 如何使用 CSS 更改 **tradingview** 库中的字体
- angular - 使用 Stackblitz 向 Angular 项目添加路由
- actionscript-3 - Adobe animate:按钮不会转到下一个场景(动作脚本 3.0)
- javascript - TypeError:无法读取expo React native for Android中未定义的属性'FACEBOOK'
- reactjs - React Typescript 中的“EventTarget”类型上不存在属性“元素”
- python - 如何将swaggerhub生成的flask swagger服务器部署到heroku?
- r - ggarrange:将多个绘图与共享的 y 和 x 轴组合:仅安排一个共享的 y 轴,同时保持绘图的比例相同
- reactjs - 使用材料的 ReactJs 倍数复选框
- php - 为什么即使代码正确并且没有出现错误,我也无法将数据输入数据库?