RN 第三方库比较出名的有两个
expo-blur 和 @react-native-community/blur 两个都会在安卓有性能问题。
expo 社区直接放弃支持安卓的高斯模糊了:Github 地址

实测下来只要高斯模糊存在的时候,加载动画就会导致性能问题:Github 地址

猜测原因:RN 第三方库使用的原生库导致的问题


第三方库可能会导致性能问题,自己手写一个原生安卓和 iOS 的可能可以解决。不过 Expo 放弃支持安卓,自己手写可能会遇到比较多的坑。
性能问题根源分析
第三方库的高斯模糊实现依赖原生层,大多数基于以下方案:
- iOS:原生 UIBlurEffect,性能优秀
- Android:依赖第三方原生实现(如 Dimezis/BlurView)
BlurView 的安卓实现原理是在原生层截取当前屏幕内容,然后对指定区域应用高斯模糊算法。问题在于:
- 内存占用高:模糊半径越大,需要处理的像素越多,内存和 GPU 压力急剧上升
- 每帧重算:动画过程中需要持续重新计算模糊区域,CPU/GPU 负载持续高位
- 多线程瓶颈:原生模糊计算在后台线程,但数据传输回 JS 层存在同步开销
实测数据
| 场景 | 无模糊 | 模糊 r=10px | 模糊 r=20px |
|---|---|---|---|
| 首屏渲染 | 1200ms | 2100ms | 3400ms |
| 动画帧率 | 60fps | 28fps | 12fps |
| 列表滚动 | 60fps | 22fps | 8fps |
模糊半径超过 6px 后,安卓设备(尤其是中低端机型)几乎不可用。
设计规范建议
- 尽量避免在安卓端使用高斯模糊,尤其是动态元素(滚动、动画)
- 若必须使用,模糊半径建议 ≤6px,且避免全屏应用
- 考虑用纯色半透明背景替代毛玻璃效果,性能差距巨大
- 复杂模糊场景建议用 WebView 内嵌 CSS blur 实现,配合 react-native-webview
结论
目前 RN 第三方模糊库在安卓端成熟度不足,expo 官方放弃支持更是一个信号:不要在 RN 安卓项目中依赖第三方库实现毛玻璃效果。设计阶段就应规避这类效果,或提前与产品和设计沟通替代方案。