当前位置: 首页 > news >正文

lvgl性能调优

LV_USE_PERFORMANCE

lvgl_performance 是 LVGL 提供的性能分析工具,可以帮助开发者评估和优化图形库的性能。在一些特定的版本中,lvgl_performance 是一个宏或者工具,用来分析性能瓶颈,特别是图形渲染的效率。

下面是如何使用 lvgl_performance 的步骤:

  1. 启用性能分析

确保在 lv_conf.h 配置文件中启用了性能分析。你可以查找或添加以下宏来启用性能工具:

#define LV_USE_PERFORMANCE 1

此宏将启用性能分析,允许收集渲染和对象管理的时间。

  1. 使用 lv_performance 工具

在你的代码中,可以使用 lv_performance 来输出渲染性能数据。通常,它会提供每一帧的渲染时间,以及其他相关指标。

例如:

lv_performance_t perf;
lv_performance_init(&perf);// 每一帧渲染结束后,记录当前的性能数据
lv_performance_report(&perf);// 打印性能报告
LV_LOG_USER("Frame time: %u ms", perf.frame_time);
  1. 使用宏 LV_LOG_PERFORMANCE 打印性能数据

LVGL 提供了 LV_LOG_PERFORMANCE 宏来输出实时的性能信息:

LV_LOG_PERFORMANCE(“Frame time: %u ms”, frame_time);

这将打印出每一帧的渲染时间,帮助你评估系统性能。

  1. 查看性能数据
    • 在调试时,你可以通过串口或其他方式将性能数据输出到终端或日志中。分析这些数据后,你可以发现哪些操作占用了更多的渲染时间,比如某些控件的更新、频繁的屏幕刷新等。

  2. 分析数据

通过 lv_performance 输出的数据,检查以下几个可能影响性能的因素:
• 复杂的控件:使用大量小部件(如按钮、文本框、图标等)会增加渲染负担。
• 频繁刷新:频繁地刷新整个屏幕或更新控件会影响性能,尤其是在低资源环境下。
• 高分辨率:较大的显示屏分辨率(比如 800x600 或更高)会增加每帧渲染的复杂性。
• 过多的动画效果:复杂的动画可能导致渲染时间增加,尤其是在低端硬件上。

  1. 优化建议

根据性能分析的结果,你可以考虑以下优化策略:
• 减小绘制区域:通过 lv_obj_invalidate 来只刷新屏幕上的必要部分。
• 减少控件数量:避免使用过多小的控件,尽量合并多个控件,减少渲染负担。
• 减少动画效果:使用较简单的动画,避免过多的动态效果。
• 降低分辨率:在嵌入式设备上,适当降低显示分辨率以提高性能。
• 开启双缓冲:如果屏幕支持双缓冲,启用它来避免屏幕撕裂,提高渲染平滑度。

  1. 关闭性能分析

在发布版本中,可以将性能分析功能关闭,以减少运行时的开销:

#define LV_USE_PERFORMANCE 0

关闭后,性能分析代码不会被包含在编译结果中,从而提高程序的整体效率。

总结

lvgl_performance 通过分析每帧渲染的时间,帮助你识别图形界面中的性能瓶颈。使用它时,主要关注渲染时间和其他可能导致性能下降的因素,通过调整控件数量、动画、分辨率等来优化性能。

LV_USE_PROFILER

lvgl_profiler 是 LVGL 库中的性能分析工具,可以帮助你分析图形渲染的性能瓶颈。它可以帮助你了解不同操作或组件的渲染时间,以便进一步优化。下面是如何使用 lvgl_profiler 的步骤:

  1. 启用 lvgl_profiler

首先,确保在 lvgl 的配置文件 lv_conf.h 中启用了 LV_USE_PROFILER 宏。

在 lv_conf.h 中找到如下宏,并设置为 1:

#define LV_USE_PROFILER 1

  1. 配置性能分析器

启用性能分析器后,可以配置一些选项来决定如何显示性能数据。常见的选项包括记录的函数、展示周期等。

  1. 在代码中使用 lv_profiler API

