
文档教程移动开发【免费下载链接】android-training-course-in-chineseAndroid官方培训课程中文版项目地址https://gitcode.com/gh_mirrors/an/android-training-course-in-chinese点击查看免费下载本指南对应 Android 官方培训课程中文版中「优化性能和电池使用时间」一章面向正在使用CanvasWatchFaceService实现自定义表盘的开发者。文章围绕表盘位图资源优化、绘制管线精简与节能策略三条主线结合 Android SDKWatchFace示例中的源码结构给出可直接落地到表盘工程中的实战方案。Android Wear 表盘会在设备上一直运行且每次时间变化、动画刷新都需要重绘。除呈现清晰的 notification cards 和系统指示图标外开发者必须确保表盘动画流畅、服务不执行无谓计算。本文给出四类经过验证的优化手段裁剪与合并位图、禁用反锯齿并使用位图滤镜、将重操作移出onDraw()、以及动画帧频与 CPU 睡眠等节能最佳实践帮助你显著提升动画帧率并节省设备电量。减小位图资源的尺寸许多表盘由一张背景图片及若干被变换、叠加其上的图形资源组成例如时钟指针和随分钟移动的设计组件。每次系统重绘表盘时这些组件都会在Engine.onDraw()方法中被旋转有时还涉及缩放详见绘制表盘。图形资源越大变换它们所需的运算量越大。在onDraw()中变换大图会显著拉低系统运行动画的帧率。因此不要使用比实际需要更大的图像组件——资源尺寸应与最终绘制区域匹配避免冗余的变换开销删除边缘多余的透明像素——裁剪掉位图四周的透明区域让变换运算只作用在有效像素上。以时钟指针为例将 259×259 的完整画布裁剪为 22×95 的紧凑指针见上文中 ClockHandCropped.png体积最多可缩小 97%对应的变换开销随之锐减。这一优化同时提升动画性能并降低电量消耗。合并位图资源如果有经常需要一起绘制的位图可考虑把它们合并进同一张图形资源中。例如在交互模式下通常可以将背景图片和计数标记组合成一张图从而避免每次重绘时绘制两个全屏位图。合并后onDraw()中drawBitmap()的调用次数减少带宽与指令开销同步下降。当绘制可缩放的位图时禁用反锯齿使用Canvas.drawBitmap()绘制可缩放位图时可以通过传入的Paint实例设置绘制选项。对位图而言反锯齿设置没有任何效果应调用setAntiAlias(false)禁用它以提升性能。反锯齿只对文本、几何形状等矢量绘制有意义在位图上只会白白消耗像素混合运算。使用位图滤镜对于绘制在其它组件之上的位图资源可在同一个Paint实例上调用setFilterBitmap(true)打开位图滤镜使缩放后的位图边缘平滑过渡对比见上文 BitmapFilterEnabled.png。该功能对放大后的位图尤为重要未开启时边缘会出现生硬的锯齿状像素块。注意在低比特率的环境模式low-bit ambient mode下系统无法可靠渲染图片颜色因而不能保证位图滤镜成功执行。此时应关闭位图滤镜——这与绘制表盘中关于设备属性的处理一致通过onPropertiesChanged()读取PROPERTY_LOW_BIT_AMBIENT在切换到环境模式时同时关闭反锯齿与位图滤镜。将复杂的操作移到 onDraw() 方法外面Engine.onDraw()在每次重绘时都会被调用应只保留更新表盘所必需的核心绘制操作。应避免在onDraw()中执行加载图片和其它资源调整图片大小分配对象运行在帧与帧之间不会改变的计算。这些操作通常应在Engine.onCreate()中完成。而图片的缩放可以放在onSurfaceChanged()该方法提供画布尺寸执行之前因为表盘背景通常按屏幕尺寸只缩放一次并缓存复用——这正是WatchFace示例中AnalogWatchFaceService.Engine的做法在onCreate()中加载背景位图、初始化Paint样式与Time对象onDraw()内仅在背景尺寸变化时才重新调用Bitmap.createScaledBitmap()生成mBackgroundScaledBitmap之后直接canvas.drawBitmap()绘制。可参考 Android SDK WatchFace 示例中的onDraw()结构Override public void onDraw(Canvas canvas, Rect bounds) { mTime.setToNow(); // 更新当前时间 int width bounds.width(); int height bounds.height(); // 背景按需缩放一次并缓存 if (mBackgroundScaledBitmap null || mBackgroundScaledBitmap.getWidth() ! width || mBackgroundScaledBitmap.getHeight() ! height) { mBackgroundScaledBitmap Bitmap.createScaledBitmap( mBackgroundBitmap, width, height, true /* filter */); } canvas.drawBitmap(mBackgroundScaledBitmap, 0, 0, null); // ... 仅进行与帧相关的旋转角度计算与指针绘制 }除此之外自定义定时器Handler与数据获取任务也应通过Engine.onVisibilityChanged()在表盘可见时才启动、不可见时移除消息确保资源加载与重计算不会在表盘隐藏时白白消耗电量详见在表盘上显示信息中的onMeetingsLoaded()与定时器管理代码。性能分析工具可以使用 Android Device Monitor 观察onDraw()的耗时。重点确认onDraw()实现运行时间短且每次调用时长一致若存在偶发长帧往往意味着其中混入了加载或分配等重操作。节能的最佳做法除前述绘制层面的技术外还应遵循以下电量优化最佳实践。降低动画的帧频动画消耗大量计算资源与电量。大部分动画在每秒 30 帧30 fps下已经足够流畅应避免帧频高于 30 fps。结合绘制表盘中的自定义定时器设计AnalogWatchFaceService通过Handler以INTERACTIVE_UPDATE_RATE_MS为间隔调度MSG_UPDATE_TIME消息触发invalidate()将刷新频率控制在需求允许的最低值即可。让 CPU 睡眠表盘动画和内容的小变化会唤醒 CPU。表盘应在动画之间让 CPU 进入睡眠——例如在交互模式下可以每隔一秒用动画短脉冲刷新下一秒让 CPU 休眠。即使是很短暂的频繁休眠也能有效降低电量消耗。需要谨慎对待闪烁动画闪烁本身就会持续唤醒 CPU 并耗电。同时注意表盘服务声明了WAKE_LOCK权限见构建表盘服务持有唤醒锁会阻止 CPU 休眠务必在动画结束后及时释放。监控电量消耗在Android Wear 配套应用companion app的 Settings Watch battery页面开发者和用户可以看到可穿戴设备中不同进程的电量占用情况据此定位表盘服务是否过度耗电。在 Android 5.0 中可进一步参考 Project Volta 的相关电量提升建议例如使用 JobScheduler 等节能 API 代替后台频繁唤醒任务。小结把优化贯穿到表盘实现全程性能与电量优化不是收尾工作而应贯穿设计表盘环境模式保持大面积黑色、使用有限颜色、构建表盘服务合理声明权限与注册服务、绘制表盘资源一次性初始化、onDraw()精简与在表盘上显示信息低频获取数据、缓存结果的整个实现链路。遵循本文的位图裁剪、资源合并、滤镜开关、onDraw()瘦身与 CPU 睡眠策略即可在流畅动画与长续航之间取得平衡。若在实现中遇到屏幕形状适配、card 遮挡等问题可参考定位常见的问题。赞分享文档教程移动开发【免费下载链接】android-training-course-in-chineseAndroid官方培训课程中文版项目地址https://gitcode.com/gh_mirrors/an/android-training-course-in-chinese点击查看免费下载相关推荐Yi 开源双语大模型从 0 到 1安装、推理到微调的完整新手教程Yi 开源双语大模型从 0 到 1安装、推理到微调的完整新手教程 Yi 是 01.AI 从零训练非 Llama 衍生品的开源中英双语大语言模型系列覆盖大模型微调模型量化多模态本地部署RyujinxSwitch 游戏在 PC 上跑起来的完整实操手册RyujinxSwitch 游戏在 PC 上跑起来的完整实操手册 Ryujinx 是一个用 C 编写的实验性 Nintendo Switch 模拟器把 Sw硬件仿真图形学alpaca.cpp低功耗优化延长移动设备电池使用时间alpaca.cpp低功耗优化延长移动设备电池使用时间 你是否曾在使用移动设备运行本地AI模型时因电量快速耗尽而被迫中断工作alpaca.cpp作为一款能AI 应用大模型本地部署上一篇抖音无水印下载终极指南5分钟掌握douyin-downloader完整使用教程下一篇抖音批量下载终极指南3分钟搞定无水印视频小白也能轻松上手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考