U8g2单色屏图形库应用笔记:移植、中文显示与刷新提速
做嵌入式显示尤其是单色OLED、LCD这类小屏幕U8g2这个名字几乎天天见。它是一套面向单片机和小型处理器的单色图形库支持I2C、SPI、并行等通信方式驱动的控制器型号非常广从常见的SSD1306到某些冷门型号都能覆盖。我最初接触U8g2时其实有点不以为然觉得一个显示库而已按照芯片手册自己写初始化、画点也不是多难的事。但真正在几个项目里用下来才发现它帮我把“显示”这件事从底层细节里彻底抽象出来了你只需要关心画什么不用关心怎么送数据。这篇文章适合准备用单色屏做界面的开发者也适合已经用U8g2但总被各种异常折腾的人。我会按实际项目里的使用顺序把几年攒下来的经验整理成一份可以照着做的应用笔记。1. 为什么单色屏项目里大家都绕不开U8g2先聊一个根本问题U8g2到底是干什么的以及它凭什么能成为很多开发者的首选。它不是某个特定屏幕的驱动而是把“驱动单色屏幕”这件事做成了一套通用框架。你买的OLED模块可能用的是SSD1306、SH1106、SSD1309这些不同控制器接线方式可能是I2C、SPI甚至老的并口屏U8g2都给你适配好了。更关键的是它内置了大量点阵字体小到5x7的英文字母大到能显示中文的完整字库选个字体就能画文字不需要自己做字模表。1.1 它到底解决了什么问题单色屏的显示原理其实不复杂屏幕内部有一块显存你往显存里写的数据会直接映射到屏幕上的点。以最常见的128x64 OLED为例显存是128*64也就是1024字节一个bit代表一个像素点。控制器的核心任务就是把这块显存的数据通过I2C、SPI或并行接口从单片机搬进屏幕里。但问题是不同控制器的显存布局不一样初始化寄存器序列不一样命令字也不一样。有的屏幕扫描方向从左到右有的从上到下有的需要设置电荷泵有的需要调节对比度。如果你换了屏幕型号之前写的驱动代码可能完全作废需要重新对着几百页的芯片手册改。U8g2的价值就在这里它用一套统一的API封装了这些差异构造函数里标明屏幕型号和接口方式底层的事情全部交给库处理。你在业务代码里就是画点、画线、画圆、显示字符串换屏幕只改初始化那一行画图的逻辑几乎不用动。1.2 跟自绘驱动相比省在哪里自己写驱动第一件头疼的事就是初始化序列。以SSD1306为例你要依次设置显示关闭、时钟分频、多路复用比、显示偏移、起始行、电荷泵、寻址模式、对比度、预充电周期、VCOMH电平、显示开每一步顺序错了都可能白屏或者花屏。好不容易点亮了又要处理画点函数——8x8的不规则矩阵里每个字节的8个bit对应屏幕上下排列的8个像素你要先算出坐标落在哪个page再做移位和掩码操作。等你想显示字符还得自己准备ASCII字模表想做中文那就得自己处理几千个汉字的取模和编码映射。这些工作单个拎出来都不难叠在一起就是无底洞。U8g2把这些事情全部替你做了。它还额外提供了一个很实用的能力分页缓冲。后面我会详细说简单理解就是MCU内存很紧张的时候它不需要一整块显存空间只需要一个页大小的缓冲就能完成整屏绘制这在只有1~2KB RAM的单片机上非常重要。这是很多自绘驱动很难顾及到的地方。1.3 典型适用场景与限制U8g2适合的场景非常明确嵌入式仪表盘、温控器、手持设备、桌面小摆件、菜单界面、状态指示面板这些需要显示文字、数字、简单图形的项目。它把单色屏能做的大部分事情都覆盖了。但它也有明确的边界。第一它只支持单色显示虽然U8g2提供了灰度模拟能力但效果和刷新率都有限做图片平滑过渡不现实。第二绘图性能受限于通信方式I2C模式下频繁全屏刷新会明显感到卡顿如果要做高速动画必须用SPI或者优化绘制策略。第三它对大屏彩色屏无能为力那是其他图形库的领域。第四中文字体体积非常庞大后面我会单独讲稍不注意Flash就被字体吃光了。如果你清楚这些边界选型时就不会走弯路。2. 环境准备与最简移植流程很多教程上来就堆代码但不解释为什么这么写结果新手抄完了也不知道哪里该改。我建议先花几分钟搞清楚一件事U8g2的构造函数名称其实是一张“配置单”。以Arduino环境为例你在代码里写的这一行包含了屏幕分辨率、控制器型号、缓冲区模式、接口方式、旋转方向所有关键信息都在里面。2.1 开发板环境下的快速跑通以最常见的SSD1306 128x64 I2C屏为例在Arduino的库管理器里搜索U8g2并安装然后输入下面这段代码#include Arduino.h #include U8g2lib.h U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8G2_PIN_NONE); void setup(void) { u8g2.begin(); u8g2.setFont(u8g2_font_unifont_t_latin); u8g2.drawStr(0, 20, Hello U8g2!); u8g2.sendBuffer(); } void loop(void) {}这段代码的核心是构造函数名字里的几个字段。SSD1306是控制器型号128X64是分辨率NONAME表示标准版型F表示full framebuffer全帧缓冲模式HW_I2C表示硬件I2C接口。如果你用的是SPI接口屏幕要换成U8G2_SSD1306_128X64_NONAME_F_4W_HW_SPI并且要额外指定CS、DC、RES引脚U8G2_SSD1306_128X64_NONAME_F_4W_HW_SPI u8g2(U8G2_R0, /* cs*/ 10, /* dc*/ 9, /* reset*/ 8);如果某些模块没有接RES引脚或者RES已经用RC电路处理了第二个参数传U8G2_PIN_NONE即可。这里最容易犯的错误是构造参数和实际接线不对应。我建议拿到一块新屏幕先确认是I2C还是SPI版本再看丝印上标注的引脚位置然后再选构造函数不要想当然。2.2 STM32/裸机环境下的移植要点除了ArduinoU8g2在STM32、ESP32等平台也很常用。ESP32可以用Arduino框架ST标准库、HAL库也能跑但比Arduino多一步U8g2对Arduino做了很多预设换成裸机环境时需要自己实现底层的字节发送和延时回调。U8g2的架构分两层底层叫U8x8负责和屏幕通信上层叫U8g2负责图形绘制。在裸机工程里你需要把u8g2源码加入项目并把u8x8_byte和u8x8_gpio_and_delay这两个接口对接上。以I2C为例核心就是处理U8X8_MSG_BYTE_SEND消息把数据通过HAL库发出去uint8_t u8x8_byte_stm32_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { if (msg U8X8_MSG_BYTE_SEND) { HAL_I2C_Master_Transmit(hi2c1, u8x8_GetI2CAddress(u8x8), (uint8_t *)arg_ptr, arg_int, 100); } return 1; }延时函数则对应U8X8_MSG_DELAY_MILLI和U8X8_MSG_DELAY_10MICRO调用HAL_Delay。需要注意U8g2库本身是C写的纯C工程要确保编译环境支持C否则链接阶段会报出大量未定义符号。第一次移植的人常常在这一步卡住其实不是代码问题是工程语言标准配错了。2.3 初始化之后先调什么屏幕点亮后不要急着写业务界面先做三个基础验证。第一个是清屏调用u8g2.clear()确认屏幕能变黑或变白排除硬件接线问题。第二个是画网格用drawFrame画外框再用drawLine画几条横线和竖线确认旋转方向和坐标轴理解正确。第三个是显示字符用drawStr输出一段ASCII文本验证字体渲染正常。我习惯把这三个步骤写到一个测试函数里叫displayTest()每次新板子第一次上电先跑它。这么做的好处是把“显示层问题”和“业务逻辑问题”隔离开。如果屏幕不亮或者显示错乱问题基本能锁定在接线、配置、通信这三类如果测试正常但界面异常那就是运行逻辑的问题。很多开发者跳过这一步直接写复杂界面结果屏幕花了半天找不出原因其实问题出在最开始的构造函数参数上。3. 全屏缓冲与分页缓冲先想清楚再写代码U8g2最需要理解的概念是缓冲区模式。它决定了内存占用、绘制方式也直接影响刷新性能。很多人代码抄了一堆却不明白为什么有的项目用_F_有的用_1_直到编译报内存不足才回头研究。这里我尽量一次讲透。3.1 全屏缓冲F模式全屏缓冲就是U8g2在内存里开辟一整块和屏幕分辨率对应的帧缓冲。128x64的屏幕真正需要的缓冲大小是128x64除以8等于1024字节。绘制流程是先操作内存中的缓冲再一次性把整块缓冲刷到屏幕u8g2.clearBuffer(); u8g2.drawFrame(0, 0, 128, 64); u8g2.setFont(u8g2_font_unifont_t_latin); u8g2.drawStr(8, 20, Full Buffer Test); u8g2.sendBuffer();注意这里的API和开始时的drawStr不同全屏模式下先用clearBuffer清空内存缓冲画完内容后必须调用sendBuffer()才能真正显示出来。全屏模式最大的优势是绘制灵活。你可以随意画图形、叠加元素、用setDrawColor(2)做异或操作不需要担心超出当前页被裁剪。因为内存里就是一张完整的画布所有绘制操作都在内存中完成最后一次性上屏画面完整统一。它的缺点是内存占用固定。如果MCU的RAM只有2KB光帧缓冲就吃掉了一半再加上U8g2内部的工作变量、堆栈、动态分配很容易爆。所以这个模式适合RAM相对充裕的平台比如STM32F103、ESP32、Arduino Mega这些。对于ATmega328P这种2KB RAM的芯片理论上勉强能跑但我实测下来危险系数很高稳定性不好保证。3.2 分页缓冲1/2模式分页缓冲的出现是为了解决小内存MCU跑不了全屏的问题。它的思路是把屏幕横着切成很多个高度为8像素的“页”内存里只保存一页或两页的数据。绘制过程变成循环u8g2.firstPage(); do { u8g2.drawFrame(0, 0, 128, 64); u8g2.setFont(u8g2_font_unifont_t_latin); u8g2.drawStr(8, 20, Page Buffer Test); } while (u8g2.nextPage());我用一个生活化的类比来解释全屏模式像你在整张A4纸上画完一幅画然后把整张纸贴到墙上分页模式像你只有一张小纸条于是把大纸裁成几行每行分别画、分别贴到墙上。代价是整个绘制代码会重复执行多次屏幕有多少页就执行多少次。128x64的屏幕有8页如果你在循环体里做了复杂的运算或读取传感器这些操作就会白白重复8遍帧率会明显下降。3.3 选型建议与内存估算选择哪种模式核心看两个东西MCU的RAM容量以及绘制逻辑的复杂度。我先把常见分辨率对应的缓冲大小算一下。屏幕分辨率全屏缓冲单页缓冲128x641024字节128字节128x32512字节128字节64x48384字节64字节256x642048字节256字节我的选型建议很简单RAM可用空间在4KB以上优先用全屏_F_RAM只有1~2KB或者绘制逻辑简单、只是显示文字和数字就用分页_1_或_2_。_2_是双页缓冲比单页省去一部分页面切换开销又比全屏省内存属于中间方案。还要提醒一点分页模式下所有的绘制逻辑都必须放在firstPage和nextPage构成的循环体内。你把这个循环当做一个“每次被调8次的函数”不要在循环体里写阻塞延时也不要在循环完后再画东西否则那些内容不会出现在屏幕上。我见过不少初学者把drawStr写在循环外面然后疑惑为什么屏幕一片空白。原因就是页循环只执行了最后一次绘制内容被下一轮覆盖了。4. 字体与中文显示这里坑最多单色屏的字体处理是U8g2用得越多越觉得“水很深”的地方。英文还好随便选一个内置字体就能显示一到中文编码、体积、字库缺失各种问题接踵而至。我在这上面踩过的坑比在通信上的多得多。4.1 U8g2字体体系与编码U8g2内置了数量庞大的字体从5x7的小像素字体到10x20、16x32的大号字体覆盖拉丁字母、希腊字母、西里尔字母还有若干中文字体。字体名称的后缀是有规律的理解了这个规律选字体就不会两眼一抹黑。_t_表示transparent透明模式只更新有像素的点不会把背景整块涂掉适合在已有图形上叠加文字。_f_表示full/新版完整字体通常性能更好但体积可能更大。_latin表示这个字体只包含Latin字符_gb2312表示包含GB2312编码的中文子集_chinese常见于unifont系列支持UTF-8的中文显示。还有一个关键点U8g2有drawStr和drawUTF8两个字符串绘制接口前者只能画ASCII后者能解析UTF-8编码的中文。你可以这样理解drawStr是给英文和数字用的drawUTF8才是给中文用的。如果你拿drawStr去显示中文屏幕上只会出现乱码或空白。4.2 中文显示实战内置字体与自提字模U8g2对中文的支持其实超出很多人预期它内置了文泉驿点阵字体和Unifont字体。最简单的使用方法是u8g2.setFont(u8g2_font_unifont_t_chinese); u8g2.drawUTF8(0, 20, 温度25.6℃);看起来只有几行代码但这里藏着两个陷阱。第一个陷阱是编码问题。unifont_t_chinese期望的是UTF-8编码的字符串而Arduino IDE默认源码文件是UTF-8所以一般没问题但如果你用某些古老的编辑器把源码保存成了GB2312或者其它编码drawUTF8就会得到错误的字节流显示出来的中文全是乱码。解决办法是统一使用UTF-8保存源码文件。第二个陷阱是字体体积。unifont_t_chinese这类全中文点阵字体体积动辄几十KB甚至上百KB对于Flash只有32KB的芯片来说字库一进去程序空间直接爆掉。我实测定方案时经常遇到“编译成功但下载失败”的情况其实程序已经超过Flash容量了。那么项目只需要显示“温度”“湿度”“设置”这十几个汉字怎么处理我的建议是不要用内置大字体自己提取字模。取模工具生成的C数组本质上就是一个个小位图用U8g2的drawXBM接口绘制static const unsigned char tem_char[] U8X8_PROGMEM { 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x3C, 0x42, ... // 这里填取模工具输出的数据 }; u8g2.drawXBM(x, y, 16, 16, tem_char);每个字16x16像素就算20个汉字也就640字节左右的Flash比内置字体省出几十倍空间。代价是你得先把所有要用的字提取出来后期改文案时还要重新生成。我的体会是如果产品文案基本固定、目标芯片Flash又小自提字模是唯一合理的方案如果Flash充足、需要频繁改文案就用内置字体。还有一个小坑_gb2312系列的字体期望的是GB2312编码的字节流而很多开发环境默认字符串是UTF-8。如果混用中文也会乱码。我在某个项目里图省事直接用了wqy12_t_gb2312结果中文全是问号排查了一晚上最后把源码文件另存为GB2312编码才解决。5. 刷新提速的几条实用路子单色屏没有颜色计算压力但刷新率依然受通信带宽和绘制逻辑限制。很多项目把界面做出来后感觉画面发卡、刷新很慢不一定全是屏幕的锅。这里我把提速思路分成几条线每一条都有明确的取舍。5.1 绘制逻辑优化能少画就少画最容易被忽略的性能瓶颈是绘制函数本身而不是通信。全屏模式下你画10个矩形和100个矩形CPU消耗完全不同分页模式下代码要执行N次复杂计算的代价还要再乘以页数。所以优化思路的第一条减少无效绘制。静态背景元素比如边框、标题栏、固定图标在全屏模式下只要画一次之后不清屏就能保留。很多新手每个循环都先clearBuffer再全部重画导致每个像素点都被重新计算一遍。正确的做法是划分区域只更新变化的部分。U8g2提供了异或绘制模式setDrawColor(2)可以让后续绘制变成XOR叠加常用于光标闪烁、选中态切换不需要手动擦除背景u8g2.setDrawColor(2); // XOR模式 u8g2.drawBox(cursor_x, cursor_y, 16, 16); // 反色显示光标 u8g2.setDrawColor(1); // 恢复正常模式这个方法在处理菜单选择状态时非常香不用保存和恢复背景图像画两次同一个位置就自动还原了。我在做仪表选单时就用这个方式实现光标移动代码简洁效果也顺畅。5.2 通信接口与总线时钟如果硬件条件允许通信接口的选择对刷新率的影响是决定性的。I2C接口只有两根线接线方便但速度天然受限SPI有独立的CLK和数据线可以跑更高频率。我随手列个对比接口方式典型时钟占用引脚优缺点I2C100kHz~400kHz2省引脚但刷新慢、受上拉电阻影响4线SPI4MHz~8MHz4~5速度快需要CS/DC/RES接线略多并行可到数十MHz8最快但引脚占用大基本不用很多人在SPI模式下发现刷新率还是上不去第一反应是换接口其实先看一下总线时钟。U8g2在Arduino中的默认SPI时钟可能只有几MHz你可以用setBusClock显式调高u8g2.setBusClock(8000000); // 8MHz SPI如果你用的是硬件SPI大部分模块在8MHz下都能稳定工作再高就可能出现花屏。如果用的是软件模拟SPI速度取决于GPIO翻转速度提升空间有限建议能换硬件SPI就换硬件SPI。在有DMA的MCU上还可以把sendBuffer的传输过程交给DMACPU不用一个个字节地等。比如在STM32上用HAL_SPI发送显示缓冲配合传输完成中断刷屏过程几乎不占CPU。这里要注意一点DMA传输期间缓冲区的数据不能被修改否则会出现画面错乱所以需要在传输完成回调里加一个标志位等标志位置位后再继续绘制下一帧。5.3 帧率上限与瓶颈认知弄懂了通信结构你才能真正判断“帧率够不够”。I2C模式要传输一屏数据每个数据字节前还要多传一个控制字节128x64全屏等于要发1024个显示字节加上1024个控制字节即使按400kHz算光是传输时间就很可观。SPI四线模式没有这个额外开销效率明显更高。所以很多做动画效果的项目无一例外都选SPI。想精确估刷新率可以用一个笨办法在loop里计数每秒统计刷新次数。我实测过一些方案I2C下整屏刷新可能在个位数帧率SPI在8MHz时能提升数倍但离流畅动画还是有一定距离。如果你要做的是“仪表盘指针摆动”“数字滚动”这类局部动画建议把静态背景画好后只更新变化区域这样UI看起来依然流畅又不需要付出整帧刷新的带宽成本。6. 常见的坑与排查实录U8g2用久了你会发现真正让你花时间的往往不是库本身而是接线、配置、环境这些“外围问题”。我把遇到过的高频问题集中整理成排查指南每条都是真实项目里的教训。6.1 屏幕点不亮屏幕完全没反应是最高频的问题遇到时先按顺序检查这几个点供电电压。OLED模块一般支持3.3V或5V但有些老模块对电压很敏感先确认模块的VCC接法。I2C地址。同一颗SSD1306在不同模块上地址可能是0x3C或0x3DU8g2构造函数里带ALT0的变体通常对应0x3D。用I2C扫描代码快速确认设备地址再选对应构造函数。RES引脚。如果RES悬空初始化时序可能不对很多模块已经把RES用电路固定了这时构造函数里填U8G2_PIN_NONE即可。SDA/SCL是否接反。这个错误比想象中常见万用表量一下或者换个顺序试试。是否真的调用了begin。这不是废话我见过把u8g2.begin()遗漏的屏幕自然不会有反应。如果以上都正常大概率是模块本身或焊接问题可以换一块屏交叉验证。6.2 花屏、残影、错位屏幕有显示但内容不对这类问题更隐蔽。花屏最常见的原因是SPI时钟过高。我在某些模块上把setBusClock调到12MHz就开始出现细碎噪点降回8MHz立刻稳定。如果你用了杜邦线飞线线长超过10厘米高速信号容易衰减和串扰建议降低速率或用短线连接。还有一种花屏是电源噪声引起的尤其是在动态亮度变化大的场景。屏幕瞬间电流波动大如果电源纹波严重会影响SPI信号。这时候在模块电源脚并联一个10~100uF电容往往能解决。残影问题得分两类。一类是OLED正常现象长时间显示固定画面后切换画面会短暂看到上一帧的影子一般会逐渐消退。另一类是代码没清屏反复叠加绘制导致“鬼影”这个就要检查绘制逻辑。错位或者镜像通常是旋转参数设错了。U8G2_R0不旋转U8G2_R2是180度U8G2_R3是270度。有些模块镜像安装靠这几个参数就能调整不需要改硬件。6.3 编译资源不足与字符编码出错编译报错比运行时问题更让人焦虑但绝大多数都能归到三类。region data overflowed这类RAM溢出通常是你选了_F_全帧缓冲而芯片RAM不够。解决办法是换成分页_1_或_2_或者换大RAM芯片。text region overflowed是Flash不够多半是字库选大了优先考虑去掉不用的字体、改用小字号、或者转用自提字模方案。还有一个隐蔽的坑U8g2是C写的纯C工程编译时会出现大量“undefined reference”错误。这不是你代码写错了是工程没有启用C编译器。Arduino环境没这个问题但在STM32裸机工程里要特别注意把源文件后缀改为.cpp或者在工程设置里启用C支持。字符编码问题前面已经反复提过这里再强调一遍源码文件编码、字体期望编码、字符串接口三者的编码必须一致。想要UTF-8中文就用u8g2_font_unifont_t_chinesedrawUTF8 UTF-8源文件想要GB2312就用_gb2312字体 GB2312源文件 drawStr。混搭是乱码的根源。最后说点我的个人习惯。每拿到一块新屏幕我不会直接跑U8g2示例而是先用最小代码点亮验证接线和构造函数再做完整测试。驱动部分点亮之后我会把静态UI和动态刷新分成两个模块静态内容尽量少重绘动态内容用异或和局部更新。这个习惯帮我躲过了很多“奇怪问题”比如屏幕卡顿、数据串位、刷新闪烁。U8g2是一个你把基础规则摸透之后会非常顺手的东西但它的很多坑都藏在规则边界上提前有意识地去规避比出了问题再抓头发要省事得多。

