【发布时间】:2019-02-14 10:49:22
【问题描述】:
我正在尝试为图形库制作 SDL2 适配器。我相信这个库假设它在屏幕上绘制的所有东西都保留在屏幕上,只要它从不在屏幕上绘制任何东西。 (详情见问题末尾)
最好的方法是什么?
我遇到过多种解决方案,包括:
-
硬件渲染,无需调用
SDL_RenderClear。这样做的问题是 SDL 使用双缓冲区,因此内容可能会出现在其中任何一个缓冲区中,而我最终一次只能看到渲染的一个子集。 -
软件渲染,如果我对 SDL 的理解正确,这意味着有一个我映射到纹理的表面,所以我可以渲染纹理,我将编辑
pixels字段主存储器中的表面。这会很慢,而且由于库希望所有内容都立即渲染并且没有帧的概念,这意味着每次有更新(甚至是单个像素)时都将数据发送到 gpu。
我可能遗漏了一些关于 SDL2 的内容,当然还有关于库 (Adafruit-GFX-Library) 的内容。在这种情况下,transaction api 是什么意思?我找不到任何有关它的信息,我觉得它可能很重要。
【问题讨论】:
-
即使没有双缓冲,也可能被其他窗口遮蔽。您可以渲染到纹理,然后将该纹理复制到帧缓冲区。或者使用软件渲染,例如固定更新间隔(每 1/n 秒刷新到屏幕,例如监控 vsync 间隔)。虽然不清楚你的目标是什么。您是否出于某种原因在模拟 VGA?
-
是的,我的目标是模拟一个 tft arduino 屏幕,它由我链接的库控制。每隔一段时间刷新可能是个好主意,而且性能对于我的应用程序来说可能已经足够了。
-
@keltar 我很难找到有关遮蔽的信息。你介意再详细说明一下吗?
-
假设您已将窗口最小化,然后将其恢复。之后,前端缓冲区的内容可能会丢失。如果其他窗口遮盖了您的窗口(显示在其顶部,因此您看不到窗口的某些部分),或者窗口部分超出屏幕-我想是窗口系统/图形驱动程序将定义前缓冲区会发生什么在那种情况下。