一、关键字:

开机动效;重启手机;卡顿; 丢帧

二、问题描述

设备型号:黄鹂

系统版本:OpenHarmony 5.0

代码版本:OpenHarmony-5.0

问题现象:重启手机,播放开机动效时,出现连续两次1.2s卡顿。

三、原因分析

3.1 正常机制

重启手机,播放开机动效时,Openharmony开机动效播放流畅,不卡顿。

3.2 异常机制

重启手机,播放开机动效时,出现连续两次1.2s卡顿。

3.2.1分析trace, 发现RS主线程请求两次MemMgr服务接口每次卡顿1.2s。

img

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次,由于系统已经启动好,开机动效提前停止,所以出现了两次卡顿。

img

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

img

通过验证,重启手机,开机动效播放流畅,无卡顿现象。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