【问题标题】:How are images rendered onto the screen?图像是如何呈现在屏幕上的?
【发布时间】:2014-10-07 18:00:42
【问题描述】:

这可能是一个奇怪的问题,但是思考图像如何投影到屏幕上的正确方法是什么? 如果我们在屏幕上已经有一个图像,并且我们将另一个图像渲染到屏幕上,那么新图像是否会出现在旧图像之上,从而使旧图像不再可见。或者它是否在旧的后面,从而使新的不可见,直到我们清除旧的屏幕。 我曾经认为新图像会在旧图像之上,但是,在使用了一点缓冲区(即 BufferedImage 和 BufferedStrategy)之后,我开始认为这不是正确的方式。 所以有人可以澄清这个问题吗 谢谢

【问题讨论】:

  • 把它想象成画家的画布。每次你涂上更多的油漆,你就会在已经存在的地方上漆。
  • 在处理缓冲区时,概念是相同的,除了,您正在处理该缓冲区上最后的任何内容...因此序列可能已过时...

标签: java swing buffer render draw


【解决方案1】:

一般来说,您可以将其视为画家的画布。每次你画新的东西时,你都是在现有的东西之上作画。

处理缓冲区时,过程是相同的,但要知道您正在处理最后绘制到该缓冲区的任何内容。

因此,如果您有三个缓冲区,[1] 在屏幕上,您正在绘制被推送到屏幕的 [2],它没有 [1] 的内容,但是曾经绘制到 [ 2] 上次画的时候...

所以你有 [1][2][3],然后你有 [2][3][1],然后是 [3][1][2]。每个缓冲区至少会过期两个绘制周期。

这就是为什么每次都清除缓冲区并从头开始重建它们很重要的原因,因为您不知道上次绘制缓冲区是什么时候

【讨论】:

    【解决方案2】:

    这取决于您要绘制的内容和方式。

    屏幕以一定的速度“刷新”自身(例如每秒 60 次)。此时,无论显卡在其内存中的什么内容都会被绘制出来。

    虽然有很多不同的方法可以将东西放入显卡内存中,但它们的行为也不同。

    BufferedImage 不直接进入屏幕。相反,它被“复制”到显卡中并用于绘制到屏幕上。

    不过,Swing 将所有这些都隐藏了起来——你只需要担心重绘,剩下的事情它会处理。对此的实际处理来自您正在使用的Control,例如JButtonJPanel等。

    【讨论】:

    • 是的,我知道摇摆如何让绘画变得容易,但是,我决定开始练习一些主动渲染,而不是指望摇摆来为我完成所有的绘画。我一直在尝试使用三重缓冲将内容逐个像素地绘制到屏幕上,这让我感到困惑。
    • 您尝试这样做是否有特定原因?如果是为了学习,那很酷,但如果你有一个目标,你几乎肯定最好使用合适的库(例如 2d 或 3d 图形/游戏框架之一会很好)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多