使用 lv_profiler 提供的 API 来记录性能数据。常用的 API 有:
• lv_profiler_start()
开始记录性能数据。
• lv_profiler_stop()
停止记录性能数据。
• lv_profiler_dump()
输出记录的性能数据。
• lv_profiler_clear()
清除所有性能数据。

你可以在关键的位置(比如某些函数调用前后)启动和停止性能记录,查看该部分的渲染或操作耗时。

#include "lvgl.h"
#include "lv_profiler.h"// 在需要开始分析的地方调用
lv_profiler_start();// 进行你的操作或界面更新
lv_obj_t *label = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(label, "Hello LVGL");// 停止分析并输出结果
lv_profiler_stop();
lv_profiler_dump();
  1. 通过串口或者日志查看性能数据

lv_profiler_dump() 输出的数据通常可以通过串口(或者其他日志接口)查看。确保你的开发环境配置好串口调试或日志输出。

  1. 通过可视化工具分析数据

在某些情况下,你也可以使用外部工具(如 Segger SystemView 等)来更加详细地分析性能。这样可以通过图形化的方式查看 LVGL 的性能数据和函数调用时间。

  1. 优化建议

一旦获取了性能数据,你可以根据瓶颈进行优化:
• 减少不必要的 UI 更新(例如,使用 lv_obj_invalidate 只刷新改变的部分)。
• 避免过度的嵌套容器。
• 使用低分辨率的图像资源。
• 优化动画的时间和帧率。

LV_USE_PERF_MONITOR

在 LVGL 中,LVGL MONITOR 和 LVGL PERF 都是性能监控工具,旨在帮助你分析和优化图形库的使用情况,找出可能的性能瓶颈。这里分别解释如何使用这两者。

  1. LVGL MONITOR

LVGL MONITOR 是一个用于跟踪和监控 LVGL 渲染性能、内存使用情况和其他关键参数的工具。这个工具提供了一个可视化的界面来监控性能数据。

使用方法:
• 启用监控:
在 lv_conf.h 配置文件中,你需要启用 LVGL 监控功能。通常,你可以通过以下配置项来开启监控:

#define LV_USE_PERF_MONITOR 1

这将启用性能监控模块,监控例如 CPU 占用率、内存使用情况和渲染周期等。

•	查看监控数据:

开启监控后,lvgl 会定期记录一些重要的性能指标。你可以通过 LVGL 提供的接口获取这些数据,并以合适的方式显示出来。比如,你可以将数据输出到串口或显示在屏幕上。
• 性能指标:
常见的监控指标包括:
• CPU 占用率:显示 CPU 使用的比例。
• 内存使用:跟踪系统内存的分配情况。
• 渲染帧率:跟踪每秒渲染的帧数。
• 队列长度:展示任务队列的长度,帮助你理解调度性能。

  1. LVGL PERF (性能分析)

LVGL PERF 是专门用于分析 LVGL 渲染性能的工具,主要用于查看渲染周期的时间、组件的处理时间以及优化渲染路径的瓶颈。

启用方法:

LVGL PERF 可以通过启用 LV_USE_PERF 来启动。在 lv_conf.h 文件中添加以下宏定义:

#define LV_USE_PERF 1

使用方法:
• 性能计时:
启用 LV_USE_PERF 后,LVGL 会自动在后台监控每个渲染帧的时间,并生成性能数据。你可以通过 API 获取到具体的性能数据。
• 查看渲染时间:
LVGL 会记录每一帧的渲染时间,并提供接口让你能够查询这些数据。通过这些数据,你可以找到程序中的瓶颈,优化图形的刷新效率。
你可以通过调用相关的 API 输出性能数据。例如:

lv_perf_print();

该函数会输出当前的渲染性能数据,包含了渲染帧率(FPS)、绘制的区域、每个对象的绘制时间等。

•	示例代码:

#if LV_USE_PERF
lv_perf_print();
#endif

这段代码会在启用 LV_USE_PERF 后打印性能数据。

主要指标:

