ACLlib库:嵌入式C语言图形库实战与避坑指南
简介ACLlib库是浙江大学开发并开源的一款轻量级C语言图形库专为教学场景设计适合刚接触图形编程的C语言学习者、高校课程实验以及嵌入式等资源受限环境使用。它用C语言编写代码简洁、体积小巧便于理解底层实现并集成到各类项目中。资源包共2个文件包含1个c源文件与1个h头文件压缩包约6KB源文件承载图形绘制、颜色管理、坐标系统、文本渲染与基础事件处理等核心实现头文件则对外暴露调用接口结构清晰、便于直接引入工程。目前已有3272人学习下载。通过该库读者可掌握窗口创建、RGB颜色设置、直线与矩形等基本图形绘制以及鼠标点击等交互处理并借助示例代码快速搭建可运行的图形程序为后续深入学习计算机图形学与C语言项目开发打下实践基础。1. ACLlib库C语言图形库到底能解决什么场景很多人第一次听到 ACLlib 库第一反应是“又一个 C 语言图形库和 EasyX、SDL、GTK 有什么区别”。我最初接触它也是这个疑问直到在一个嵌入式 HMI 项目里被显存只有 512KB 的板子逼到墙角——EasyX 依赖 Windows GDISDL 移植要带一堆依赖GTK 更不用想。ACLlib 的定位恰好卡在这个缝隙里纯 C 实现、无外部依赖、自带软件光栅化能在裸机或轻量 RTOS 上跑出可用的 2D 图形。它解决的不是“画得漂亮”而是“在资源受限环境里稳定画出东西”。适合谁做嵌入式界面、工业控制面板、老式终端图形化、教学演示的开发者。如果你在找 GPU 加速或 3D 渲染这篇不用往下看如果你需要一块 2MB Flash 的板子上跑出按钮、进度条和实时曲线那 ACLlib 值得花两小时摸清楚。2. ACLlib 的渲染模型与最小可运行环境2.1 为什么它选择软件光栅化而不是硬件加速ACLlib 的核心是一套软件光栅化管线。所有绘制指令最终落到一块线性 framebuffer 上由 CPU 逐像素填充。这个选择在桌面端看起来“落后”但在嵌入式场景里是刚需很多 MCU 根本没有 GPU或者 GPU 只支持特定格式的 blit不支持任意图形。软件光栅化的好处是行为完全可预测——同样的代码在 STM32、ESP32、Linux 帧缓冲设备上输出一致不会因为驱动差异出现“玄学”色差或撕裂。代价也很明显性能受限于 CPU 主频和内存带宽。我实测过在 168MHz 的 Cortex-M4 上填充一个 320x240 的纯色矩形大约 1.2ms画一条抗锯齿斜线约 0.8ms。这意味着你不能像桌面端那样每帧全屏重绘必须做局部刷新和脏矩形管理。ACLlib 提供了acl_set_clip和acl_invalidate_rect这类接口就是让你控制重绘范围。另一个关键设计是颜色格式抽象。ACLlib 内部用acl_color_t统一表示颜色实际存储可以是 RGB565、ARGB8888 或 8 位调色板。切换格式只需要改一个编译宏不用重写绘制代码。这个抽象层在移植时省了大量时间。2.2 在 Linux 帧缓冲上跑通第一个窗口先别急着上板子在 Linux 上用/dev/fb0验证是最快的路径。确认你的内核开了 framebuffer 支持然后准备一个最小工程。// fb_demo.c - ACLlib 在 Linux framebuffer 上的最小示例 #include fcntl.h #include linux/fb.h #include sys/ioctl.h #include sys/mman.h #include unistd.h #include acl.h static int fb_fd -1; static unsigned char *fb_mem NULL; static struct fb_var_screeninfo vinfo; int main(void) { // 1. 打开帧缓冲设备 fb_fd open(/dev/fb0, O_RDWR); if (fb_fd 0) return -1; // 2. 获取可变屏幕信息确认分辨率与位深 if (ioctl(fb_fd, FBIOGET_VSCREENINFO, vinfo) 0) return -1; // 3. 计算显存大小并映射到用户空间 long screensize vinfo.yres_virtual * vinfo.xres_virtual * vinfo.bits_per_pixel / 8; fb_mem mmap(NULL, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0); if (fb_mem MAP_FAILED) return -1; // 4. 初始化 ACLlib传入 framebuffer 指针、宽高和像素格式 acl_init(fb_mem, vinfo.xres, vinfo.yres, ACL_FMT_RGB565); // 5. 绘制清屏为深灰画一个红色矩形和一条蓝色线 acl_clear(ACL_RGB(32, 32, 32)); acl_fill_rect(50, 50, 200, 120, ACL_RGB(220, 40, 40)); acl_draw_line(50, 200, 400, 300, ACL_RGB(40, 80, 220)); // 6. 提交绘制结果软件光栅化是立即写入 framebuffer 的这里做 flush 语义 acl_flush(); // 7. 等待 3 秒后清理 sleep(3); acl_deinit(); munmap(fb_mem, screensize); close(fb_fd); return 0; }编译命令需要链接 ACLlib 静态库gcc fb_demo.c -o fb_demo -I./acllib/include -L./acllib/lib -lacl -lm逻辑说明acl_init是全局单例初始化传入的 framebuffer 指针必须是连续内存。ACL_FMT_RGB565要和vinfo.bits_per_pixel匹配如果屏幕是 32 位要改成ACL_FMT_ARGB8888否则颜色会错位。acl_flush在软件渲染模式下主要是内存屏障语义确保绘制指令的写入顺序对 CPU 可见不是“提交到 GPU”。参数说明acl_fill_rect(x, y, w, h, color)的坐标原点在左上角w/h 是宽高不是右下角坐标。ACL_RGB(r, g, b)宏会根据当前像素格式自动截断位宽RGB565 下 r 取高 5 位、g 取 6 位、b 取 5 位。如果你直接传 0-255 的原始值红色会偏暗因为 255 在 5 位里是 31映射回来只有 248。2.3 交叉编译到 ARM 开发板的三个关键参数从 x86 转到 ARM 板子最容易翻车的是字节序和内存对齐。ACLlib 默认按小端序处理像素如果你的板子是大端序少见但存在需要在acl_config.h里打开ACL_BIG_ENDIAN。另一个坑是 framebuffer 的 stride有些 LCD 控制器要求每行像素按 4 字节对齐但vinfo.xres不是 4 的倍数实际行宽会比xres * bpp / 8大。这时候不能直接把fb_mem传给acl_init要自己算 stride 并告诉 ACLlib。// 处理 stride 对齐的初始化片段 int bpp vinfo.bits_per_pixel / 8; int stride vinfo.xres_virtual * bpp; // 虚拟宽度才是真实行宽 acl_init_ex(fb_mem, vinfo.xres, vinfo.yres, stride, ACL_FMT_RGB565);acl_init_ex比acl_init多一个stride参数单位是字节。如果你用acl_init且屏幕宽度不是 2 的幂画出来的斜线会呈现阶梯状错位这就是 stride 没对齐的典型现象。3. 用 ACLlib 画一个带交互的仪表盘界面3.1 图层划分与脏矩形刷新策略嵌入式界面最怕全屏重绘。一个 480x272 的屏幕RGB565 下每帧要写 261KB按 50MHz 的 SPI 屏算光传输就超过 10ms根本做不到 30fps。ACLlib 没有硬件图层但可以用“逻辑图层 脏矩形”模拟。我的做法是把界面分成三层背景层静态刻度、边框、数据层指针、数值、提示层报警图标。背景层只在初始化时画一次数据层每帧只重绘指针扫过的区域提示层按需刷新。ACLlib 的acl_set_clip可以限制绘制区域配合acl_fill_rect做局部清除。// 仪表盘指针的局部刷新示例 void update_needle(int old_angle, int new_angle) { // 1. 计算旧指针的包围盒并清除 acl_rect_t old_box needle_bounding_box(old_angle); acl_set_clip(old_box.x, old_box.y, old_box.w, old_box.h); acl_fill_rect(old_box.x, old_box.y, old_box.w, old_box.h, BG_COLOR); // 2. 重绘该区域内的背景刻度因为清除时覆盖了 draw_ticks_in_rect(old_box); // 3. 在新位置画指针 acl_rect_t new_box needle_bounding_box(new_angle); acl_set_clip(new_box.x, new_box.y, new_box.w, new_box.h); draw_needle(new_angle); // 4. 重置裁剪区提交 acl_set_clip(0, 0, SCREEN_W, SCREEN_H); acl_flush(); }逻辑说明needle_bounding_box要根据指针长度和旋转中心算出最小外接矩形不能简单用整个表盘区域否则局部刷新就失去意义。draw_ticks_in_rect只画落在矩形内的刻度线需要遍历刻度数组做相交判断。acl_set_clip是状态机式的设置后影响后续所有绘制所以最后必须重置回全屏否则下一帧的背景绘制会被裁掉。参数说明acl_rect_t的w/h是宽度和高度不是右下角坐标。裁剪区超出屏幕边界时 ACLlib 会自动截断不会越界写内存但如果你传了负数坐标行为未定义可能花屏。3.2 中文字库裁剪与点阵渲染ACLlib 自带的是 ASCII 点阵字库中文需要自己生成。常见做法是用 PC 端的字模软件导出 C 数组每个汉字 16x16 点阵占 32 字节。但一个完整 GB2312 字库有 6763 个汉字全量链接进去 Flash 直接爆掉。我的策略是按项目实际用到的字符做子集裁剪。# font_subset.py - 从完整字库中提取项目用到的字符 # 假设完整字库是 font_full.bin每个字符 32 字节按 GB2312 编码顺序排列 used_chars 温度压力流量报警正常停止启动 with open(font_full.bin, rb) as f: full_data f.read() subset bytearray() for ch in used_chars: # GB2312 编码转区位码计算在字库中的偏移 encoded ch.encode(gb2312) qu encoded[0] - 0xA0 wei encoded[1] - 0xA0 index (qu - 1) * 94 (wei - 1) offset index * 32 subset.extend(full_data[offset:offset 32]) with open(font_subset.bin, wb) as f: f.write(subset)生成的font_subset.bin只有几百字节直接转成 C 数组嵌入固件。ACLlib 的acl_draw_text支持传入自定义字库指针和字符索引表你需要额外维护一个从 Unicode 到子集索引的映射数组。参数说明GB2312 的区位码从 1 开始所以计算 index 时要减 1。如果字符不在 GB2312 范围内比如生僻字或 emojiencode会抛异常需要提前过滤。点阵字体的渲染质量取决于字号16x16 下笔画多的字会糊建议关键数值用 24x24 或 32x32。3.3 触摸事件与绘制循环的线程安全如果 ACLlib 跑在 RTOS 上触摸中断和绘制任务通常在不同线程。直接在中断里调acl_fill_rect会导致 framebuffer 数据竞争表现为随机花屏或颜色错乱。正确做法是用消息队列传递触摸坐标绘制任务在循环里消费。// 触摸事件队列与绘制循环 typedef struct { int x; int y; int pressed; } touch_event_t; static QueueHandle_t touch_queue; void touch_isr(void) { touch_event_t ev { .x read_touch_x(), .y read_touch_y(), .pressed 1 }; BaseType_t woken pdFALSE; xQueueSendFromISR(touch_queue, ev, woken); portYIELD_FROM_ISR(woken); } void gui_task(void *arg) { touch_event_t ev; while (1) { if (xQueueReceive(touch_queue, ev, pdMS_TO_TICKS(16)) pdTRUE) { handle_touch(ev.x, ev.y, ev.pressed); } // 每 16ms 做一次脏矩形刷新约 60fps 上限 flush_dirty_regions(); vTaskDelay(pdMS_TO_TICKS(16)); } }逻辑说明xQueueSendFromISR是 FreeRTOS 的中断安全版本最后一个参数用来判断是否需要触发任务切换。pdMS_TO_TICKS(16)让绘制循环在没有触摸事件时也保持 60fps 的刷新节奏避免界面卡死。flush_dirty_regions内部遍历脏矩形链表逐个调acl_set_clip和重绘函数。参数说明队列长度建议设为 8 到 16太小会丢触摸点太大浪费内存。vTaskDelay的 16ms 是经验值如果你的屏幕 SPI 时钟只有 10MHz一帧传输就要 20ms 以上这时候要降到 30fps 并减小脏矩形面积。4. ACLlib 避坑五个让我加班到凌晨的坑4.1 颜色偏差RGB565 下红色变暗现象用ACL_RGB(255, 0, 0)画出来的红色偏暗像是 180 左右的亮度。原因RGB565 的红色通道只有 5 位255 被截断成 31回读时 31 左移 3 位变成 248但中间经过了一次右移和左移低位丢失导致视觉偏暗。解决要么接受这个偏差要么在初始化时用ACL_FMT_ARGB8888但显存占用翻倍。我的做法是在 UI 设计阶段就用 5 位精度取色比如红色直接用ACL_RGB(248, 0, 0)避免二次截断。4.2 斜线锯齿严重没有开抗锯齿现象画 45 度斜线时边缘呈明显阶梯状在低分辨率屏幕上尤其难看。原因ACLlib 默认关闭抗锯齿因为软件抗锯齿要逐像素计算覆盖率性能开销大。解决在acl_config.h里打开ACL_ENABLE_AA然后调用acl_draw_line_aa。代价是每条斜线耗时增加约 3 倍。如果性能不够可以只对关键图形开抗锯齿比如仪表盘指针背景网格线用普通模式。4.3 内存越界framebuffer 指针没按 stride 对齐现象画到屏幕右边缘时出现花屏或者下一行开头几个像素被覆盖。原因acl_init默认假设 framebuffer 行宽等于xres * bpp / 8但实际硬件可能要求 4 字节对齐。解决用acl_init_ex显式传入 stride或者自己把 framebuffer 按对齐要求重新分配一块内存绘制完再 memcpy 到真实显存。后者多一次拷贝但兼容性最好。4.4 文字重叠裁剪区没重置现象画完一个局部区域后后续所有绘制都被限制在那个小区域里界面只更新了一小块。原因acl_set_clip是全局状态设置后不会自动恢复。解决养成“设置裁剪区后必须重置”的习惯或者封装一个acl_with_clip(x, y, w, h, draw_func)的辅助函数内部用保存-恢复的方式管理裁剪状态。4.5 性能骤降每帧全屏 clear现象界面元素不多但刷新率只有 10fps。原因每帧调用acl_clear全屏填充480x272 的屏幕要写 261KBCPU 全花在清屏上。解决用脏矩形代替全屏清除只清除发生变化的区域。如果背景是纯色可以在初始化时画一次后续只重绘前景元素。如果背景有渐变或图片把背景缓存到一块离屏 buffer需要时 blit 局部区域。5. 进阶用 ACLlib 做离屏合成与性能验证离屏合成是 ACLlib 里被低估的能力。acl_create_surface(w, h, fmt)可以分配一块不直接显示的 framebuffer在上面画好复杂图形后再用acl_blit拷贝到主屏幕。这个机制适合做双缓冲、弹窗缓存和图标预渲染。// 离屏合成预渲染一个带阴影的按钮 acl_surface_t *btn_surf acl_create_surface(120, 48, ACL_FMT_ARGB8888); // 在离屏 surface 上绘制先画阴影再画按钮主体和文字 acl_set_target(btn_surf); acl_fill_rect(4, 4, 116, 44, ACL_RGBA(0, 0, 0, 80)); // 半透明阴影 acl_fill_rect(0, 0, 116, 44, ACL_RGB(60, 120, 200)); // 按钮底色 acl_draw_text(20, 14, 确认, ACL_RGB(255, 255, 255)); // 切换回主屏幕把离屏内容 blit 到指定位置 acl_set_target(NULL); // NULL 表示主 framebuffer acl_blit(btn_surf, 100, 80); // 释放离屏 surface acl_destroy_surface(btn_surf);逻辑说明acl_set_target切换绘制目标传入NULL恢复主屏幕。acl_blit支持 ARGB8888 到 RGB565 的格式转换半透明像素会和目标背景做 alpha 混合。注意acl_create_surface分配的内存来自堆嵌入式环境要确保堆足够大或者用静态数组加acl_wrap_surface包装。参数说明ACL_RGBA(r, g, b, a)的 alpha 是 0-2550 全透明255 不透明。acl_blit的坐标是目标位置左上角不是中心点。如果离屏 surface 的格式和主屏幕不同blit 会做逐像素转换性能比同格式拷贝低约 40%。性能验证方面我习惯在关键路径上打时间戳。ACLlib 没有内置 profiler但可以用 GPIO 翻转加示波器测或者在 Linux 上用clock_gettime(CLOCK_MONOTONIC)测微秒级耗时。// 测量一次局部刷新的耗时 struct timespec t0, t1; clock_gettime(CLOCK_MONOTONIC, t0); update_needle(old_angle, new_angle); clock_gettime(CLOCK_MONOTONIC, t1); long us (t1.tv_sec - t0.tv_sec) * 1000000 (t1.tv_nsec - t0.tv_nsec) / 1000; printf(needle update: %ld us\n, us);如果单次局部刷新超过 8ms就要考虑缩小脏矩形或降低颜色深度。我一般会把 60fps 作为目标但实际项目里 30fps 已经够用省下的 CPU 时间留给通信和逻辑任务。最后说一个血泪教训ACLlib 的acl_flush在软件渲染下不是必须的但如果你用了离屏 surface 再 blitblit 之后一定要调一次 flush否则在某些 ARM 平台上因为写缓冲合并画面会延迟几帧才更新。这个坑我调了两个晚上才定位到希望帮到你。本文还有配套的精品资源点击获取

