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

STM32 HAL库0.96寸OLED显示液晶屏

本文介绍了使用STM32 HAL库通过I2C协议驱动0.96寸OLED显示屏的方法。首先概述了OLED的基本特性和应用,然后详细讲解了汉字点阵生成的方法,并提供了完整的代码示例,包括初始化、清屏、字符串显示和自定义汉字显示函数。这些代码实现了在STM32F103ZET6开发板上显示特定内容的功能,如英文句子和中文字符“慢慢变好”。

目录

二、0.96 寸 OLED

三、生成汉字点阵

三、代码示例

1.初始化

2清屏函数

3.字符串显示函数

4.自定义汉字字模显示函数

5.完整示例代码,附件是源码

五、运行结果

六、总结


零、屏幕显示的本质

屏幕显示的核心其实非常简单,归根结底就是“点灯”。每一个分辨率单位对应一个像素点,也就是一盏可以单独控制的灯,屏幕放大后就是一个一个的小方块"灯"。

在屏幕上显示内容时,实际上就是在指定坐标(x, y)上点亮或熄灭相应的像素点。

屏幕显示=坐标(x,y)+内容

对于分辨率为128x64的显示屏来说,意味着它有64行、每行128个像素点,总共包含8192个独立可控制的灯(即像素)。要控制这个128x64的显示屏,本质上就是要对这8192个像素进行精确的点亮和熄灭操作。

在实际应用中,我们并不会一个个地去控制这些像素点,因为这样的效率太低了。我们会按照字节(8位)来操作显存,每个字节控制8个连续的像素点。

一、开发环境

硬件:正点原子精英 V2 STM32F103开发板

单片机:STM32F103ZET6

Keil版本:5.32

STM32CubeMX版本:6.9.2

STM32Cube MCU Packges版本:STM32F1xx_DFP.2.4.1
串口:USART1(PA9,PA10)

I2C2:PB10(SCL),PB11(SDA)

屏幕:0.96 寸 OLED 显示液晶屏模128 * 64 SSD1306,屏幕的SCL、SDA接到STM32的PB10(SCL),PB11(SDA)

二、0.96 寸 OLED

0.96 寸 OLED 显示液晶屏模块是一种体积小巧但功能强大的显示设备,在众多小型电子项目中广泛应用。它具有 128 * 64 的分辨率,采用 SSD1306 驱动芯片,支持 SPI 和 I2C 两种通信接口.

三、生成汉字点阵

显示汉字需要自行生成字库调用,运行“PCtoLCD2002”软件,点击菜单“选项”进行设置,如下图所示

比如显示"慢慢变好".输入"慢慢变好".点击生产字模,把字模复制到chinese_font.c

四、代码示例

底层驱动已经实现好,只是调用函数.

1.初始化
************** 7. 初始化函数 **************/
/**  函数名:OLED_Init*  功能描述:初始化OLED*  输入参数:无*  输出参数:无*  返回值:无*/
void OLED_Init(void)
{   /** 前提: 已经初始化的I2C通道* 本工程里已经: *    使用MX_I2C1_Init初始化I2C通道*    使用HAL_I2C_MspInit初始化I2C引脚*/OLED_SetMemAddrMode(PAGE_ADDR_MODE);    // 0. 设置地址模式OLED_SetMuxRatio(0x3F);                 // 1. 设置多路复用率OLED_SetDispOffset(0x00);               // 2. 设置显示的偏移值OLED_SetDispStartLine(0x00);            // 3. 设置起始行OLED_SEG_REMAP();                       // 4. 行翻转OLED_SCAN_REMAP();                      // 5. 正常扫描OLED_SetComConfig(COM_PIN_SEQ, COM_NOREMAP);          // 6. COM 引脚设置OLED_SetContrastValue(0x7F);            // 7. 设置对比度ENTIRE_DISP_OFF();                      // 8. 全屏点亮/熄灭DISP_NORMAL();                          // 9. 显示模式OLED_SetDCLK_Freq(0x00, 0x08);          // 10. 设置分频系数和频率增值OLED_SetChargePump(PUMP_ENABLE);        // 11. 使能电荷碰撞OLED_SetComConfig(COM_PIN_ALT, COM_NOREMAP);DISP_ON();
}
2.清屏函数

