帧率:我指的是显示变化的速率。即调用Ondraw()并重绘画布。
所有Android设备都有默认费率吗?由于此速率取决于设备的处理能力,如何在开始为该移动设备编程之前找出设备的帧速率?
答案 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库。