Android 帧率优化那些事

Android 帧率优化那些事

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播放视频或游戏

性能

帧率

相关风暴

怪物獵人麻痹菇位置
mobile365官方网站立即加入

怪物獵人麻痹菇位置

🌧️ 10-24 👁️ 4831
《战地3》单人战役时长6-10小时
bt365博彩手机版

《战地3》单人战役时长6-10小时

🌧️ 08-24 👁️ 9566
葉總再生工廠品質有保證 龍隊如何一步步建構明確雛形?
mobile365官方网站立即加入

葉總再生工廠品質有保證 龍隊如何一步步建構明確雛形?

🌧️ 10-12 👁️ 7870
电子驾驶证申请需要多久时间
3658官方网

电子驾驶证申请需要多久时间

🌧️ 11-29 👁️ 9372