Android Graphics 显示系统 - 监测、计算FPS的工具及设计分析

“ 在Android图像显示相关的开发、调试、测试过程中,如何能有效地评估画面的流畅度及监测、计算图层渲染显示的实时FPS呢?本篇文章将会提供一种实用、灵巧的思路。

01

设计初衷

面对开发测试中遇到的卡顿掉帧问题,如何在复现卡顿的过程中持续监控FPS 和丢帧情况?特别是视频播放的场景,掉帧与FPS不稳定会带来糟糕的用户体验。因此需要有一款小工具可以实时监测图层渲染、显示的FPS变化,以便于判断是否FPS不稳定或掉帧。

02

设计原理

参考了网上现有的 FPS 计算方式原理,一定程度上满足自己的预期需求,但要么自己设计脚本计算逻辑处理,要么就要修改到源码。

方式1. 写作FPS计算脚本

基于dumpsys SurfaceFlinger --latency Layer-name或dumpsys gfxinfo获取信息,然后设计计算逻辑。

方式2. 修改SF源码呼叫computeFps

修改SurfaceFlinger的逻辑,利用原生computeFps方法来计算指定图层的FPS.

float FrameTimeline::computeFps(const std::unordered_set<int32_t>& layerIds)

那有没有其它方式呢?

当然!

我们留意到在SurfaceFlinger的源码中有一个FpsReporter,里面有提供注册监听器的接口,看起来可以利用!

class FpsReporter : public IBinder::DeathRecipient {
public:
    FpsReporter(frametimeline::FrameTimeline& frameTimeline, SurfaceFlinger& flinger,
                std::unique_ptr<Clock> clock = std::make_unique<SteadyClock>());
    ....
    // Registers an Fps listener that listens to fps updates for the provided layer
    void addListener(const sp<gui::IFpsListener>& listener, int32_t taskId);
    // Deregisters an Fps listener
    void removeListener(const sp<gui::IFpsListener>& listener);
    ....
}

再接着看下IFpsListener的定义,顾名思义,当fps变化时就会回调到

/frameworks/native/libs/gui/aidl/android/gui/IFpsListener.aidl
oneway interface IFpsListener {

    // Reports the most recent recorded fps for the tree rooted at this layer
    void onFpsReported(float fps);
}

那用户层有无提供设置的接口呢?

先看SurfaceComposerClient中的定义,确实也存在add/remove方法

/frameworks/native/libs/gui/include/gui/SurfaceComposerClient.h
static status_t addFpsListener(int32_t taskId, const sp<gui::IFpsListener>& listener);
static status_t removeFpsListener(const sp<gui::IFpsListener>& listener);

那设计

`systrace`是Android提供的一个性能分析工具,它可以记录系统中不同组件的行为,包括CPU调度、线程运行情况、磁盘、网络活动等。通过`systrace`可以帮助开发者发现系统运行时的问题,并且进行优化。监测Android设备的帧率(FPS)是`systrace`的一个应用之一。 使用`systrace`来监测Android设备的FPS,可以按照以下步骤进行: 1. 确保你的设备已经开启了开发者选项,并且启用了USB调试。 2. 连接你的Android设备到计算机。 3. 打开终端,运行以下命令开始追踪(你可以使用`-k`参数来追踪内核信息,以及`-a`参数来追踪特定应用程序的进程): ``` python systrace.py --time=10 -o /path/to/output_file.html -a com.example.app ``` 这里`/path/to/output_file.html`是你希望保存`systrace`结果的文件路径,`com.example.app`是你想要追踪的应用包名。`--time=10`表示追踪10秒,你可以根据需要调整这个时间。 4. 在追踪期间,尽可能地与你的应用进行交互,以便捕捉到更多与UI渲染相关的事件。 5. 当追踪完成后,你可以通过浏览器打开生成的HTML文件,`systrace`的分析结果将以图形界面的形式展现。 为了特别监测FPS,你可能需要在命令中加入特定的category,比如`-c graphics`,这样可以追踪与图形相关的事件。以下是一个例子: ``` python systrace.py -t 10 -o /path/to/output_file.html -c graphics ``` 通过分析图形相关的事件,你可以看到每帧渲染所花费的时间,并通过它们来估算FPS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值