为什么我们在draw()之前更新()?

时间:2014-03-18 19:34:40

标签: three.js glfw cinder

这对我来说没有意义。我看了GLFW和Three.js'示例和Cinder的实现实际上有this comment

  

将所有窗口标记为准备绘制;这真的只对第一个很重要   时间,以确保第一次update()在draw()

之前触发

所有三个图书馆似乎都是这样做的,我不明白为什么。没有必要更新那些从未在屏幕上绘制过的东西的位置,或者在那里?

这是我的循环的样子:

  1. 绘制(第一个)框架
  2. 交换缓冲区
  3. 更新活动
  4. Animate(使用事件的输入),更新逻辑,......
  5. 从顶部开始
  6. 这个命令对我来说更有意义,但也许我错过了一些东西。

1 个答案:

答案 0 :(得分:1)

我认为首先更新对象然后绘制它们是完全合理的。

想象一下,你将一个球从屏幕的一侧移动到另一侧并像钟摆一样向后移动。想象一下,您还希望它能够真实地反映您计算机中的实时情况。如果您在更新球的位置之前绘制场景,那么您的球将位于第一帧中的哪个位置?除非你手动设置它的初始位置,否则它将处于场景的零点,这可能完全超出了它的预期轨迹。如果您决定在开始动画之前初始化它的位置,则可能会发生时间间隔导致它也处于错误的位置。

但是如果你总是在绘制前更新它的位置,它将在第一个渲染帧的正确位置。

但说实话 - 没有人会注意到第一帧,所以更多的逻辑意识是这样做而不是任何实际原因。我觉得在绘制场景之前准备场景更有意义,反之亦然。