Android 帧率优化那些事
23 Feb 2025 ~
2 Mar 2025
Android 帧率优化那些事
帧率,即FPS(每秒帧数),在Android中通常希望维持在60fps,这意味着每帧大约有16毫秒的处理时间。如果超过这个时间,就会导致掉帧,用户会觉得卡顿。所以维护帧率的关键在于确保每帧的处理时间不超过16ms。
FrameMetricsListener
FrameMetricsListener 是 Android 提供的一个用于监控应用帧率性能的工具,它可以帮助开发者精确测量每一帧的渲染时间,从而定位性能瓶颈。以下是示例代码,
public class MainActivity extends AppCompatActivity {
private Window.OnFrameMetricsAvailableListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listener = new Window.OnFrameMetricsAvailableListener() {
@Override
public void onFrameMetricsAvailable(
Window window, FrameMetrics frameMetrics, int dropCountSinceLastInvocation) {
long totalDuration = frameMetrics.getMetric(FrameMetrics.TOTAL_DURATION);
double fps = 1_000_000_000.0 / totalDuration;
Log.d("FrameMetrics", "FPS: " + fps);
}
};
// 注册监听器
getWindow().addOnFrameMetricsAvailableListener(listener, new Handler());
}
@Override
protected void onDestroy() {
super.onDestroy();
// 移除监听器
getWindow().removeOnFrameMetricsAvailableListener(listener);
}
}
Android帧率优化方式
异步处理耗时任务,减小主线程压力
布局优化
减少视图层级,例如ConstraintLayout代替多层嵌套的LinearLayout
使用
按需加载
使用ViewStub延迟加载不立即显示的视图。
使用RecyclerView代替ListView和ScrollView,动态加载列表项。
减少过度绘制
自定义View优化
避免在onDraw()中创建对象或执行耗时操作。
使用高效的绘制方法例如避免使用drawPath()
使用canvas.clipRect()限制绘制区域,避免不可见部分绘制。
考虑硬件加速(setLayerType(LAYER_TYPE_HARDWARE))
使用硬件加速
在AndroidManifest.xml中启用硬件加速:
```xml
```
对于特定视图,使用setLayerType(LAYER_TYPE_HARDWARE)。
优化RecycleView
使用DiffUtil高效更新数据集,避免notifyDataSetChanged()。
启用预加载(setItemViewCacheSize())和固定大小(setHasFixedSize(true))。
简化ViewHolder的绑定逻辑。
优化动画
优先使用ValueAnimator和ObjectAnimator,避免补间动画。
在onPause()或onStop()中及时暂停动画
减少同时运行的动画数量。
避免在动画期间触发重布局。
做好内存管理
使用Jetpack Compose高效渲染视图
采用声明式UI框架,通过@Composable函数和remember减少重复计算。
使用Modifier链式调用优化布局性能。
使用SurfaceView或TextureView播放视频或游戏
性能
帧率