我决定添加一个玩具:屏幕上有 4 个人物在移动。例如,该方法figure.update()重新计算图形的坐标。还有第五个数字,我通过触摸传感器来控制它。被覆盖的方法onTouchEvent(MotionEvent event)从传感器读取数据并更新我的受控图形的坐标。现在渲染进展如何:完成figure.update()对于所有人物,画。但我控制的图形也是在第二步绘制的,只是它的坐标会随着传感器的触摸而变化。那些。可能会出现一种情况,在我绘制的那一刻,图形的坐标已经更新,X已经更新,Y变量还没有更新。结果,将绘制出不完全正确的图形位置。也许在 60 fps 时这些侧柱并不明显.. 我个人在开始游戏时没有看到任何此类错误,好像一切都经过准确计算。但毕竟按照逻辑,应该有错误..不应该有这样的错误:那个渲染正在进行中,这个图的坐标是由传感器更新的,因为传感器的工作去在 UI 线程中,其余的物理和渲染计算在附加中。溪流。事实证明我必须将这些变量标记为同步,
我会给出代码,但我认为这里是多余的,我再重复一遍:在 UI 线程中,图形的值根据传感器的结果而变化,并且在附加值中。线程正在绘制这个数字。为什么没有因绘图需要UI线程中当前正在更改的坐标这一事实而导致异常。或者为什么在沿着传感器的急剧移动过程中 X 坐标发生变化,而 Y 仍然具有旧值的这种时刻对眼睛来说并不明显。
我想到了以下答案:UI 线程只需要更新从传感器接收到的两个变量,它很快就能解决这个问题。添加。流始终具有从相同传感器读数读取的两个坐标。但问题仍然存在:如果 UI 经常更新坐标(我在屏幕上快速移动手指),那么为什么会额外更新。当坐标正忙于从 UI 线程写入时,线程不会遇到这种情况。
使用同步对象并交替计算物理、渲染和来自用户的输入。正如您正确指出的那样,根本不可能同时处理来自多个线程的数据。
例如,您每秒进行 50 次物理计算(通常它没有意义,因为在屏幕上您不会看到每秒超过 100 帧,并且您会明白某些东西并没有完美地移动)。您可以查看物理的每一个滴答声是否发生了变化,是否有来自玩家的新命令,并应用它们。玩家命令通常在物理和渲染之间进行缓冲和处理。所以你的程序将像这样工作:
物理和命令以固定的步骤进行处理,渲染 - 只要它需要。对于图片的平滑度 - 使用插值(或外插)。
飞过其他物体是在碰撞处理程序的一侧决定的(不仅检查碰撞点,而且检查它们之间的完整路径)。