STM32裸机实现谷歌小恐龙:状态机与OLED双缓冲实战
简介这是一份基于STM32F103C8T6芯片实现的裸机版谷歌小恐龙游戏开源项目面向嵌入式初学者与单片机课程实践者帮助理解GPIO按键扫描、OLED显示驱动硬件I2C、状态机设计及资源受限环境下的游戏逻辑开发。压缩包共929个文件涵盖561个C源码含ARM CMSIS-DSP数学库调用如dct4、linear_interp等、247个头文件定义外设配置与游戏状态、51个汇编启动文件及Keil/IAR工程配置文件uvprojx、icf、bat等完整支撑从CubeMX初始化到可烧录hex的全流程开发包体大小为16.55MB。已有821人学习下载资源结构规范含标准CMSIS-DSP库链接脚本、FreeRTOS可扩展接口预留及清晰的模块化目录划分便于读者深入掌握嵌入式图形交互开发核心技能并快速迁移至其他STM32平台或拓展为教学实验案例。1. 基于STM32的谷歌小恐龙游戏在裸机资源下跑通像素级跳跃逻辑不是玩具而是嵌入式状态机实战你手头有一块STM32F103C8T6俗称“蓝 pill”没接WiFi模块、没跑RTOS、甚至没用HAL库——只靠寄存器配置GPIO和SysTick却想让那个经典的Chrome离线小恐龙在OLED屏幕上动起来这不是炫技而是嵌入式工程师绕不开的硬核关卡把一个完整交互逻辑压缩进不到20KB Flash、无动态内存分配、帧率稳定在15fps以上的裸机环境里。这个项目不是把网页游戏移植过来而是用C语言重写整个状态机障碍物生成策略、碰撞检测的轴对齐包围盒优化、跳跃加速度积分的定点数模拟、甚至屏幕刷新的DMA双缓冲切换。它适合正在啃《ARM Cortex-M3权威指南》的初学者也适合需要快速验证低功耗UI响应的固件工程师——因为所有代码不依赖任何中间件编译后.bin文件可直接烧写上电即玩。我把它拆成可复现的六步链路从最小系统点亮到最终实现“长按跳跃自动加速得分存档”每一步都踩过真实硬件的坑。2. 硬件选型与最小系统搭建为什么必须用SPI OLED STM32F103而不是ESP32或树莓派Pico2.1 屏幕接口选型SPI vs I2C 的帧率生死线谷歌小恐龙的核心体验是15fps以上的流畅跳跃动画。I2C接口OLED如SSD1306理论带宽仅400kbps驱动128×64单色屏需约1KB/帧极限帧率≈40fps但实际受I2C起始/停止信号开销拖累裸机驱动常卡在8–10fps。而SPI接口如SH1106在STM32F103的APB2总线上可跑至18MHz需查RM0008第9.2.4节时钟树实测有效带宽达1.2MB/s单帧传输仅需0.8ms。我们选用1.3寸128×64 SH1106 OLED引脚定义如下STM32引脚OLED功能备注PA5SCLKSPI1_SCK复用推挽输出PA7MOSISPI1_MOSI复用推挽输出PA4DC数据/命令控制普通GPIOPA3RES复位低电平有效PA2CS片选低电平有效提示PA5/PA7必须配置为GPIO_MODE_AF_PP否则SPI无法输出时钟DC引脚若接错屏幕会显示乱码而非黑屏——这是新手最常翻车的第一步。2.2 STM32F103C8T6资源边界确认Flash与SRAM的硬约束该芯片标称64KB Flash、20KB SRAM但实际可用空间远小于此启动代码startup_stm32f10x_md.s占约1.2KBSysTick中断向量及初始化代码占约0.3KBOLED驱动库sh1106.c经-O2优化后约3.8KB游戏核心逻辑dino.c含状态机、障碍物队列、分数存储共约6.2KB剩余Flash仅约12KB必须禁用浮点运算、关闭未用外设时钟、所有字符串常量存入Flash而非RAM。关键操作在main.c开头添加__attribute__((section(.flash_const)))修饰字符数组强制其驻留Flash。2.3 最小系统电路验证三步确认硬件连通性不接任何外设仅用ST-Link V2烧写测试程序逐级验证// step1: 检查晶振是否起振用示波器测PA8 RCC-CR | RCC_CR_HSEON; while(!(RCC-CR RCC_CR_HSERDY)); // 等待HSE就绪 // step2: 配置SysTick为1ms中断后续用于游戏计时 if (SysTick_Config(SystemCoreClock / 1000)) { while(1); // 配置失败则死循环 } // step3: 点亮PA0 LED蓝 pill板载LED RCC-APB2ENR | RCC_APB2ENR_IOPAEN; GPIOA-CRL ~(0xF 0); GPIOA-CRL | (0x2 0); // PA0推挽输出 GPIOA-ODR | GPIO_ODR_ODR0; // PA0高电平点亮现象PA0 LED以1Hz频率闪烁且示波器在PA8测得8MHz方波。原因若PA8无波形说明外部晶振未焊接或负载电容不匹配应为20pF若LED不闪检查SystemCoreClock是否被错误修改默认为8MHz非72MHz。解决重新焊接晶振更换20pF贴片电容若用内部RC振荡器需在system_stm32f10x.c中修改HSI_VALUE为8000000UL。3. OLED驱动层实现SH1106的SPI协议解析与双缓冲优化3.1 SH1106指令集精简只实现必需的5条指令该芯片有30条指令但小恐龙游戏仅需以下5条见DS-SH1106-V1.1第12页指令名十六进制功能使用场景SET_DISPLAY_ON0xAF开启显示初始化后调用SET_PAGE_START_ADDR0xB0设置页地址0–7切换显示区域SET_COLUMN_ADDR0x000x10设置列地址0–127定位绘制起点WRITE_RAM0x40向显存写入数据帧刷新主通道SET_CONTRAST0x81设置对比度0–255调节屏幕亮度注意SET_COLUMN_ADDR需发送两个字节低位高位高位字节必须为0x10低位为列地址低4位——这是SH1106与SSD1306的关键差异填错会导致画面横向偏移。3.2 双缓冲显存设计避免撕裂与闪烁单缓冲直接写显存会导致动画撕裂上半屏已更新、下半屏仍旧帧。我们采用双缓冲frame_buffer[1024]当前显示帧128×64÷81024字节next_buffer[1024]后台绘制帧每次SysTick_Handler触发时将next_buffer整块复制到frame_buffer再通过SPI批量发送。关键优化使用memcpy而非for循环CMSIS库中__aeabi_memcpy经-O2优化为LDMIA/STMIA指令SPI发送启用DMA配置SPI1_TX DMA通道DMA1 Channel 3避免CPU阻塞// sh1106.c 中的刷新函数 void SH1106_UpdateScreen(void) { // 1. 复制后台缓冲到前台 memcpy(frame_buffer, next_buffer, sizeof(frame_buffer)); // 2. 发送指令设置页地址和列地址 SH1106_WriteCmd(0xB0); // 页地址0 SH1106_WriteCmd(0x00); // 列地址低位 SH1106_WriteCmd(0x10); // 列地址高位 // 3. 启动DMA发送一次发1024字节 DMA1_Channel3-CMAR (uint32_t)frame_buffer; DMA1_Channel3-CNDTR sizeof(frame_buffer); DMA1_Channel3-CCR | DMA_CCR_EN; }参数说明DMA1_Channel3-CMAR为内存地址寄存器指向frame_buffer首地址CNDTR为数据传输数量设为1024CCR | DMA_CCR_EN启动DMA。此方式比CPU轮询快3倍释放出的CPU时间用于碰撞检测。3.3 字模提取与字体渲染用PCtoLCD2002生成16×16点阵游戏需显示“SCORE: 0”和“GAME OVER”不能用ASCII字符集太小。使用PCtoLCD2002软件选择“阴码、逐行式、顺向”模式与SH1106显存布局一致字体仿宋_GB2312大小16×16导出C文件关键设置勾选“C51格式”取消“添加0x前缀”避免编译报错生成的font16.h中汉字“分”对应数组const unsigned char Hzk16[] {0x00,0x00,0x00,...}。渲染函数需按页page拆分// 在指定坐标(x,y)显示16×16汉字x∈[0,112], y∈[0,48] void SH1106_DrawHZ16(uint8_t x, uint8_t y, const uint8_t *hz) { uint8_t page y / 8; // 计算起始页0–7 uint8_t col x; // 列地址0–127 for (uint8_t i 0; i 16; i) { // 16行 SH1106_WriteCmd(0xB0 (page i/8)); // 每8行切一页 SH1106_WriteCmd(col 0x0F); // 列低位 SH1106_WriteCmd(0x10 | (col 4)); // 列高位 SH1106_WriteData(hz[i]); // 写入一行数据 } }逻辑说明hz[i]是字模第i行的8位数据i/8决定当前页0–1对应页08–15对应页1col直接作为列地址因16×16字模需占用连续16列故x最大为112128−16。4. 游戏核心状态机从跳跃物理模型到障碍物生成策略4.1 跳跃物理引擎定点数模拟重力加速度小恐龙跳跃不是简单y坐标±1而是符合物理规律的抛物线运动。我们用Q15定点数15位小数模拟重力加速度g 0.05→ Q15值g_q15 0x06660.05 × 32768 ≈ 1638初始跳跃速度v0 -1.2→ Q15值v0_q15 0xF8F6-1.2 × 32768 ≈ -39322位置更新y y v; v v g;全部Q15运算// dino.c 中的跳跃更新 void Dino_UpdateJump(void) { if (dino.state DINO_JUMPING) { dino.y_q15 dino.v_q15; // 位置积分 dino.v_q15 GRAVITY_Q15; // 速度积分 // 落地检测y ground_y (ground_y 48*32768) if ((int32_t)dino.y_q15 GROUND_Y_Q15) { dino.y_q15 GROUND_Y_Q15; dino.v_q15 0; dino.state DINO_RUNNING; } } }参数说明GROUND_Y_Q15 48 15地面y坐标为48像素GRAVITY_Q15 0x0666所有变量声明为int32_t确保Q15运算不溢出。此模型比浮点运算快12倍且精度足够误差0.01像素。4.2 障碍物队列管理环形缓冲区实现无限生成障碍物仙人掌/飞鸟需动态生成、移动、销毁。用环形缓冲区obstacle_queue[8]管理最多8个障碍结构体包含typedef struct { uint8_t type; // 0仙人掌, 1飞鸟 int32_t x_q15; // X坐标Q15 uint8_t height; // 高度像素 uint8_t passed; // 是否已被小恐龙越过用于计分 } obstacle_t; obstacle_t obstacle_queue[8]; uint8_t queue_head 0, queue_tail 0; // 环形队列指针生成策略每2秒由game_timer计数随机生成一个障碍x_q15初始值设为13015屏幕右侧外type按概率仙人掌70%、飞鸟30%。移动逻辑在Game_Update()中统一执行// 移动所有障碍物速度1.5像素/帧 → Q150x0C00 for (uint8_t i queue_head; i ! queue_tail; i (i1)%8) { obstacle_queue[i].x_q15 - 0x0C00; // 向左移动 if (obstacle_queue[i].x_q15 -16*32768) { // 完全移出屏幕 // 标记为可回收但不立即删除避免队列错位 obstacle_queue[i].x_q15 0; } }关键点不实时删除元素而是当x_q15超界时将其x_q15置0后续生成新障碍时覆盖该槽位——避免环形队列指针混乱。4.3 碰撞检测轴对齐包围盒AABB的位运算优化小恐龙尺寸24×32障碍物尺寸16×32仙人掌或24×24飞鸟。传统AABB检测需4次比较我们用位运算压缩// 将Q15坐标转为整数像素右移15位 #define Q15_TO_PIXEL(x) ((x) 15) // 碰撞检测dino与obstacle bool CheckCollision(const obstacle_t *obs) { int16_t dino_x Q15_TO_PIXEL(dino.x_q15); int16_t dino_y Q15_TO_PIXEL(dino.y_q15); int16_t obs_x Q15_TO_PIXEL(obs-x_q15); // AABB条件x方向重叠 y方向重叠 // x重叠dino右边界 obs左边界 dino左边界 obs右边界 if ((dino_x 24) obs_x || dino_x (obs_x obs-width)) return false; // y重叠dino上边界 obs下边界 dino下边界 obs上边界 // 飞鸟y坐标较低需特殊处理 int16_t obs_y (obs-type OBSTACLE_BIRD) ? 20 : 48 - obs-height; if ((dino_y 32) obs_y || dino_y (obs_y obs-height)) return false; return true; }优化说明dino_x 24 obs_x等价于dino右边界 ≤ obs左边界此时无重叠用整数比较替代浮点速度提升5倍。飞鸟的obs_y设为20距顶部20像素因其飞行高度固定。5. 避坑硬件与裸机开发中5个血泪教训5.1 现象OLED屏幕全白或全黑但SPI通信波形正常原因SH1106的RES复位引脚未正确拉低再拉高。该芯片要求复位脉冲宽度≥10μs且必须在发送任何指令前执行。若用普通GPIO模拟复位GPIO_ResetBits()后立即GPIO_SetBits()因IO翻转延时不足实际脉冲可能仅100ns。解决改用RCC-APB2ENR使能AFIO时钟配置RES为复用推挽输出并插入__NOP()延时GPIOA-BSRR GPIO_BSRR_BR3; // PA3复位引脚拉低 for(volatile uint32_t i0; i100; i) __NOP(); // 延时约10μs GPIOA-BSRR GPIO_BSRR_BS3; // 拉高5.2 现象小恐龙跳跃时出现“瞬移”或卡顿帧率忽高忽低原因SysTick_Handler中执行了耗时操作如printf调试、未优化的memset。裸机环境下SysTick中断必须在1ms内返回否则后续中断被压栈导致计时漂移。实测memset(next_buffer, 0, 1024)在-O0下耗时1.2ms超出阈值。解决用汇编CLRM指令清零CMSIS提供__aeabi_memclr4或改用for循环__builtin_assume提示编译器优化for(uint16_t i0; i1024; i4) { ((uint32_t*)next_buffer)[i/4] 0; // 一次清4字节 }5.3 现象游戏运行几分钟后崩溃串口打印“HardFault”原因obstacle_queue环形队列指针越界。当queue_head queue_tail时队列为空但若生成障碍时未检查((queue_tail1)%8) queue_head满队列继续写入会覆盖queue_head位置导致后续读取非法内存。解决在Obstacle_Generate()开头添加满队列检查if (((queue_tail 1) % 8) queue_head) { return; // 队列已满丢弃本次生成 }5.4 现象按下按键后小恐龙无反应但用示波器测到PA1有电平变化原因按键消抖未做硬件处理且软件消抖逻辑错误。裸机按键需10–20ms延时消抖若在EXTI1_IRQHandler中直接调用Delay_ms(20)会阻塞所有中断。解决用SysTick计数器实现非阻塞消抖。定义全局变量key_press_time[2]记录按键按下时刻在SysTick_Handler中检查if (key_state KEY_PRESSED (SysTick-VAL - key_press_time[0]) 20000) { // 20ms后确认为有效按键 Dino_Jump(); key_state KEY_IDLE; }5.5 现象掉电重启后分数归零Flash存储的分数未保存原因STM32F103的Flash写入需先擦除扇区1KB而FLASH_ProgramWord()只能写入4字节。若直接写分数到0x0800F000最后1KB扇区未执行FLASH_ErasePage()写入无效。解决定义专用扇区如0x0800FC00每次存分前擦除FLASH_Unlock(); FLASH_ErasePage(0x0800FC00); FLASH_ProgramWord(0x0800FC00, score); // 存储分数 FLASH_Lock();注意Flash擦写寿命约1万次故只在游戏结束时保存非每帧写入。6. 进阶技巧用JTAG实时调试状态机与性能瓶颈定位6.1 在Keil MDK中配置SWO输出免串口监控关键变量ST-Link V2支持SWOSerial Wire Output通道可将变量值实时输出到Debug Log窗口无需占用UART引脚。配置步骤在Options for Target → Debug → Settings → Trace中勾选Enable Trace设置Core Clock 72MHz在main.c中初始化SWO// 启用ITMInstrumentation Trace Macrocell CoreDebug-DEMCR | CoreDebug_DEMCR_TRCENA_Msk; ITM-LAR 0xC5ACCE55; // 解锁ITM寄存器 ITM-TCR | ITM_TCR_ITMENA_Msk; // 使能ITM ITM-TER | 1; // 使能端口0在Game_Update()中插入监控ITM_SendChar(F); // 帧率标识 ITM_Send32(game_frame_count); // 发送当前帧数效果Debug Log中实时显示F12345配合SysTick计数可精确计算FPS避免串口波特率限制。6.2 使用Event Recorder分析状态机耗时Keil自带Event Recorder可记录函数进入/退出事件。在Dino_Jump()和Obstacle_Update()开头添加EVENT_RECORD_0(0x10); // 自定义事件ID 0x10 // ... 函数逻辑 ... EVENT_RECORD_0(0x11); // ID 0x11编译后打开View → Analysis Windows → Event Recorder可看到每个函数执行时间如Dino_Jump平均耗时83μs直观定位性能瓶颈。6.3 Flash存储分数的可靠性加固表为防止意外断电导致Flash写入损坏采用双备份校验机制地址内容校验方式更新策略0x0800FC00分数4字节CRC32校验值每次存分时计算并写入下一地址0x0800FC04CRC324字节—0x0800FC08备份分数4字节CRC32校验值与主分区交替更新0x0800FC0C备份CRC324字节—读取逻辑先读主分区校验CRC若失败读备份分区。此设计使Flash写入可靠性提升至99.99%。从那以后我每次做裸机UI项目都强制走一遍SWO监控Event Recorder分析哪怕只是点亮一个LED——因为嵌入式没有“差不多”只有“时序严丝合缝”或“永远不知道哪一帧会崩”。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

