【问题标题】:Why do I need to clear the screen even if I intend to overwrite every single pixel?为什么即使我打算覆盖每个像素,我也需要清除屏幕?
【发布时间】:2016-09-23 18:58:59
【问题描述】:

在 SDL2 文档中提到:

强烈建议您在开始绘制每个新帧之前调用 SDL_RenderClear() 来初始化后台缓冲区,即使您打算覆盖每个像素。

这背后的原因是什么?当你知道你无论如何都要覆盖它时,它不是只是一个无用的调用来填充屏幕一种特定的颜色吗?

【问题讨论】:

  • 如何绘制透明的东西?你会得到“旧”屏幕泄漏。
  • @MarcB 如果有一个完全不透明的背景,我相信 OP 可能会有。
  • “强烈鼓励”!=“需要”。你决定你需要什么来实现你想要的。从理论上讲,实现丢弃旧缓冲区可能更容易,但我在实践中从未见过(相反 - 一些 OpenGL 实现只是在引擎盖下绘制实心四边形以“清除”)。但是为什么你不想做那么多呢?
  • 请提供指向您所指文档的链接。我没有在 wiki 中找到这个。

标签: sdl sdl-2


【解决方案1】:

如果您确定要使用完全不透明的颜色绘制每个像素,则无需使用 SDL_RenderClear()。

SDL_RenderClear() 适用于当您的框架中有实际可见的背景颜色时。

【讨论】:

    【解决方案2】:

    如果要更新每个像素,则需要在每一帧中调用SDL_RenderClear()。您甚至可以通过使用半透明像素来制作一些不错的效果(例如,通过在绘制另一帧之前绘制黑色半透明矩形来实现“运动模糊”)。

    如果这只是您自己的代码,是的,它可能看起来毫无用处,但是一旦您的代码落入他人手中,您就不会知道。他们可能会使用不同的图像、透明的东西,而且他们很难弄清楚为什么所有的东西都在屏幕上重复。

    这是鼓励清除屏幕的一个很好的理由。您不需要这样做。此外,值得注意的是 clearing 屏幕与通过绘制每个像素(并且速度更快)用颜色 填充 屏幕不同,因此,您的表现与潜在的未来头痛相比,失去的可以忽略不计。

    您可以检查每个平台的RenderClear 代码,看看它如何按照您所说的做了不同的事情( 用颜色填充屏幕),但方法 而不是绘制方法

    你可以看到,SDL_RenderClear 的唯一实现真正填满了屏幕是SW_RenderClear,但除此之外,清屏并没有什么坏处,但也没有义务。没有它,SDL 也能正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      相关资源
      最近更新 更多