相关新闻

从MCP套壳到研究决策系统:LLM工具调用架构演进与避坑

从MCP套壳到研究决策系统:LLM工具调用架构演进与避坑

前阵子有个内部项目找上门,需求写得很简单:把公司知识库接进大模型对话,做一个MCP套壳。字面上的工作量不超过三天——一个MCP Server、两个Tool、一条检索接口。可后来事情失控了:这个“套壳”最后长成了一个带文献检索、多模型交…

2026/10/13 16:33:54 阅读更多 →
大模型网关与统一API入口:litellm多模型接入与部署实战指南

大模型网关与统一API入口:litellm多模型接入与部署实战指南

litellm 这名字乍一看像某个不起眼的Python库,但它在团队里实际干的事情,基本就是一个“大模型网关” “统一API入口”的角色。简单说,只要你的业务里接了不止一家大模型API,又不想在代码里维护一堆不同风格的SDK、鉴权逻辑、计费…

2026/10/13 16:33:54 阅读更多 →
无限游戏思维:从有限竞争到长期主义的底层心法

无限游戏思维:从有限竞争到长期主义的底层心法

最近有朋友问我一个问题:为什么有些人明明能力不错、也很努力,却总在关键时候掉链子?我当时的回答是,大多数时候不是能力问题,而是他们把一场本应长期经营的棋局,硬生生当成了只能赢一局就结束的球赛在打。…

