目录
- SVG & PNG
- SP & MMKV
- layout 布局
- SystemUI 优化
SVG & PNG 图片 CPU 和 内存对比
测试数据对比:
测试结论:
- 图片 png 资源对于在目前的台架设备上,图片放在 drawable-hdpi 目录下比图片放在默认 drawable 目录下更省内存及 cpu
- svg 图片比 png 图片更占内存,但更节省 apk 包体积。对需要做多分辨率的设备更友好
- 采用 svg 资源相对来说会占据更多的 cpu
SVG(Scalable Vector Graphics)
优点:
- 可缩放性:SVG 是矢量图形,可以任意缩放而不会失真,非常适合需要在多个屏幕尺寸和分辨率上显示的图像。
- 文件大小:对于简单的图形,SVG 文件通常比相应的 PNG 文件更小。
- 灵活性:SVG 图像可以通过代码动态修改,例如改变颜色、形状等。
缺点:
- 渲染开销:SVG 文件在运行时需要解析和渲染,这可能会增加 CPU 的负担,尤其是对于复杂的 SVG 图像。
- 内存使用:虽然 SVG 文件本身可能较小,但渲染后的内存占用可能会比等效的 PNG 图像更高,特别是在复杂的 SVG 图像或频繁重绘时。
PNG(Portable Network Graphics)
优点:
- 渲染速度:PNG 是位图图像,直接显示在屏幕上,不需要额外的解析和渲染步骤,因此渲染速度通常比 SVG 快。
- 内存占用:PNG 图像的内存占用是确定的,取决于图像的分辨率和色深。对于简单的图像,内存占用可能比等效的 SVG 渲染后更低。
- 兼容性:PNG 图像在所有平台和设备上都能一致地显示。
缺点:
- 文件大小:对于复杂的图像,PNG 文件可能比等效的 SVG 文件更大。
- 不可缩放性:PNG 是位图图像,缩放时可能会失真或模糊。
内存使用比较
- SVG 渲染后的内存使用:SVG 文件在加载和渲染时会占用内存,具体内存使用量取决于图像的复杂性和渲染引擎的效率。对于复杂的 SVG 图像,渲染后的内存占用可能会高于等效的 PNG 图像。
- PNG 内存使用:PNG 文件在加载时会直接占用内存,内存使用量取决于图像的分辨率和色深。对于简单的图像,内存占用可能比等效的 SVG 渲染后更低。
实践建议
- 简单图形使用 SVG:对于简单的、需要缩放的图形(如图标、矢量图形等),使用 SVG 可以减少文件大小并提供更好的缩放效果。
- 复杂图像使用 PNG:对于复杂的图像或照片,使用 PNG 可以提供更好的性能和一致的显示效果。
- 混合使用:在实际项目中,可以根据具体情况混合使用 SVG 和 PNG。例如,使用 SVG 作为图标和简单图形,使用 PNG 作为复杂图像和照片。
SP & MMKV 对比
测试数据对比
测试结论
- 测试的是以切换壁纸桌面,在 cpu 和 内存上没有明显的优劣
- mmkv 在代码使用上不依赖 context
- 项目中切换壁纸,移动卡片,信号接收的数据是有做本地存储,这些数据的读写频率较高推荐使用 mmkv
SharedPreferences
优点:
- 内置支持:
SharedPreferences是 Android SDK 的一部分,无需额外依赖库。 - 简单易用:适合存储少量的简单数据,如布尔值、字符串、整数等。
缺点:
- 性能:在处理大量数据或频繁读写操作时,性能不如一些第三方解决方案。
- 功能有限:不支持复杂的数据类型(例如自定义对象),需要额外的转换。
MMKV
优点:
- 高性能:
MMKV由腾讯开发,基于 mmap 内存映射,读写性能优于SharedPreferences。 - 支持更多数据类型:除了基本数据类型,还支持自定义对象和复杂数据结构的存储。
- 线程安全:
MMKV的读写操作是线程安全的。 - 数据恢复:
MMKV提供了数据恢复机制,防止数据损坏。
缺点:
- 额外依赖:需要在项目中引入第三方库。
选择建议
- 简单应用或小规模数据存储:如果你的应用只需要存储少量的简单数据,并且对性能要求不高,
SharedPreferences是一个足够的选择。 - 高性能需求或复杂数据存储:如果你的应用需要频繁读写操作,处理大量数据,或者需要存储复杂的数据结构,
MMKV是一个更好的选择。
layout 布局
测试数据对比
测试结论
- 移除未使用的 dataBinding ,去除 layout 标签后内存占有减少了 10~100M
- 删除使用了 layout 包裹且未使用数据绑定的 xml 文件
性能损耗
- 使用
<layout>标签包裹 XML 布局文件,会有数据绑定和布局解析的开销。
SystemUI 优化
测试数据对比
测试结论
- 优化之前和优化之后的数据有明显的提升,内存占比减少了 25~140M
- systemui 的内存大头在负一屏上
修改手段
- 更改 AppCenterActivity 配置,切换主题模式时不会重新销毁再次创建
- 更改主题模式更新方式,主动更换主题而不是依赖重建切换主题UI
- 负一屏内存泄漏优化:负一屏状态监听列表集合的资源释放逻辑添加