我试图找到一个变量/某个度量,可以帮助我计算Linux内核中Midgard GPU驱动程序中呈现的实际帧数。
在用户级程序上测试我的算法时,我使用系统调用(如下所示)从SurfaceFlinger获取帧数并将此值存储到文件中,我稍后在用户级程序中读取该文件。
system("setsid adb shell service call SurfaceFlinger 1013 | \
grep -o -E \\([a-fA-F0-9]+\\ \\)> frames.txt");
注意:我正在尝试创建一个使用此信息的dvfs调控器,但我似乎找不到在Midgard驱动程序中访问它的方法。我只能访问GPU核心的“利用率”,但这并不总是与帧数相匹配。关于如何解决这个问题的任何想法?
对于Android,您可以监视用于组件之间缓冲交换的帧完成范围。更多信息:
但请注意,这是一类传统意义上没有“框架”的用例。
所以我一直在挖掘,我终于找到了如何从内核计算总帧数(自启动以来)。这是通过监视同步栅栏来完成的,如上面的@solidpixel所示。首先,了解缓冲消费者创建的围栏类型非常重要。对于Android,缓冲消费者是硬件编写器 - HWC。 HWC创建了许多围栏,但与渲染帧相关的围栏是“显示”围栏。因此,您可以检查正在创建的每个围栅的名称,如果它与“显示”匹配,则这是您想要计算的内容。每帧只创建一个显示围栏,因此计算显示围栏的次数将为您提供帧数。