移动时Opengl ES 2.0相机抖动播放器

时间:2014-12-03 08:47:59

标签: opengl-es opengl-es-2.0

我尝试使用OpenGL在Android上创建简单的游戏。

我在2个主题上运行游戏。一个用于渲染一个用于移动物体。问题是,当我尝试用相机跟随玩家时,玩家开始蠢蠢欲动。 (有关屏幕录制,请参阅youtube链接)

我尝试以两种不同的方式移动相机。首先我尝试将其移动到玩家之上(相机x,y与玩家x,y相同)。其次,我尝试将其作为弹性/弹簧移动以跟随玩家。在两种情况下都会发生颠簸。

http://youtu.be/5DXuYuaabvM(玩家顶部的相机)

http://youtu.be/4M-udbu2Vfc(相机弹性弹簧)

我试图在移动时打印播放器和相机x位置,看起来它们看起来并不均匀。更奇怪的是,绿色的鱼并没有晃动,而是以与玩家大致相同的速度移动。

这是线程设计的快速草图。

Thread design

(玩家的移动速度/方向是加速度计的控制器。)

编辑(在mikkokoo回答之后): 经过对问题的研究之后,我发现了这个"现象"被称为相机口吃。 问题是因为Mikkokoo的说法是精灵移动而渲染器仍在吸引他,fps中的一些下降(即使是小的)也有助于此事件。

一个简单的解决方案是在渲染器线程上完成所有工作。 一个更好的解决方案是以某种方式同步渲染器和"工作"线。首先,修复你的fps(渲染器和工作线程)是很好的。我们将渲染器保留原样,因为它由vsync修复,另一方面我们将工作线程固定为120fps。 因为在我们的情况下只有玩家(果冻)口吃,我们改变了他在渲染器线程上完成的步骤。这基本上是固定的口吃,渲染器线程上的额外工作量是最小的,因为只需要进行3次额外的矩阵操作(旋转,平移,缩放)。

如果您从头开始使用引擎,我可能会看看如何实施2" holder"每个精灵的modelViewMatrix。然后当你移动精灵时,你总是在holderMatrix上移动它,然后从另一个中绘制它。绘图完成后,您只需更改持有人和"真实"矩阵。这基本上可以消除在绘制时改变矩阵的问题。

1 个答案:

答案 0 :(得分:0)

对我而言,水母在你的getPlayerlocationdrawSprite水母之间移动。

尝试对相机矩阵使用相同的坐标并绘制水母(从getPlayerlocation获得的水母)。