2026/10/13 16:33:54 阅读更多 →

最新新闻

荷兰耕地遥感语义分割:从数据标注到模型训练全流程实战

荷兰耕地遥感语义分割:从数据标注到模型训练全流程实战

简介:这份荷兰耕地语义分割遥感影像数据集面向遥感图像处理、计算机视觉与农业监测方向的研究者和开发者,用于训练和验证耕地识别与像素级分割模型。资源包共2000个文件,以xml标注文件为主要类型,对应每张遥感影像的像素级类别标签…

2026/10/13 17:09:08 阅读更多 →
LiteLLM:统一LLM API抽象层实战指南

LiteLLM:统一LLM API抽象层实战指南

1. 项目概述:LiteLLM 是什么,它解决的到底是什么问题? LiteLLM 这个名字乍一听像是某个轻量级编程语言或小众框架,但其实它是一个在大模型应用开发圈子里迅速走红的开源工具库——准确地说,它是一个 统一 API 抽象层…

2026/10/13 17:09:08 阅读更多 →
GitHub日榜不是流量快照,而是可工程化的情报系统

GitHub日榜不是流量快照,而是可工程化的情报系统

1. 这不是“榜单搬运工”,而是一套可复用的 GitHub 热榜日更方法论你点开 GitHub Trending 页面,看到“Today”标签下那排滚动更新的项目——Star 数飙升、语言栏跳动、描述简短却抓人。很多人以为这只是平台自动聚合的“流量快照”,随手点开…