LVGL PERF 监控的数据包括但不限于:
• 渲染帧时间:每一帧渲染的时间。
• 绘制区域:图形库绘制区域的大小。
• 每个对象的绘制时间。
• 帧率(FPS):显示每秒刷新多少帧。

  1. 综合优化建议
    1. 减少不必要的重绘:通过合理设置 lv_obj_invalidate 和局部刷新,只更新屏幕上发生变化的部分,减少不必要的绘制工作。
    2. 优化资源使用:减少复杂图像或控件的使用,尤其是在性能较差的硬件上。使用更简洁的图形元素和控件。
    3. 调整刷新频率:可以调整刷新频率来平衡图形库的渲染性能。例如,减少不必要的动画更新频率。
    4. 调试信息输出:通过串口或者日志输出 LVGL MONITOR 和 LVGL PERF 的数据,找出性能瓶颈并加以优化。

LVGL 硬件加速和刷新

在使用 LVGL 时,硬件加速能够显著提高渲染性能,尤其是在资源受限的嵌入式系统中。LVGL 支持多种硬件加速方法,包括通过底层硬件加速(如 GPU 或外部加速芯片)来提高图形渲染性能。使用 fbdev(FrameBuffer Device)作为显示接口时,硬件加速通常需要根据特定平台进行适配。以下是如何在使用 fbdev 时启用硬件加速的步骤。

  1. 准备硬件加速环境

首先,确保目标平台支持硬件加速。对于 fbdev,这通常意味着你需要一个支持硬件加速的 GPU,或者需要一个加速库(如 OpenGL ES 或其他硬件加速 API)。在某些嵌入式 Linux 系统上,fbdev 与 GPU 通过 DRM(Direct Rendering Manager)驱动进行交互。

必要条件:
• 硬件 GPU 支持(如 Mali, PowerVR, Adreno 等)。
• 底层驱动(如 OpenGL ES,或其他加速库)已正确安装并配置。
• 配置你的系统使其支持硬件加速的图形 API。

  1. 配置 LVGL 使用硬件加速

在 LVGL 中,你可以使用 LVGL 提供的 GPU 驱动接口来启用硬件加速。根据你平台的硬件不同,使用的加速 API 可能不同。一般来说,硬件加速的适配步骤如下:

  1. 配置显示驱动

你需要配置 LVGL 使用 fbdev 作为显示驱动,同时启用硬件加速。首先,你需要为你的硬件选择合适的显示驱动,并且确保该驱动支持硬件加速。

/* Example of using fbdev with hardware acceleration */
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);/* Set the buffer size and configuration for the framebuffer */
disp_drv.buffer = &disp_buf;
disp_drv.flush_cb = fbdev_flush; /* This callback will use hardware acceleration */
disp_drv.hor_res = 800;  /* Set the horizontal resolution */
disp_drv.ver_res = 600;  /* Set the vertical resolution *//* Initialize the display driver */
lv_disp_drv_register(&disp_drv);
  1. 实现硬件加速的 flush 函数

为了实现硬件加速,你需要实现一个 flush 函数,该函数会将 LVGL 渲染的图像通过硬件加速接口输出到屏幕。这个函数会将图像数据直接传输到帧缓冲区。

例如,如果你在使用 OpenGL ES,你的 flush 函数可能如下所示:

static void fbdev_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{/* Flush the framebuffer with the data from color_p */glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, framebuffer, 0);glTexSubImage2D(GL_TEXTURE_2D, 0, area->x1, area->y1, area->x2 - area->x1 + 1, area->y2 - area->y1 + 1, GL_RGBA, GL_UNSIGNED_BYTE, color_p);glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); /* Use OpenGL ES to render the data *//* Mark the area as flushed */lv_disp_flush_ready(disp_drv);
}
  1. 使用硬件加速时的注意事项

    1. 分辨率和缓冲区大小:确保你的硬件加速库支持目标分辨率,同时调整 lv_disp_drv_t 中的缓冲区大小。如果目标分辨率较高,可能需要更大的内存来存储图像数据。
    2. 性能优化:硬件加速可以显著提高图形渲染性能,但你仍然需要优化 LVGL 的使用方式。例如,减少无必要的屏幕刷新区域,避免全屏刷新等。
    3. 硬件加速库的适配:不同平台支持不同的硬件加速库。如果你使用的是 OpenGL ES,确保正确初始化 OpenGL 环境;如果使用的是其他硬件加速库,请参考其相应的文档进行配置。
    4. 调试工具:使用调试工具(如 GPU Profiler)监控硬件加速的表现,确认是否达到了预期的性能提升。
  2. 调试和性能分析

