Android 何时重新绘制游戏的整个UI(在低端设备上不使其变慢)
我正在开发一个游戏,其中包括屏幕上的一些视图,这些视图正在移动,您可以与它们交互 我正在使用ObjectAnimator修改这些视图的x、y以及宽度和高度 我添加了更多的视图,删除了一些视图,并且每X秒添加一次新的坐标和比例 对于更新屏幕,我将在线程上使用此run方法每10毫秒使屏幕上的整个项目集合无效:Android 何时重新绘制游戏的整个UI(在低端设备上不使其变慢),android,game-engine,game-physics,frame-rate,Android,Game Engine,Game Physics,Frame Rate,我正在开发一个游戏,其中包括屏幕上的一些视图,这些视图正在移动,您可以与它们交互 我正在使用ObjectAnimator修改这些视图的x、y以及宽度和高度 我添加了更多的视图,删除了一些视图,并且每X秒添加一次新的坐标和比例 对于更新屏幕,我将在线程上使用此run方法每10毫秒使屏幕上的整个项目集合无效: public void run() { while( !backgroundThread.interrupted() ) { synchronized
public void run() {
while( !backgroundThread.interrupted() ) {
synchronized(this){
wait(10);
doSomeStuffInOtherThread(); //like adding more items or moving them, etc...
allMyObjects.invalidateInOtherThread(); //this is just pseudocode for simplify the sample
}
}
}
它可以工作,在功能强大的设备上,每10毫秒就要重新绘制一次,给用户一种平滑的帧率感觉。问题是,当我在低端设备上测试游戏时,游戏速度非常慢。我认为这是因为其他线程()和其他线程中的所有myobjects.invalidate()方法在低端设备上执行的时间太长,超过10毫秒,而在高端设备上则是立即执行的(不到10毫秒)
有没有更好的方法可以在不损失游戏速度的情况下重新绘制屏幕?如果游戏丢失fps,这不是问题,问题是它正在丢失速度。
谢谢基本上,你的问题在于你依赖于你的设备处理你的东西所需的时间。这可以用类似的例子来说明
struct Ball {
float pos_x, pos_y;
float vel_x, vel_y;
};
int main() {
Ball b{ 0.f, 0.f, 10.f, 10.f };
for (;;) {
DosomethingThatMightTakeAWhile();
b.pos_x += b.vel_x;
b.pos_y += b.vel_y;
}
}
看看这段简单的代码,你可以很容易地看到,任何一台计算机从(0,0)
到(100,100)
都需要10个步骤,但这10个步骤可能在10毫秒内完成,也可能在10秒钟内完成,这取决于在特定计算机上可能需要的时间。这就是你的问题。您不需要花费实际的计算时间来计算元素的移动量
要解决这个问题,您只需考虑从最后一帧开始经过的时间(可能需要睡眠一段时间以节省电池)。因此,现在您的代码将如下所示
int main() {
Ball b{ 0.f, 0.f, vel_x, vel_y }; // vel_x and vel_y are the new velocities,
// tweaked to match the speed you want
int64_t t0, t1; // In milliseconds here
t0 = GetTimeSinceStartup();
for (;;) {
DoSomethingThatMightTakeAWhile();
t1 = GetTimeSinceStartup();
float dt = (t1 - t0) / 1000.f; // Time elapsed in seconds
t0 = t1;
b.pos_x += b.vel_x * dt;
b.pos_y += b.vel_y * dt;
}
}
您可以看到代码并不复杂,但区别在于,现在,在计算新位置时,您有效地考虑了经过的时间。这意味着时间dosomethingthatthatthattakeawhile()
不再重要,如果你想让你的球移动100像素需要1秒,你可以将它的速度设置为每秒100像素,这将需要1秒。你说的“失去速度”是什么意思?也许在计算中使用从最后一帧开始经过的时间就可以了。@Zouch我的意思是,如果我在功能强大的设备上移动对象,它们移动得非常快,如果我在低端设备上移动它们,它们移动得非常慢。我敢肯定,问题是在较低的设备中,10ms不足以计算这两个函数的内容。请解释一下你的提议,我不明白你想告诉我什么你应该这么做。我稍后会详细说明!