Android:如何查找设备的帧速率?

时间:2011-04-15 04:48:07

标签: android

帧率:我指的是显示变化的速率。即调用Ondraw()并重绘画布。

所有Android设备都有默认费率吗?由于此速率取决于设备的处理能力,如何在开始为该移动设备编程之前找出设备的帧速率?

4 个答案:

答案 0 :(得分:6)

这可能是this question的后续行动,我建议让重绘循环一次又一次地重复绘制可能有点过分。可能有一个API来找出设备显示的功能,但如果有我不知道它。当您编写自己的事件循环/线程函数时,您可以通过调用“绘制”方法的频率来控制帧速率。通常,我认为在大多数情况下,刷新率为30左右就可以了。如果您正在编写快速动作游戏,那么需要快速动画,那么可能希望尽可能快地运行,fps越多,它就越平滑。

典型的事件循环(线程运行函数)可能如下所示:

// define the target fps
private static final int UPDATE_RATE = 30;  // Frames per second (fps)

public void run() {
     while(running) {  // volatile flag, set somewhere else to shutdown
         long beginTimeMillis, timeTakenMillis, timeLeftMillis;

         // get the time before updates/draw
         beginTimeMillis = System.currentTimeMillis();  

         // do the thread processing / draw
         performUpdates();  // move things if required
         draw();            // draw them on the screen

         // get the time after processing and calculate the difference
         timeTakenMillis = System.currentTimeMillis() - beginTimeMillis;

         // check how long there is until we reach the desired refresh rate
         timeLeftMillis = (1000L / UPDATE_RATE) - timeTakenMillis;

         // set some kind of minimum to prevent spinning
         if (timeLeftMillis < 5) { 
             timeLeftMillis = 5; // Set a minimum
         }

         // sleep until the end of the current frame    
         try {
             TimeUnit.MILLISECONDS.sleep(timeLeftMillis);  
         } catch (InterruptedException ie) {
         }
    }
}

答案 1 :(得分:4)

您可以使用Android提供的dumpsys工具。要获取有关设备显示的信息,请执行以下命令:

adb shell dumpsys display

有关设备帧速率的信息在属性“mPhys”中提供。

你会发现类似的东西:

mPhys=PhysicalDisplayInfo{1080x1920, 60.000004 fps, densitiy 3.0, 
480.0x480.0 dpi, secure true}

设备的帧速率在第二个字段中,在我的情况下是60.000004 fps

答案 2 :(得分:2)

您不能依赖某种帧率。 Android是一个使用多任务操作系统。如果某些线程在后台运行时会执行一些繁重的操作,则可能无法达到所需的帧速率。即使您是唯一的活动进程,帧速率也取决于您的GPU和CPU以及每个进程的时钟。也许用户有一个黑客ROM,可以将时钟更改为自定义值。

某些手机可能会锁定到某个帧速率。 HTC EVO被锁定为30fps的时间最长,直到自定义ROM出来,消除了这个限制。较新的EVO ROM也取消了这一限制。

我不知道你要做什么,但最好的办法是测量每帧后的时间并将动态增量用于动画。如果您尝试显示FPS,请使用平滑的平均值。

答案 3 :(得分:0)

这可能是一个老问题,但为了将来参考,我发现这个图书馆名为Takt https://github.com/wasabeef/Takt。 Takt是用于使用Choreographer测量FPS的Android库。