你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

经验分享 | LAT1478 TouchGFX FPS的计算方法

[复制链接]
攻城狮Melo 发布时间:2026-3-19 16:41

TouchGFX FPS 的计算方法

关键字:TouchGFX, FPS 详细文档:点击下载>

1. FPS

帧率 (Frames Per Second, 简称 FPS) 是指视频或动画中每秒钟显示的帧数,是画面显示流畅性的关键指标。TouchGFX Desinger 中提供了 FPS 计算公式,在 Demos 类别下,几个显示界面带有 FPS 的 Demo 其代码中都带有 FPS 计算公式。 大致是在每个界面的 handleTickEvent 函数中通过如下公式来计算 FPS 值的。

c

运行

void Screen1View::handleTickEvent()
{
// -- FPS -- //
// FPS calculation when framerate compensation is ON
if (HAL::getInstance()->getLCDRefreshCount() > 1)
{
frameSkippedCounter++;
}
else
{
frames++;
}
if (frames + frameSkippedCounter >= 60)
{
if (fps != frames)
{
fps = frames;
Unicode::snprintf(textArea1Buffer, TEXTAREA1_SIZE, "%d", fps);
textArea1.invalidate();
}
frameSkippedCounter = 0;
frames = 0;
// -- FPS -- //
}

2. FPS 计算公式的局限性

如果使用上述公式来计算 FPS, 其实是需要满足一定前提条件的。一个是图像的刷新率是 60Hz, 另一个是是否开启帧补偿。

2.1. 刷新率是不是 60Hz

上述公式是在刷新率是 60Hz 的情况下计算的,如果 TouchGFX 界面的刷新率不是 60Hz, 那么上述公式计算出来的结果就不准确。

因为 FPS 是指在 1 秒钟时间里传输的图像的帧数量,那么每个 Tick 的周期要保证是 16.667ms, 这样才能使用 if (frames + frameSkippedCounter>= 60) 的判断条件。 TouchGFX 提供的 LTDC 接口的 TBS (TouchGFX Board Setup) 每个 Tick 是 16.667ms, 所以都使用这个公式,如果是自己重新创建的工程,那么就需要注意这点。如果一个 Tick 周期是 33.3ms,1s 是 30 个 tick 周期,那么就需要修改判断条件为 if (frames + frameSkippedCounter >= 30)。

2.2. 帧补偿关闭的情况

其次,上述公式只有在 TouchGFX 丢帧补偿使能的情况下才有效。如果 TouchGFX 丢帧补偿处于关闭状态,那么可以用以下公式来计算 FPS。

c

运行

void Screen1View::handleTickEvent() 
{
// FPS calculation when framerate compensation is OFF 
static uint32_t lastSecondTick = 0; 
const uint32_t currentTick = HAL_GetTick(); 
frames++; 
if (currentTick >= lastSecondTick + 1000) 
{
if (fps != frames) 
{
fps = frames; 
Unicode::snprintf(textArea1Buffer, TEXTAREA1_SIZE, "%d", fps); 
textArea1.invalidate();
}
lastSecondTick = currentTick;
frames = 0;
}
}

3. 推荐的 FPS 计算公式

考虑到有时无法准确获得刷新率,以及不知道帧补偿是开启还是关闭,那么推荐的方式是通过逻辑分析仪来测量 1s 之内的渲染次数。例如测量 1s 内的 RENDER_TIME_GPIO 翻转的次数,这样是最准确的。

通过在 STM32CubeMX 中定义一个 RENDER_TIME_GPIO, 然后 TouchGFX 引擎会自动调用 TouchGFXGPIO.cpp 中的以下代码来进行翻转。

c

运行

/*
* Sets a pin high.
*/
void GPIO::set(GPIO_ID id)
{
switch (id)
{
case GPIO::VSYNC_FREQ:
#if defined(VSYNC_FREQ_GPIO_Port) && defined(VSYNC_FREQ_Pin)
HAL_GPIO_WritePin(VSYNC_FREQ_GPIO_Port, VSYNC_FREQ_Pin, M_GPIO_PIN_SET(id));
#endif
break;
case GPIO::RENDER_TIME:
#if defined(RENDER_TIME_GPIO_Port) && defined(RENDER_TIME_Pin)
HAL_GPIO_WritePin(RENDER_TIME_GPIO_Port, RENDER_TIME_Pin,
M_GPIO_PIN_SET(id));
#endif
break;
case GPIO::FRAME_RATE:
#if defined(FRAME_RATE_GPIO_Port) && defined(FRAME_RATE_Pin)
HAL_GPIO_WritePin(FRAME_RATE_GPIO_Port, FRAME_RATE_Pin, M_GPIO_PIN_SET(id));
#endif
break;
case GPIO::MCU_ACTIVE:
#if defined(MCU_ACTIVE_GPIO_Port) && defined(MCU_ACTIVE_Pin)
HAL_GPIO_WritePin(MCU_ACTIVE_GPIO_Port, MCU_ACTIVE_Pin, M_GPIO_PIN_SET(id));
#endif
break;
}
}

4. 小结

本文档介绍了不同情况下如何准确测量 TouchGFX 应用的帧率 FPS 的方法,供参考使用。

收藏 评论0 发布时间:2026-3-19 16:41

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版