Opengl es Opengl ES 2.0摄像头在移动时会猛推播放器

Opengl es Opengl ES 2.0摄像头在移动时会猛推播放器,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,我正在尝试使用OpenGL在Android上创建简单的游戏 我在两个线程上运行游戏。一个用于渲染,一个用于移动对象。问题是,当我试着用相机跟踪播放器时,播放器开始抖动。(有关屏幕录制,请参见youtube链接) 我试着用两种不同的方式移动相机。首先,我尝试将其移动到播放器的顶部(相机x,y与播放器x,y相同)。第二,我试着将它作为弹性/弹簧来跟随玩家。在这两种情况下都会发生抖动 (摄像机位于播放器顶部) (照相机弹性弹簧) 我尝试在移动时打印播放器和相机的x位置,但看起来它们的移动并不一致。更奇

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

我在两个线程上运行游戏。一个用于渲染,一个用于移动对象。问题是,当我试着用相机跟踪播放器时,播放器开始抖动。(有关屏幕录制,请参见youtube链接)

我试着用两种不同的方式移动相机。首先,我尝试将其移动到播放器的顶部(相机x,y与播放器x,y相同)。第二,我试着将它作为弹性/弹簧来跟随玩家。在这两种情况下都会发生抖动

(摄像机位于播放器顶部)

(照相机弹性弹簧)

我尝试在移动时打印播放器和相机的x位置,但看起来它们的移动并不一致。更奇怪的是,这条绿色的鱼并没有猛拉,而是以和游戏者差不多的速度移动

下面是螺纹设计的快速草图

(播放器的移动速度/方向由加速计控制。)

编辑(在mikkokoo的回答之后): 在进一步研究这个问题之后,我发现这个“现象”被称为相机口吃。 问题是,正如Mikkokoo所说的,当渲染器仍在绘制精灵时,精灵会移动,fps中的一些下降(即使是很小的下降)也会导致此事件

一个简单的解决方案是在渲染器线程上完成所有工作。 更好的解决方案是以某种方式同步渲染器和“工作”线程。首先,修复fps(渲染器和工作线程)很好。我们让渲染器保持原样,因为它是由vsync修复的,另一方面,我们将工作线程修复为120fps。 因为在我们的例子中,只有玩家(果冻)口吃,所以我们将他的步骤改为在渲染线程上完成。这基本上修复了口吃,渲染器线程上的额外工作负载最小,因为只需要执行3个额外的矩阵操作(旋转、平移、缩放)


如果您从一开始就使用引擎,我可能会看看如何为每个精灵实现2个“holder”modelViewMatrix。然后,当你移动精灵时,你总是在holderMatrix上移动它,然后从另一个绘制它。绘图完成后,您只需更改保持架和“实”矩阵即可。这将基本上消除在绘制时更改矩阵的问题。

在我看来,水母似乎在您的
getPlayerlocation
和水母的
drawSprite
之间移动

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