清屏函数的核心思路是通过循环遍历屏幕的每一页,将每一页的所有像素点都置为 0,从而实现清屏的效果。buf 数组用于存储要写入屏幕的数据,所有元素初始化为 0。OLED_SetPosition 函数用于设置当前操作的页和列位置。OLED_WriteNBytes 函数用于将指定数量的数据写入屏幕。

通过这种方式,可以确保整个屏幕的显示内容被清空,显示为全黑。

/**  函数名:OLED_Clear*  功能描述:清屏函数,用于将0.96寸OLED显示液晶屏的显示内容清空,使屏幕显示为全黑。*  输入参数:无*  输出参数:无*  返回值:无*  实现原理:*      该OLED屏幕采用页寻址模式,整个屏幕被划分为8页,每页有128列。*      清屏的过程就是将每一页的128个像素点都置为0(即不发光)。*      首先创建一个长度为128的缓冲区,所有元素初始化为0,代表一列的像素数据都为0。*      然后通过循环遍历每一页,设置当前操作的页和列位置,将缓冲区的数据写入该页,从而清空该页的显示内容。
*/
void OLED_Clear(void)
{// 定义一个循环变量i,用于遍历屏幕的每一页uint8_t i = 0;// 定义一个长度为128的缓冲区buf,用于存储要写入屏幕的数据// 所有元素初始化为0,代表一列的像素数据都为0,即不发光uint8_t buf[128] = {0};// 循环遍历屏幕的8页for(i = 0; i < 8; i++){// 调用OLED_SetPosition函数,设置当前操作的页和列位置// i表示当前页号(0 - 7),0表示列号从第0列开始OLED_SetPosition(i, 0);// 调用OLED_WriteNBytes函数,将缓冲区buf中的128个字节数据写入当前页// 由于buf中的数据都为0,所以写入后该页的所有像素点都不发光,实现了清屏效果OLED_WriteNBytes(&buf[0], 128);}
}
3.字符串显示函数

此函数的主要逻辑是遍历传入的字符串,使用 OLED_PutChar 函数逐个显示字符。每显示一个字符,x 坐标右移一位。当 x 坐标超出范围(大于 15)时,x 坐标重置为 0,y 坐标下移 2 页。最后返回成功显示的字符数量.

/**  函数名:OLED_PrintString*  功能描述:在0.96寸OLED显示液晶屏上显示一个字符串。该函数会将传入的字符串按字符逐个显示在指定的起始坐标位置。*  输入参数:*            x --> x坐标(0~15),表示字符串起始显示位置的列坐标,取值范围为0到15,每一个单位对应屏幕上一定的列位置。*            y --> y坐标(0~7),表示字符串起始显示位置的页坐标,取值范围为0到7,每一页对应屏幕垂直方向上的一部分区域。*            str --> 显示的字符串,是一个以'\0'结尾的字符数组。*  输出参数:无*  返回值:打印了多少个字符,即成功显示在屏幕上的字符数量。*/
int OLED_PrintString(uint8_t x, uint8_t y, const char *str)
{   // 定义一个整型变量i,用于记录当前处理的字符在字符串中的索引位置,同时也用于统计打印的字符数量int i = 0;// 进入循环,只要字符串还未结束(即当前字符不为字符串结束符'\0'),就继续处理while (str[i]){// 调用OLED_PutChar函数,将当前字符显示在指定的x、y坐标位置OLED_PutChar(x, y, str[i]);// 显示完一个字符后,将x坐标加1,以便在下一列显示下一个字符x++;// 判断x坐标是否超出了最大允许值(即是否超过了15)if(x > 15){// 如果x坐标超出范围,将x坐标重置为0,以便从下一行的起始位置开始显示x  = 0;// 同时将y坐标增加2,因为通常每显示一行字符后,需要移动到下一页继续显示y += 2;}// 索引位置i加1,指向下一个字符i++;}// 循环结束后,返回打印的字符数量return i;
}
4.自定义汉字字模显示函数

