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