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 的负载,可以进一步优化渲染过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956911.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TongESB7.1.0.0如何使用dockercompose运行镜像(by lqw)

文章目录 安装准备安装 安装准备 1.安装好docker和dockercompose: docker、docker-compose安装教程,很详细 2.上传好安装相关文件 安装 使用以下命令导入管理端镜像和运行时镜像 docker load -i tongesb_manage_7100.tar docker load -i tongesb_se…

Python 模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

微软Win10 RP 19045.5435(KB5050081)预览版发布!

系统之家1月20日最新报道,微软面向Release Preview频道的Windows Insider项目成员,发布了适用于Windows10 22H2版本的KB5050081更新,更新后系统版本号将升至19045.5435。本次更新增加了对GB18030-2022标准的支持,同时新版日历将为…

【VRChat · 改模】Unity工程导入人物模型;并添加着色器教程;

一、Unity工程导入人物模型 1.创建一个新的工程文件(使用 VRChat 官方的开发工具 VCC) 不添加着色器的时候,模型是粉色的 2.导入人物模型 在工程文件的 Assets 目录下,创建一个新的目录,可以起名为你的模型的名字 …

Django简介与虚拟环境安装Django

目录 1.Django简介 1.1 Django 的核心特点 1.2 Django 的核心组件 1.3 Django 的应用场景 1.4 总结 2.基础环境建立 2.1 创建虚拟环境 2.1.1 使用 virtualenv 创建虚拟环境 2.1.2 使用 venv 创建虚拟环境 2.2 激活虚拟环境 2.2.1 在 Windows 上 2.2.2 在 macOS 或 …

使用 ChatGPT 生成和改进你的论文

文章目录 零、前言一、操作引导二、 生成段落或文章片段三、重写段落四、扩展内容五、生成大纲内容六、提高清晰度和精准度七、解决特定的写作挑战八、感受 零、前言 我是虚竹哥,目标是带十万人玩转ChatGPT。 ChatGPT 是一个非常有用的工具,可以帮助你…

宝塔面板修改端口号后无法访问?

解决办法: 1、查询端口是否修改 cat www/server/panel/data/port.pl 显示 当前的端口例如:12123 2.查询防火墙的开放的端口 命令:firewall-cmd --list-ports 3. 使用firewall-cmd --query-port12123/tcp 如显示yes 表示开通,…

Open3D 最小二乘拟合平面(直接求解法)【2025最新版】

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 博客长期更新,本文最近更新时间为:2025年1月18日。 一、算法原理 平面方程的一般表达式为:

docker的数据卷与dockerfile自定义镜像

docker的数据卷与dockerfile自定义镜像 一. docker的数据卷数据卷容器 二. dockerfile自定义镜像2.1 dockerfile的命令格式镜像的操作命令add和copy的区别 容器启动的命令 2.2 run命令2.3 其它端口映射 三. 练习 一. docker的数据卷 容器于宿主机之间,或者容器和容…

项目练习:若依后台管理系统-后端服务开发步骤(springboot单节点版本)

文章目录 1、用Maven搭建项目脚手架&#xff0c;父子工程依赖。2、引入SpringBoot Web容器依赖3、引入Mybatisdruid依赖4、实现接口查询数据5、整合logback日志功能 1、用Maven搭建项目脚手架&#xff0c;父子工程依赖。 root模块的pom添加plugin配置 <build><plugins…

前端开发Web

Ajax 概念:Asynchronous JavaScriptAnd XML&#xff0c;异步的JavaScript和XML 作用: 数据交换:通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 异步交互:可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的…

debian中apt的配置与解析

引言 在系统使用过程中&#xff0c;我们可能会遭遇 apt update 操作出现问题&#xff0c;或者 apt upgrade 速度迟缓的情况。这往往是由于所使用软件源本身存在诸如服务器性能不佳、维护不及时等质量问题&#xff0c;同时&#xff0c;软件源服务器与我们所处地理位置的距离较远…

Docker 实现MySQL 主从复制

一、拉取镜像 docker pull mysql:5.7相关命令&#xff1a; 查看镜像&#xff1a;docker images 二、启动镜像 启动mysql01、02容器&#xff1a; docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql -e MYS…

day03_开发前准备和匹配类标签

文章目录 day03_开发前准备和匹配类标签一、标签体系(了解)二、数据导入(操作)1、背景介绍(重要)2、创建Hive表2.1 dwm_sold_goods_sold_dtl_i2.2 dwm_sell_o2o_order_i**2.3 dwd_mem_member_union_i**2.4 dwm_mem_member_behavior_day_i**2.5 dwm_mem_first_buy_i**3、数…

Video-RAG:一种将视频RAG新框架

1. 摘要及主要贡献点 摘要&#xff1a; 检索增强生成&#xff08;RAG&#xff09;是一种强大的策略&#xff0c;通过检索与查询相关的外部知识并将其整合到生成过程中&#xff0c;以解决基础模型生成事实性错误输出的问题。然而&#xff0c;现有的RAG方法主要集中于文本信息&…

VSCode的配置与使用(C/C++)

从0开始教你在vscode调试一个C文件 一.首先是配置你的编译环境&#xff0c;添加到环境变量&#xff08;默认你是全新的电脑&#xff0c;没有安装vs2019之类的&#xff09; 原因&#xff1a;因为相比于vs2019&#xff0c;vscode只是个代码编辑器&#xff0c;相当于一个彩色的、…

MongoDB基本操作

一、实验目的 1. 熟悉MongoDB的基本操作&#xff0c;包括CRUD&#xff08;增加、读取、更新、删除&#xff09;。 2. 理解MongoDB的文档型数据库特性和Shell的使用。 3. 培养学生通过命令行操作数据库的能力。 4. 强化数据库操作的实际应用能力。 二、实验环境准备 1.…

python如何导出数据到excel文件

python导出数据到excel文件的方法&#xff1a; 1、调用Workbook()对象中的add_sheet()方法 wb xlwt.Workbook() ws wb.add_sheet(A Test Sheet) 2、通过add_sheet()方法中的write()函数将数据写入到excel中&#xff0c;然后使用save()函数保存excel文件 ws.write(0, 0, 1234…

STL--list(双向链表)

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

eBPF 概述 | 学习

注&#xff1a;本文为 “ eBPF” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 【译】eBPF 概述&#xff1a;第 1 部分&#xff1a;介绍 2022-04-26257 1. 前言 深入研究 eBPF 的底层细节&#xff0c;从其虚拟机机制和工具&#xff0c;到在远程资源受限…