我在3D空间中使用Libgdx开发了一个Android应用程序来渲染一些带有交互按钮的建筑物,以帮助用户在环境中导航。例如,左右按钮可以向左和向右移动相机。按下按钮导致执行一次代码,我已经使用这个技巧继续执行代码,因为用户按住按钮。
Collection.reverse(datalist);
此方法在AndroidListener的create()函数中调用,舞台也将在render()函数中绘制。有大约12个按钮使用相同的方法,但它给我一些滞后的渲染过程,而用户按住按钮几秒钟或同时按下两个按钮。这种方法有问题,还是经常执行代码的适当结构?
答案 0 :(得分:1)
Camera不是一个线程安全的类,因此如果从后台线程修改它,则需要使用同步。
也就是说,更新相机是一项微不足道的操作,因此多线程增加了许多不必要的复杂性。你生成了相当数量的垃圾,虽然我不知道这是否是你看到一些滞后的唯一原因。
以下是我如何更简单地做到这一点。
stage = new Stage();
float camSpeed = 0.5f / 15; // Units per ms
float camDisp = camSpeed * Gdx.graphics.getDeltaTime();
buttonLeft = new TextButton("", leftStyle){
public void act(float delta){
super.act(delta);
if (isPressed()){
camera.position.add(camera.direction.z * camDisp,
0,
-camera.direction.x * camDisp);
camera.update();
}
}
}
不太清楚你对相机方向做了什么,但我试图复制相同的行为。如果我只想将相机向左平移,我就这样做。 temp变量是为了避免实例化对象并触发GC。
private static final Vector3 TMP = new Vector3();
//...
TMP.set(camera.direction).crs(camera.up); // right vector of camera
camera.position.add(TMP.scl(-camDisp));