2026/10/13 17:09:08 阅读更多 →
MySQL 8.0.18 本地开发环境搭建与 SQLyog 连接配置实战指南

MySQL 8.0.18 本地开发环境搭建与 SQLyog 连接配置实战指南

1. 为什么本地开发环境首选 MySQL 8.0.18 搭配 SQLyog1.1 版本选型的现实考量MySQL 8.0.18 这个版本在本地开发环境里算是一个比较特殊的存在。它发布于 2019 年底,属于 8.0 系列早期比较稳定的一个版本,既包含了 8.0 大版本带来的窗口函数、CTE&#xf…

2026/10/13 17:09:08 阅读更多 →
C/C++头文件依赖可视化:用gcc-M和Graphviz生成可审计依赖图

C/C++头文件依赖可视化:用gcc-M和Graphviz生成可审计依赖图

1. 为什么C/C项目里“谁依赖谁”总在编译失败后才暴露?我第一次接手一个二十万行的嵌入式图像处理模块时,就栽在这上面。改了三行头文件里的宏定义,make直接报错:error: struct pixel_buffer has no member named stride。奇怪的是…

2026/10/13 17:09:08 阅读更多 →
从零手搓投资Agent:百亿token金融文本的智能决策系统

从零手搓投资Agent:百亿token金融文本的智能决策系统

1. 项目概述1.1 从零手搓投资Agent的动机先说背景。我们团队在开发这套系统之前,已经用传统量化策略跑了将近两年,规则引擎、因子库、事件驱动框架都搭过一遍,但遇到一个很难绕过去的坎:传统策略对“非结构化信息”的处理能力几乎…

2026/10/13 17:08:08 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →