Android 当线程休眠一毫秒时,对象不以相同的速度移动
我目前正在尝试移动一些矩形对象(在我的surfaceview上显示为位图)。 它们应该以相同的速度移动,因此我的代码如下所示:Android 当线程休眠一毫秒时,对象不以相同的速度移动,android,Android,我目前正在尝试移动一些矩形对象(在我的surfaceview上显示为位图)。 它们应该以相同的速度移动,因此我的代码如下所示: new Thread (new Runnable() { @Override public void run() { while(true) { newTime
new Thread (new Runnable()
{
@Override
public void run()
{
while(true)
{
newTime = System.currentTimeMillis();
frameTime = newTime - currentTime;
currentTime = newTime;
physics(frameTime);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
我在基于frametime参数的物理方法中移动矩形对象
所以我的问题是:在我刚刚发布的代码中,我所有的矩形都以相同的速度移动,但是图形却滞后了。当我移除线程时,延迟就消失了。sleep(1),但是我的矩形对象将不再以相同的速度移动(一些矩形比其他矩形移动得更快)
有什么想法吗
编辑:
物理和movedown方法只是我的类中的普通方法,它们都不在任何线程中。他们只是从我上面发布的帖子中被呼叫
public void physics(double delta)
{
for(int i=0; i<=5; i++)
{
rectangles[i].moveDown(delta);
}
}
public void moveDown(double delta)
{
setY((double) (getY() + ((sH)*(delta/1000))));
//sH is the screen height
}
考虑到您发布的代码,很难进行分析,因为不清楚什么是
物理(帧时间)代码>实际上正在执行。似乎每个移动的矩形都在自己的线程中更新。然后,您得到的结果必须是预期的,因为根据线程调度,调用一个或另一个线程的频率将高于调用其他线程的频率。相反,使用一个线程来控制模拟(例如,更新frameTime
并将其提供给其他线程)。然而,我认为您必须重新思考您的体系结构。从您发布的代码中很难判断问题可能是什么,但我注意到的一点是,您可能会遇到一些时钟漂移。请参阅:
虽然,看起来像是用固定的偏移量移动矩形,所以即使有时钟漂移,我也希望它们能跳来跳去,但幅度相同。所以我同意Axel的观点,似乎有一些线程交互正在进行
你是怎么画到屏幕上的?如果您有另一个线程处理图形,这两个线程可能会不同步,您需要确保正确锁定。如果在绘制方法中使用delta来更新屏幕上的位置,则可以使用physics()方法中更新的绝对位置,并基于该绝对位置进行绘制。看来您可能需要重新考虑一些架构。我理解您的观点,但我看不出我的架构有任何问题。我添加了一些代码,也许你可以再看看?谢谢。我确实在画另一条线。我已经将代码添加到我原来的帖子中。在graphics(canvas)方法中,位图是用对象坐标(rectangle.getX()和Y)绘制的。有什么想法吗?
while(true)
{
if(!ourHolder.getSurface().isValid())
{
continue;
}
Canvas canvas = ourHolder.lockCanvas();
synchronized(ourHolder) {
graphics(canvas);
// in this method all the drawings happen
// e.g. canvas.drawBitmap
}
ourHolder.unlockCanvasAndPost(canvas);
}