Android 当物体数量增加时,如何保持物体的速度不变?

Android 当物体数量增加时,如何保持物体的速度不变?,android,Android,我正在做一个游戏,我正在使用SurfaceView。在游戏中,我有25个小点在移动。我们的目标是制作一个游戏,玩家用相同的颜色在一些点周围画一个圆圈。我的问题是,当我画这个圆圈时,当我把手指从屏幕上抬出来后,所有的点都移动得非常非常慢!我想这是因为所有的直线段和所有的点不断地画在一起 点的移动速度是否可能始终相同?我用SystemClock.Sleep(1)进行了测试,但没有多大帮助 // Method to draw objects private void drawObjects(Canva

我正在做一个游戏,我正在使用
SurfaceView
。在游戏中,我有25个小点在移动。我们的目标是制作一个游戏,玩家用相同的颜色在一些点周围画一个圆圈。我的问题是,当我画这个圆圈时,当我把手指从屏幕上抬出来后,所有的点都移动得非常非常慢!我想这是因为所有的直线段和所有的点不断地画在一起

点的移动速度是否可能始终相同?我用
SystemClock.Sleep(1)
进行了测试,但没有多大帮助

// Method to draw objects
private void drawObjects(Canvas canvas) {
    SystemClock.sleep(1);
    synchronized (this) {

    // Clear screen with black color
    canvas.drawRGB(0, 0, 0);

    // Draw line
    if(startDrawLine) {
        // Set properties to Paint object
        paint.setColor(Color.WHITE);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);
        // Draw path
        path.moveTo(touchDownX, touchDownY);
        for(Point point: points) {
            path.lineTo(point.x, point.y);
            canvas.drawPath(path, paint);
        }   
        path.reset();
    }
}
    // Call method draw() in CircleManager to draw all circles in list
    circleManager.drawCirclesInList(canvas);
}

绘制速度慢是由于路径中的多个点太多造成的。 如果您正在处理
Touch
事件,您可以期望在短时间内触摸成百上千次(您的点)

  • 你需要以某种方式插值你的点-取平均值,忽略相同和接近的点或其他东西
  • 为“点”设置动画时,动画必须基于时间,而不是硬件上图形的实际速度 要使动画基于时间,您应该计算从上一帧开始经过的时间,并在计算点的新位置的函数中使用此时间。 这是一篇关于这个主题的好文章:

    编辑-回复评论:

    假设你的“点”(我称之为)需要以每秒
    100
    单位的恒定速度从左到右水平移动(通过
    X

    如果您在计算时假设游戏将以25 FPS的速度运行,只需在每个帧上向
    X
    添加
    4

    这种方法的问题在于很难获得恒定的FPS。 在快速硬件上,限制FPS会牺牲平滑度, 在速度较慢的硬件上,您将被迫跳过绘制(删除)某些帧(在FPS恒定的情况下,这些帧可能会跳跃)

    Android中的计时器不是很精确,而且线程睡眠功能也不准确。 在您的情况下,不要试图强制使用恒定的FPS或计算当前FPS,而是试着回过头来重新思考您的问题 在时间的背景下

    当你想到时间时,游戏有多快并不重要 正在运行(每秒多少次)以及之前发生了什么

    你只需要问一个问题“球应该在这里的什么地方?” 现在,马上?”

    例如,如果您知道在原点时间
    T0
    球的运动开始于原点位置
    X0
    ,那么在当前时刻
    TC
    球的位置应该是
    X=(TC-T0)*100

    第二种方法是测量自上次球位更新以来经过的时间
    TD
    。然后球的位置应该像这样更新:
    X=X+TD*100


    一旦你习惯了这种方法,你会发现绝大多数的动画都非常简单,很难精确地实现。

    缓慢的绘制是由于路径中的许多点太多造成的。 如果您正在处理
    Touch
    事件,您可以期望在短时间内触摸成百上千次(您的点)

  • 你需要以某种方式插值你的点-取平均值,忽略相同和接近的点或其他东西
  • 为“点”设置动画时,动画必须基于时间,而不是硬件上图形的实际速度 要使动画基于时间,您应该计算从上一帧开始经过的时间,并在计算点的新位置的函数中使用此时间。 这是一篇关于这个主题的好文章:

    编辑-回复评论:

    假设你的“点”(我称之为)需要以每秒
    100
    单位的恒定速度从左到右水平移动(通过
    X

    如果您在计算时假设游戏将以25 FPS的速度运行,只需在每个帧上向
    X
    添加
    4

    这种方法的问题在于很难获得恒定的FPS。 在快速硬件上,限制FPS会牺牲平滑度, 在速度较慢的硬件上,您将被迫跳过绘制(删除)某些帧(在FPS恒定的情况下,这些帧可能会跳跃)

    Android中的计时器不是很精确,而且线程睡眠功能也不准确。 在您的情况下,不要试图强制使用恒定的FPS或计算当前FPS,而是试着回过头来重新思考您的问题 在时间的背景下

    当你想到时间时,游戏有多快并不重要 正在运行(每秒多少次)以及之前发生了什么

    你只需要问一个问题“球应该在这里的什么地方?” 现在,马上?”

    例如,如果您知道在原点时间
    T0
    球的运动开始于原点位置
    X0
    ,那么在当前时刻
    TC
    球的位置应该是
    X=(TC-T0)*100

    第二种方法是测量自上次球位更新以来经过的时间
    TD
    。然后球的位置应该像这样更新:
    X=X+TD*100


    一旦你习惯了这种方法,你会发现绝大多数动画都非常简单,很难精确地实现。

    我使用LogCat来计算点数,如果我画一个圆,“只有”50点左右。那不多!?杜桑,有没有更好的办法?如果你能给我看的话?也许是我的代码让事情变慢了!?首先,尝试移动canvas.drawPath(path,paint);在循环之外,将其放在循环之后。我还想补充一点,我正在实现Runnable