Openharmony5.0性能分析之开机动效播放卡顿
一、关键字: 开机动效;重启手机;卡顿; 丢帧 二、问题描述 设备型号:黄鹂 系统版本:OpenHarmony 5.0 代码版本:OpenHarmony-5.0 问题现象:重启手机,播放开机动效时,出现连续两次1.2s卡顿。 三、原因分析 3.1 正常机制 重
·
一、关键字:
开机动效;重启手机;卡顿; 丢帧
二、问题描述
设备型号:黄鹂
系统版本:OpenHarmony 5.0
代码版本:OpenHarmony-5.0
问题现象:重启手机,播放开机动效时,出现连续两次1.2s卡顿。
三、原因分析
3.1 正常机制
重启手机,播放开机动效时,Openharmony开机动效播放流畅,不卡顿。
3.2 异常机制
重启手机,播放开机动效时,出现连续两次1.2s卡顿。
3.2.1分析trace, 发现RS主线程请求两次MemMgr服务接口每次卡顿1.2s。
3.2.1分析代码:确认播放开机动效为啥要请求MemMgr服务接口。
RS初始化时,启动开机播放开机动效同时也向MemMgr内存管理服务注册应用状态SubscribeAppState回调,应用状态变化时,好回收应用相关内存资源。
void RSMainThread::Init()
{
mainLoop_ = [&]() {
RS_PROFILER_ON_FRAME_BEGIN();
if (isUniRender_ && !renderThreadParams_) {
// fill the params, and sync to render thread later
renderThreadParams_ = std::make_unique<RSRenderThreadParams>();
}
RenderFrameStart(timestamp_);
...
ProcessCommand();
Animate(timestamp_); // 开机动效启动
}
...
SubscribeAppState(); // 订阅内存管理回收回调
...
}
RS向MemMgr内存管理服务注册回调,失败回尝试10次,由于系统已经启动好,开机动效提前停止,所以出现了两次卡顿。
3.2.3 分析log流程:
开机动效启动
01-01 08:02:55.337 734 734 I C01400/BootAnimation: main enter
01-01 08:02:55.337 734 734 I C01400/BootAnimation: BootAnimationController START
RS向MemMgr内存管理服务注册回调失败,阻塞1.2s
01-01 08:02:56.532 735 735 I C01799/MemMgr: MemMgrClient::SubscribeAppState called
01-01 08:02:56.532 735 735 I C01799/MemMgr: MemMgrClient::GetMemMgrService called
01-01 08:02:57.738 735 735 E C01799/MemMgr: MemMgrClient::GetMemMgrService get service failed
01-01 08:02:57.738 735 735 E C01799/MemMgr: MemMgrClient::SubscribeAppState MemMgrService is null
四、方案优化
黄鹂不支持memmgr_hyperhold_memor特性,通过编译屏蔽,正常拉起MemMgrService,可以优化1.2s
合入链接:https://gitee.com/openharmony-sig/vendor_hardmony/pulls/157
通过验证,重启手机,开机动效播放流畅,无卡顿现象。
更多推荐
已为社区贡献15条内容
所有评论(0)