此函数 OLED_PrintChinese1 用于在 OLED 屏幕指定位置显示预定义的中文字符。它通过外部数组 g_chinese_fonts1 存储中文字符的字模数据,按顺序将每个中文字符的上半部分和下半部分数据依次写入 OLED 屏幕,并更新列位置以显示下一个字符。在写入前会检查输入坐标是否有效,无效则不进行显示操作

/*** @brief 在OLED屏幕上显示预定义的中文字符。* * 该函数用于在OLED屏幕的指定位置显示一系列预定义的中文字符。中文字符的字模数据存储在外部数组g_chinese_fonts1中。* * @param x 中文字符起始显示位置的列索引(范围0 - 15),每个单位对应8列。* @param y 中文字符起始显示位置的页索引(范围0 - 7),表示垂直位置。* * @return 无*/
void OLED_PrintChinese1(uint8_t x, uint8_t y)
{   // 声明外部数组g_chinese_fonts1,该数组存储了中文字符的字模数据。// 数组的每个元素代表一个中文字符,每个中文字符由32字节的数据组成(上半部分16字节,下半部分16字节)。extern uint8_t g_chinese_fonts1[4][32];// 保存起始页位置,用于后续操作。uint8_t page = y;// 计算起始列位置,由于每个中文字符宽度为16列,而x是按8列单位计数的,所以乘以8。uint8_t col  = x * 8;// 检查输入的坐标是否超出OLED屏幕的有效范围。// 如果y超过7(页索引范围为0 - 7)或者x超过15(列索引范围为0 - 15),则直接返回,不进行显示操作。if (y > 7 || x > 15)return;// 循环变量,用于遍历中文字符数组。int i;// 遍历g_chinese_fonts1数组中的每个中文字符。// sizeof(g_chinese_fonts1)返回整个数组的字节数,sizeof(g_chinese_fonts1[0])返回一个中文字符数据的字节数,// 两者相除得到数组中中文字符的数量。for (i = 0; i < sizeof(g_chinese_fonts1) / sizeof(g_chinese_fonts1[0]); i++){// 设置OLED屏幕的当前显示位置为当前页和当前列。// 这是为了准备写入当前中文字符的上半部分数据。OLED_SetPosition(page, col);// 向OLED屏幕发送当前中文字符的上半部分数据(前16字节)。// &g_chinese_fonts1[i][0]是当前中文字符上半部分数据的起始地址,16表示要发送的字节数。OLED_WriteNBytes((uint8_t*)&g_chinese_fonts1[i][0], 16);// 设置OLED屏幕的当前显示位置为下一页(page + 1)和当前列。// 这是为了准备写入当前中文字符的下半部分数据。OLED_SetPosition(page + 1, col);// 向OLED屏幕发送当前中文字符的下半部分数据(后16字节)。// &g_chinese_fonts1[i][16]是当前中文字符下半部分数据的起始地址,16表示要发送的字节数。OLED_WriteNBytes((uint8_t*)&g_chinese_fonts1[i][16], 16);// 更新列位置,为显示下一个中文字符做准备。// 每个中文字符宽度为16列,所以将列位置增加16。col += 16;}
}
5.完整示例代码,附件是源码
/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
#include "driver_oled.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern UART_HandleTypeDef huart1;
extern I2C_HandleTypeDef hi2c2;
/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
//char *str= "I2C FUNCTIONS\r\n";
//char c;/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_I2C2_Init();/* USER CODE BEGIN 2 */OLED_Init();OLED_Clear();OLED_PrintString(0, 0, "I love Aissa");OLED_PrintChinese1(3, 3);OLED_PrintChinese2(3, 6);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

五、运行结果

屏幕显示如下内容

六、总结

本文介绍了使用STM32 HAL库通过I2C协议驱动0.96寸OLED显示屏的方法,仅供参考,有任何问题,欢迎在评论区留言讨论!