相关新闻

ESXi 升级到 8.0 后 VM 快照删不掉?一篇讲透 “in progress“ 死循环的 3 种解法

ESXi 升级到 8.0 后 VM 快照删不掉?一篇讲透 “in progress“ 死循环的 3 种解法

本文适用版本:ESXi 7.0 U3 → 8.0 U2 升级场景(vSphere 6.7 升级也会遇到) 阅读时长:约 8 分钟 难度:⭐⭐⭐(操作不可逆,生产 VM 强烈建议先备份再动)一、为什么写这篇文章?最近私信里又有几位网友问:ESXi 7.0 升到 8.0 之后,VM 的快照怎么都删不掉,vSphere Client 里一直显示…

2026/10/15 2:48:27 阅读更多 →
ESXi ping 得通但连不上 vCenter?一篇讲透 hostd 假死的全套救法

ESXi ping 得通但连不上 vCenter?一篇讲透 hostd 假死的全套救法

本文适用版本:ESXi 7.0 U3 / 8.0 U2 / 9.0 GA 阅读时长:约 7 分钟 难度:⭐⭐(SSH 能进就能修,但要分清是 hostd 还是 vpxd 的锅)一、为什么写这篇文章?最近私信里又陆续收到几位网友问:ESXi 能 ping 通、SSH 也能进、DCUI 也正常,但 vCenter 里主机显示"未响应"或&q…

