首页 > 解决方案 > 在 Linux 内核中获取帧计数

问题描述

我试图找到一个变量/一些指标,可以帮助我计算在 Linux 内核的 Midgard GPU 驱动程序中呈现的实际帧数。

在用户级程序上测试我的算法时,我使用了一个系统调用(如下所示),它从 SurfaceFlinger 获取帧计数并将该值存储到一个文件中,稍后我在用户级程序中读取该文件。

system("setsid adb shell service call SurfaceFlinger 1013 | \
   grep -o -E \\([a-fA-F0-9]+\\ \\)> frames.txt");

注意:我正在尝试创建一个使用此信息的 dvfs 调节器,但我似乎无法在 Midgard 驱动程序中找到访问它的方法。我只能访问 GPU 内核的“利用率”,但这并不总是与帧数匹配。关于如何解决这个问题的任何想法?

标签: linux-kernelgpudriverframe-ratemali

解决方案


对于 Android,您可以监控用于组件之间缓冲区交换的帧完成围栏。更多信息在这里:

但是请注意,这是一类没有传统意义上的“框架”的用例。

  • 渲染到 VR 和 AR 护目镜使用前缓冲区渲染,其中没有缓冲区交换,因此没有完成围栏。
  • OpenCL 或 GPU 计算用例往往会渲染回任意内存,而不是可显示的帧,因此同样地,您也可能不会在那里获得帧。

推荐阅读