启用硬件加速后,你可以使用 LVGL 提供的性能监控工具(如 lvgl_profiler)来检查是否达到了理想的性能提升。通过查看渲染帧率和 GPU 的负载,可以进一步优化渲染过程。

相关文章:

lvgl性能调优

LV_USE_PERFORMANCE lvgl_performance 是 LVGL 提供的性能分析工具,可以帮助开发者评估和优化图形库的性能。在一些特定的版本中,lvgl_performance 是一个宏或者工具,用来分析性能瓶颈,特别是图形渲染的效率。 下面是如何使用 l…...

CSS实现实现票据效果 mask与切图方式

一、“切图”的局限性 传统的“切图”简单暴力,但往往缺少适应性。 适应性一般有两种,一是尺寸自适应,二是颜色可以自定义。 举个例子,有这样一个优惠券样式 关于这类样式实现技巧,之前在这篇文章中有详细介绍: CSS 实现优惠券的技巧 不过这里略微不一样的地方是,两个…...

STL--list(双向链表)

目录 一、list 对象创建 1、默认构造函数 2、初始化列表 3、迭代器 4、全0初始化 5、全值初始化 6、拷贝构造函数 二、list 赋值操作 1、赋值 2、assign(迭代器1,迭代器2) 3、assign(初始化列表) 4、assig…...

ZooKeeper 中的 ZAB 一致性协议与 Zookeeper 设计目的、使用场景、相关概念(数据模型、myid、事务 ID、版本、监听器、ACL、角色)

参考Zookeeper 介绍——设计目的、使用场景、相关概念(数据模型、myid、事务 ID、版本、监听器、ACL、角色) ZooKeeper 设计目的、特性、使用场景 ZooKeeper 的四个设计目标ZooKeeper 可以保证如下分布式一致性特性ZooKeeper 是一个典型的分布式数据一致…...

“深入浅出”系列之C++:(11)推荐一些C++的开源项目

1. SQLiteCpp - 简单易用的Sqlite C封装库 仓库地址:https://github.com/SRombauts/SQLiteCpp 简介:SQLiteCpp是一个对Sqlite数据库进行C封装的开源库,代码行数约2,500行。它提供了简洁易用的接口,使得在C项目中操作Sqlite数据库…...

《重生到现代之从零开始的C++生活》—— 类和对象2

类的默认成员函数 默认成员函数就是用户没有显示实现,编译器会自动生成的成员函数,一个类会默认生成6个成员函数 构造函数 构造函数时特殊的成员函数,构造函数的初始化对象 函数名与类名相同 没有返回值 对象实例化的时候胡自动调用构造…...

“UniApp的音频播放——点击视频进入空白+解决视频播放器切换视频时一直加载的问题”——video.js、video-js.css

今天,又解决了一个单子“UniApp的音频播放——点击视频进入空白解决视频播放器切换视频时一直加载的问题” 一、问题描述 在开发一个基于 video.js 的视频播放器时,用户通过上下滑动切换视频时,视频一直处于加载状态,无法正常播放…...

【Pandas】pandas Series transform

Pandas2.2 Series Function application, GroupBy & window 方法描述Series.apply()用于将一个函数应用到 Series 的每个元素或整个 SeriesSeries.agg()用于对 Series 数据进行聚合操作Series.aggregate()用于对 Series 数据进行聚合操作Series.transform()用于对 Series…...

【博客之星2024年度总评选】年度回望:我的博客之路与星光熠熠

【个人主页】Francek Chen 【人生格言】征途漫漫,惟有奋斗! 【热门专栏】大数据技术基础 | 数据仓库与数据挖掘 | Python机器学习 文章目录 前言一、个人成长与盘点(一)机缘与开端(二)收获与分享 二、年度创…...

