Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.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 何时重新绘制游戏的整个UI(在低端设备上不使其变慢)_Android_Game Engine_Game Physics_Frame Rate - Fatal编程技术网

Android 何时重新绘制游戏的整个UI(在低端设备上不使其变慢)

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

我正在开发一个游戏,其中包括屏幕上的一些视图,这些视图正在移动,您可以与它们交互

我正在使用ObjectAnimator修改这些视图的x、y以及宽度和高度

我添加了更多的视图,删除了一些视图,并且每X秒添加一次新的坐标和比例

对于更新屏幕,我将在线程上使用此run方法每10毫秒使屏幕上的整个项目集合无效:

   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不足以计算这两个函数的内容。请解释一下你的提议,我不明白你想告诉我什么你应该这么做。我稍后会详细说明!