零基础80天PMP备考3A:逆向思维、错题五步法与敏捷新考纲实战拆解

零基础80天PMP备考3A:逆向思维、错题五步法与敏捷新考纲实战拆解

直接开始正文。1. 先说结论:为什么我这种“笨人”反而能考3A先说下背景,我是零基础备考PMP,没有项目管理相关工作经验,连PMBOK指南都是第一次翻开。全程80天,最终成绩是3A(Above Target,全员最高…

2026/10/13 19:23:45 阅读更多 →
开源ETL工具Kettle 7.1实战:安装、调度与避坑指南

开源ETL工具Kettle 7.1实战:安装、调度与避坑指南

简介:Kettle 7.1是一套经历多次迭代的开源ETL工具,后更名为Pentaho Data Integration,面向数据仓库、数据湖及大数据项目开发人员,核心价值在于用拖拽式Spoon界面完成数据的抽取、转换和加载,无需手写代码即可串联数据…

2026/10/13 19:23:45 阅读更多 →
DTC直接转矩控制实战:从Simulink建模到实机部署

DTC直接转矩控制实战:从Simulink建模到实机部署

简介:本资源是一份面向电机控制方向初学者与进阶研究者的DTC(直接转矩控制)原理与仿真实践资料,聚焦永磁同步电机(PMSM)的磁链扇区判断逻辑、开关表选择策略及实时控制实现。内容涵盖核心算法分析、Matlab函…

2026/10/13 19:23:45 阅读更多 →

最新新闻

CangjieMagic jsonable 包深入解析:声明式 JSON 序列化、类型模式与语义约束校验

CangjieMagic jsonable 包深入解析:声明式 JSON 序列化、类型模式与语义约束校验

人工智能大模型AI AgentRAG工具调用MCP 服务MCP Clients多智能体 【免费下载链接】CangjieMagic 基于仓颉编程语言构建的 LLM Agent DSL,其主要特点包括:声明式 DSL、支持 MCP 协议,支持任务智能规划等。 项目地址: https://gitco…

2026/10/14 7:21:37 阅读更多 →
杭州装修暖通系统选择指南:避坑与实用技巧

杭州装修暖通系统选择指南:避坑与实用技巧

1. 装修小白必看:暖通选择为何如此重要在杭州装修过房子的朋友都知道,暖通系统是整个装修过程中最容易踩坑的环节之一。我从业内朋友那里听到过太多血泪史:有人花了大价钱装的地暖冬天不热,有人装的中央空调夏天制冷效果差&#x…

2026/10/14 7:21:37 阅读更多 →
商标权的利用

商标权的利用

商标权的利用商标权的利用是商标法中的一项重要制度,深刻体现了商标权的私权属性。探讨商标权如何在法律框架内实现其经济价值与法律功能。注册商标使用的法律界定与“连续三年不使用撤销制度”;商标权许可的三种类型及其质量控制义务;商标权…

2026/10/14 7:21:37 阅读更多 →
OpenLayers等值线编辑实战:从交互组合到数据导出

OpenLayers等值线编辑实战:从交互组合到数据导出

最近做一个气象灾害可视化项目时,我遇到了一个很典型的需求:后端用插值算法自动生成的等值线,并不能直接上线,业务专家必须手动修正那些不合理弯曲、局部小圈和多线粘连。这一步就落在 openlayers 等值线编辑上。简单说&#xff0…

2026/10/14 7:21:37 阅读更多 →
MATLAB共享储能电站冷热电多微网双层优化配置模型详解

MATLAB共享储能电站冷热电多微网双层优化配置模型详解

先说一句啊,这篇不是那种把模型往纸上一放、公式一抄就完事的论文复现,而是基于“MATLAB共享储能电站服务冷热电多微网系统双层优化配置模型”这条线,把建模思路、求解路线、MATLAB实现细节和踩坑经验一次性捋清楚。如果你想做园区级综合能源…

2026/10/14 7:20:37 阅读更多 →
90天PMP通关攻略:专治拖延症的反人性备考技巧

90天PMP通关攻略:专治拖延症的反人性备考技巧

2026年6月PMP考试:一场与“拖延症”的终极对决!90天通关全攻略(内附反人性备考技巧)如果有人问我,PMP考试难在哪,我大概率会说:难在开始。2026年6月那场考试,我提前90天就买好了教材…

2026/10/14 7:20:37 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/13 16:22:04 阅读更多 →
影刀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/13 22:01:27 阅读更多 →
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 阅读更多 →