Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当线程休眠一毫秒时,对象不以相同的速度移动_Android - Fatal编程技术网

Android 当线程休眠一毫秒时,对象不以相同的速度移动

Android 当线程休眠一毫秒时,对象不以相同的速度移动,android,Android,我目前正在尝试移动一些矩形对象(在我的surfaceview上显示为位图)。 它们应该以相同的速度移动,因此我的代码如下所示: new Thread (new Runnable() { @Override public void run() { while(true) { newTime

我目前正在尝试移动一些矩形对象(在我的surfaceview上显示为位图)。 它们应该以相同的速度移动,因此我的代码如下所示:

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);

        }