飞牛 使用docker部署Watchtower 自动更新 Docker 容器

Watchtower是一款开源的Docker容器管理工具,其主要功能在于自动更新运行中的Docker容器 Watchtower 支持以下功能: 自动拉取镜像并更新容器。 配置邮件通知。 定时执行容器更新任务。 compose搭建Watchtower 1、新建文件夹 先在任意位置创建一个 w…...

【Block总结】TAdaConv时序自适应卷积,轻量高效的时间建模卷积|即插即用

论文解读:Temporally-Adaptive Models for Efficient Video Understanding 论文信息 标题:Temporally-Adaptive Models for Efficient Video Understanding 发表时间:2023年 作者:黄子渊等 论文链接:arXiv 论文 代…...

Spring Boot 项目启动报错 “找不到或无法加载主类” 解决笔记

一、问题描述 在使用 IntelliJ IDEA 开发基于 Spring Boot 框架的 Java 程序时,原本项目能够正常启动。但在后续编写代码并重建项目后,再次尝试运行却出现了 “错误:找不到或无法加载主类 com.example.springboot.SpringbootApplication” 的…...

CSS 网络安全字体

适用于 HTML 和 CSS 的最佳 Web 安全字体 下面列出了适用于 HTM L和 CSS 的最佳 Web 安全字体: Arial (sans-serif)Verdana (sans-serif)Helvetica (sans-serif)Tahoma (sans-serif)Trebuchet MS (sans-serif)Times New Roman (serif)Georgia (serif)Garamond (se…...

Linux高并发服务器开发 第十五天(fork函数)

目录 1.fork 函数 1.1创建子进程 1.2getpid 函数 1.3getppid 函数 1.4getgid函数 1.5循环创建 n 个子进程 1.6fork后父子进程异同 1.6.1读时共享,写时复制 1.6.2fork后父子进程共享 1.6.3gdb调试父子进程 1.fork 函数 pid_t fork(void); 成功:…...

【人工智能】Python中的自动化机器学习(AutoML):如何使用TPOT优化模型选择

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着机器学习在各行业的广泛应用,模型选择和优化成为了数据科学家面临的主要挑战之一。自动化机器学习&am…...

探秘自然地理:从太阳到地球的奇妙之旅与灾害预警

在浩瀚无垠的宇宙中,我们的地球与太阳紧密相连,它们的奥秘和变化,时刻影响着我们的生活。今天,就让我们一同深入探索自然地理的基础知识,揭开太阳与地球的神秘面纱,同时了解那些可能给我们带来巨大影响的自…...

go语言zero框架通过chromedp实现网页在线截图的设计与功能实现

在 GoZero 框架中实现网页在线截图的功能,可以通过集成 chromedp 库来控制 Chrome 浏览器进行截图。chromedp 是一个基于 Chrome DevTools 协议的 Go 包,可以用来在 Go 程序中模拟浏览器操作,如页面截图、DOM 操作、表单提交等。 下面是一个…...

AI发展困境:技术路径与实践约束的博弈

标题:AI发展困境:技术路径与实践约束的博弈 文章信息摘要: AI技术发展路径主要受实践约束驱动,而非纯理论优势。大型AI实验室的成功更依赖优质执行力和资源优势,而非独特技术创新。当前AI发展面临评估体系与实际应用脱…...

[前端算法]排序算法

在js中一般用到sort方法 arr.sort((a,b)>{return a-b })基础排序 冒泡排序 function bubbleSort(arr) {let len arr.length;for (let i 0; i < len; i) {for(let j0;j<len-i-1;j){if(arr[j]>arr[j1]){[arr[j],arr[j1]] [arr[j1],arr[j]]}}}console.log(arr);…...

Zemax STAR 模块的入门设置

Zemax OpticStudio 中的 STAR 模块允许直接导入来自有限元分析 &#xff08;FEA&#xff09; 软件的变形数据&#xff0c;从而将光学设计与热和结构分析联系起来。这种集成可以分析实际环境因素&#xff08;如热和机械应力&#xff09;对光学性能的影响。该模块有助于了解光学系…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...