2026/10/15 2:48:27 阅读更多 →
前端XSS防御实战:xss-filters上下文转义库详解

前端XSS防御实战:xss-filters上下文转义库详解

简介:前端开源库-xss-filters是一份面向前端开发者与安全入门者的XSS防护工具源码包,聚焦于解决用户输入回显场景下的跨站脚本注入风险。资源共30个文件,以20个js源码与测试脚本为主体,辅以3个json配置、3个md说明文档&#xff0c…

2026/10/15 2:48:27 阅读更多 →

最新新闻

WorkBuddy_AI Harness架构解析8_执行沙箱

WorkBuddy_AI Harness架构解析8_执行沙箱

执行沙箱 摘要 在现代软件系统尤其是 AI Agent、CI/CD 平台、在线代码评测系统以及低代码平台中,"让不可信代码或命令安全运行"是一个绕不开的核心问题。本文以 Harness 为例,深入剖析一个执行沙箱(Execution Sandbox)应…

2026/10/15 3:34:41 阅读更多 →
PHP音乐分享系统源码深度解析:从本地部署到音频全栈处理

PHP音乐分享系统源码深度解析:从本地部署到音频全栈处理

简介:这是一套基于ASP.NET开发的原创音乐分享平台完整源码,面向Web开发者与创业团队,用于快速搭建在线音乐社区、原创音乐推广站或伴奏资源分发网站。系统采用Web 2.0架构,集成用户中心、音乐上传发布、日志相册、资讯管理及原创音…