相关文章:

STM32 HAL库0.96寸OLED显示液晶屏

本文介绍了使用STM32 HAL库通过I2C协议驱动0.96寸OLED显示屏的方法。首先概述了OLED的基本特性和应用&#xff0c;然后详细讲解了汉字点阵生成的方法&#xff0c;并提供了完整的代码示例&#xff0c;包括初始化、清屏、字符串显示和自定义汉字显示函数。这些代码实现了在STM32F…...

动态表头导出EasyExcel

在 Spring Boot 中结合 EasyExcel 实现动态表头导出&#xff08;无实体类&#xff0c;表头和字段&#xff08;前端传表名&#xff0c;字段值动态查询&#xff0c;返回List<Map<String,Object>>&#xff09;由前端传递&#xff09;可以通过以下步骤实现。以下是完整…...

【前端】react+ts 轮播图的实现

一、场景描述 在很多网站的页面中都有轮播图&#xff0c;所以我想利用react.js和ts实现一个轮播图。自动轮播图已经在前面实现过了&#xff0c;如&#xff1a;https://blog.csdn.net/weixin_43872912/article/details/145622444?sharetypeblogdetail&sharerId145622444&a…...

清华大学出品DeepSeek 四部教程全收录(附下载包),清华deepseek文档下载地址

文章目录 前言一、清华大学deepseek教程&#xff08;四部&#xff09;二、清华大学deepseek教程全集1.清华大学第一版《DeepSeek&#xff1a;从入门到精通》2.清华大学第二版《DeepSeek赋能职场》3.清华大学第三版《普通人如何抓住DeepSeek红利》4.清华大学第四版&#xff1a;D…...

Android 布局系列(三):RelativeLayout 使用指南

引言 在 Android 开发中&#xff0c;布局管理是构建用户界面的核心。RelativeLayout 曾经是 Android 中非常流行的一种布局方式&#xff0c;广泛应用于各种项目中。它通过相对位置关系组织视图元素&#xff0c;使得我们可以根据父容器或者其他视图的位置来灵活调整子视图的布局…...

ubuntu20.04音频aplay调试

1、使用指定声卡&#xff0c;aplay 播放命令 aplay -D plughw:1,0 test2.wav2、 录音 arecord -Dhw:1,0 -d 10 -f cd -r 44100 -c 2 -t wav test.wav3、各个参数含义 -D 指定声卡编号 plughw:0,0 //0,0代表card0,device0&#xff0c;可以通过arecord -l获取 -f 录音格式 S16_LE…...

前缀和代码解析

前缀和是指数组一定范围的数的总和,常见的有两种,一维和二维,我会用两道题来分别解析 一维 DP34 【模板】前缀和 题目: 题目解析: 暴力解法 直接遍历数组,遍历到下标为 l 时,开始进行相加,直到遍历到下标为 r ,最后返回总和.这样做的时间复杂度为: O(n) public class Main …...

Windows 环境下安装 Anaconda 并配置

安装Anaconda 1. 下载安装包 官网下载&#xff1a;https://www.anaconda.com/download/success 也可以从国内镜像仓库下载&#xff1a; 中国科学技术大学 https://mirrors.ustc.edu.cn/ 清华大学开源软件镜像站 https://mirrors.tuna.tsinghua.edu.cn/ 2. 安装过程 双…...

大模型在尿潴留风险预测及围手术期方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 研究方法与数据来源 二、大模型预测尿潴留的原理与方法 2.1 相关大模型介绍 2.2 模型构建与训练 2.3 模型评估指标与验证 三、术前尿潴留风险预测及方案制定 3.1 术前风险因素分析 3.2 大模型预测结果分析 3.3 …...

JavaScript 简单类型与复杂类型

在JavaScript中&#xff0c;根据数据存储的方式不同&#xff0c;变量可以分为两大类&#xff1a;简单类型&#xff08;也称为基本数据类型或原始类型&#xff09;和复杂类型&#xff08;也称为引用数据类型&#xff09;。理解这两者的区别对于编写高效且无误的代码至关重要。本…...

AI绘画软件Stable Diffusion详解教程(1):Windows系统本地化部署操作方法(专业版)

一、事前准备 1、一台配置不错的电脑&#xff0c;英伟达显卡&#xff0c;20系列起步&#xff0c;建议显存6G起步&#xff0c;安装win10或以上版本&#xff0c;我的显卡是40系列&#xff0c;16G显存&#xff0c;所以跑大部分的模型都比较快&#xff1b; 2、科学上网&#xff0…...

大白话Vue 双向数据绑定的实现原理与数据劫持技术

咱们来好好唠唠Vue双向数据绑定的实现原理和数据劫持技术&#xff0c;我会用特别通俗的例子给你讲明白。 啥是双向数据绑定 你可以把双向数据绑定想象成一个神奇的“同步器”。在网页里有两部分&#xff0c;一部分是数据&#xff0c;就像你记在小本本上的信息&#xff1b;另一…...

VUE 获取视频时长,无需修改数据库,前提当前查看视频可以得到时长

第一字段处 <el-table-column label"视频时长" align"center"> <template slot-scope"scope"> <span>{{ formatDuration(scope.row.duration) }}</span> </template> </el-ta…...

antv G6绘制流程图

效果图&#xff08;优点&#xff1a;可以自定义每一条折线的颜色&#xff0c;可以自定义节点的颜色&#xff0c;以及折线的计算样式等&#xff09;&#xff1a; 代码&#xff1a; <!-- 流程图组件 --> <template><div id"container"></div>…...

完美隐藏滚动条方案 (2024 最新验证)

完美隐藏滚动条方案 (2024 最新验证) css /* 全局隐藏竖直滚动条但保留滚动功能 */ html {overflow: -moz-scrollbars-none; /* Firefox 旧版 */scrollbar-width: none; /* Firefox 64 */-ms-overflow-style: none; /* IE/Edge */overflow-y: overlay; …...

单片机的串口(USART)

Tx - 数据的发送引脚&#xff0c;Rx - 数据的接受引脚。 串口的数据帧格式 空闲状态高电平&#xff0c;起始位低电平&#xff0c;数据位有8位校验位&#xff0c;9位校验位&#xff0c;停止位是高电平保持一位或者半位&#xff0c;又或者两位的状态。 8位无校验位传输一个字节…...

实现分布式限流开源项目

以下是10个可以实现分布式限流中间件的开源项目推荐&#xff0c;这些项目基于不同的技术栈&#xff0c;适用于多种应用场景&#xff1a; 1. **Alibaba Sentinel** Sentinel 是阿里巴巴开源的分布式限流中间件&#xff0c;支持多种限流策略&#xff08;如QPS、并发线程数等…...

递归构建行政区域树(二)

概述 这篇博客中构建出的行政区域树利用element-ui的Tree组件展示出来。 实现 源码位于码云&#xff0c;欢迎点击哦。 项目结构 最后 好久没写基于element-ui的项目了&#xff0c;都有点生疏了。 好了&#xff0c;如果对你有帮助&#xff0c;欢迎点个免费的赞哦。...

AR技术下的电商:虚拟试穿/试用/试戴成新风尚

随着科技的日新月异&#xff0c;增强现实&#xff08;AR&#xff09;技术正悄然改变着我们的生活&#xff0c;尤其在电子商务领域&#xff0c;AR技术的融入正掀起一场前所未有的变革。那么&#xff0c;AR技术究竟是何方神圣&#xff1f;它在电商领域又展现出了哪些非凡的应用呢…...

社群团购平台的愿景构建与开源链动2+1模式S2B2C商城小程序应用探索

摘要&#xff1a;在数字经济背景下&#xff0c;社群团购作为一种新兴的商业模式&#xff0c;凭借其独特的互动性和便捷性&#xff0c;展现出巨大的市场潜力。本文旨在探讨社群团购平台愿景的构建策略&#xff0c;并结合开源链动21模式S2B2C商城小程序的应用&#xff0c;为创业者…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...