2026/10/15 3:34:41 阅读更多 →
在浏览器中零代码训练机器学习模型:Teachable Machine v1 开发指南与源码剖析

在浏览器中零代码训练机器学习模型:Teachable Machine v1 开发指南与源码剖析

AI 应用机器学习计算机视觉前端 【免费下载链接】teachable-machine-v1 Explore how machine learning works, live in the browser. No coding required. 项目地址: https://gitcode.com/gh_mirrors/te/teachable-machine-v1 点击查看 免费下载 本篇技术指南以仓库…

2026/10/15 3:34:41 阅读更多 →
仓颉 std.net SocketAddress 类详解:协议无关 Socket 地址的抽象基类与实战用法

仓颉 std.net SocketAddress 类详解:协议无关 Socket 地址的抽象基类与实战用法

人工智能AI 技能文档开发工具 【免费下载链接】DocAgent 项目地址: https://gitcode.com/Cangjie-SIG/DocAgent 点击查看 免费下载 SocketAddress 是仓颉标准库 std.net 包中表示协议无关 Socket 地址的抽象基类,它为 TCP、UDP、Unix Domain Socket 等所…

2026/10/15 3:34:41 阅读更多 →
StreamCap 多平台直播流自动录制客户端:功能特性、源码运行与容器化部署实战指南

StreamCap 多平台直播流自动录制客户端:功能特性、源码运行与容器化部署实战指南

音视频桌面应用直播 【免费下载链接】StreamCap Multi-Platform Live Stream Automatic Recording Tool | 多平台直播流自动录制客户端 基于FFmpeg 支持监控/定时/转码 项目地址: https://gitcode.com/gh_mirrors/st/StreamCap 点击查看 免费下载 StreamCap 是一…

2026/10/15 3:34:41 阅读更多 →
Java接入个人微信API:消息回调进客服系统的正确姿势

Java接入个人微信API:消息回调进客服系统的正确姿势

Java 团队接个人微信,通常第一反应是:Spring Boot 写个 Controller,接收回调,然后直接在方法里写业务。 本地调试挺顺,一上生产就出现:接口超时、消息重复、Tomcat 线程打满。 问题不在 Java,而…

2026/10/15 3:33:41 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →