远程控制源码包实战:从编译到低延迟远程桌面链路调优
简介这份源码包面向远程桌面与远程控制方向的开发者及学习者提供一套可编译运行的完整工程帮助理解客户端与被控端之间的连接建立、认证、屏幕捕获编码与输入同步等核心链路。包内共40个文件以14个cpp与14个h源码为主体另有6个dll动态库、2个exe可执行程序、2个pro工程文件及2个user配置压缩包约6.13MB基于Qt网络与图形模块组织目录中区分client与cserver两端便于对照阅读通信流程。已有156人学习下载。读者可从中梳理RDP、VNC类协议在工程中的落地方式分析socket通信、用户认证、屏幕更新算法与图像解码渲染的具体实现并借助现成工程文件快速搭建调试环境适合作为网络编程、多线程与跨平台GUI综合实践的参考案例。1. 拿到一个远程控制源码包先别急着解压remote_control_remote_远程桌面_远程控制软件_源码.rar这个标题信息量其实全在文件名里remote_control 是功能定位远程桌面是使用形态远程控制软件是产品类别源码说明它给的是可编译的工程而不是装完就用的成品rar 只是打包格式。很多人搜到这类资源第一反应是双击解压、找 exe、连上就跑结果要么卡在编译报错要么连上之后画面延迟到没法操作。我见过太多人把「有源码」等同于「能落地」实际上从源码到一套自己能维护的远程桌面链路中间隔着协议选型、编解码参数、网络穿透和权限模型四道坎。这篇笔记就按一线做法把这类源码包怎么读、怎么跑、怎么调、坑在哪讲清楚适合想自建远程控制能力、又不想被商业软件按设备数收费的开发和运维。2. 远程控制源码包拆开之后到底有什么2.1 先认清远程桌面的三条技术路线远程控制软件看着都差不多底层其实分三类源码包里是哪一类决定了你后面所有参数怎么调。第一类是屏幕采集加视频编码把被控端桌面当成一路视频流推给主控端主控端把鼠标键盘事件回传。VNC、RDP 的图形部分、以及绝大多数自研远程控制软件都走这条路。它的核心模块是抓屏、编码、传输、渲染四段源码包里通常能看到capture、encoder、transport、render这类目录名。第二类是远程会话协议典型是 RDP 和 SPICE它不传像素传的是绘图指令和窗口状态带宽占用低但实现复杂源码包一般不会自己造而是调用系统或开源协议栈。第三类是远程命令与文件通道只做 shell 和文件传输严格说不算远程桌面但很多「远程控制」源码包其实是这一类套了个界面。拿到包先看目录结构和依赖清单比看 README 有用。如果依赖里有 ffmpeg、x264、libjpeg-turbo基本是第一条路线如果依赖里有 FreeRDP、rdesktop那是第二条如果只有 socket 和 pty那是第三条。2.2 从目录结构反推架构一个典型的自研远程控制源码包目录大致长这样remote_control/ ├── agent/ # 被控端 │ ├── capture/ # 抓屏 │ ├── encode/ # 编码 │ └── input/ # 输入注入 ├── controller/ # 主控端 │ ├── decode/ │ ├── render/ │ └── input/ # 输入采集 ├── common/ # 协议、序列化 ├── third_party/ # 第三方库 └── build/ # 构建脚本看到这个结构你就能判断抓屏和编码在被控端解码和渲染在主控端输入是双向的。协议定义在 common 里这是你后面调参数时最该先读的文件。常见做法是先读 common 下的协议头文件或 proto 文件把消息类型列出来再对照 agent 和 controller 的收发逻辑整条链路就清楚了。提示不要一上来就编译整个工程。先把 common 里的协议定义读一遍再单独编译 agent 和 controller能省掉大量「编译过了但连不上」的排查时间。2.3 依赖清单决定你能不能跑起来源码包能不能跑八成取决于依赖。远程控制类项目常见依赖分三块抓屏X11、DXGI、Quartz、编码ffmpeg、x264、libvpx、硬件编码 SDK、网络asio、libevent、muduo 这类。在 Linux 上X11 抓屏需要libx11-dev、libxext-dev、libxtst-dev编码需要libavcodec-dev、libavformat-dev、libswscale-dev。在 Windows 上DXGI 抓屏需要 Windows SDK硬件编码要看有没有 NVENC 或 QSV 的 SDK。我一般会先跑一遍依赖检查把缺的库列出来再装而不是边编译边报错边装。下面这段脚本用来在 Ubuntu 上一次性把常见依赖补齐# 远程控制源码常见依赖Ubuntu 22.04 实测 sudo apt update sudo apt install -y build-essential cmake pkg-config \ libx11-dev libxext-dev libxtst-dev libxfixes-dev \ libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \ libssl-dev zlib1g-dev # 如果源码用 asio 或 libevent sudo apt install -y libasio-dev libevent-dev逻辑说明libx11系列是抓屏和输入注入的基础libav*是编解码libssl用于加密通道zlib用于压缩。参数上-y是自动确认批量装的时候省事。装完用pkg-config --modversion libavcodec确认版本ffmpeg 各版本 API 有差异源码里如果写死了旧 API版本不对会直接编译失败。3. 把被控端跑起来抓屏、编码、推流的最小闭环3.1 抓屏模块的选型与参数抓屏是远程桌面的第一道性能关口。Linux 下常见三种方式X11 的XGetImage、XShm 扩展、以及 DRM/KMS 直接读帧缓冲。XGetImage 最简单但慢每次全屏拷贝XShm 用共享内存快不少DRM 最快但需要权限且拿不到窗口级信息。源码包里如果用的是 XGetImage你会在高分辨率下看到明显掉帧。我一般会先测抓屏耗时再决定要不要换。下面是一段最小抓屏测试代码用来量出单帧耗时// x11_grab_test.c 编译: gcc x11_grab_test.c -lX11 -o grab #include X11/Xlib.h #include stdio.h #include time.h int main() { Display *d XOpenDisplay(NULL); if (!d) { printf(cannot open display\n); return 1; } Window root DefaultRootWindow(d); int w DisplayWidth(d, DefaultScreen(d)); int h DisplayHeight(d, DefaultScreen(d)); struct timespec t1, t2; for (int i 0; i 30; i) { clock_gettime(CLOCK_MONOTONIC, t1); XImage *img XGetImage(d, root, 0, 0, w, h, AllPlanes, ZPixmap); clock_gettime(CLOCK_MONOTONIC, t2); double ms (t2.tv_sec - t1.tv_sec) * 1000.0 (t2.tv_nsec - t1.tv_nsec) / 1e6; printf(frame %d: %.2f ms\n, i, ms); XDestroyImage(img); } XCloseDisplay(d); return 0; }逻辑说明循环抓 30 帧每帧记录起止时间算出毫秒数。参数上AllPlanes和ZPixmap是标准组合w、h是全屏尺寸。如果单帧超过 30ms1080p 下基本跑不到 30fps这时候要么换 XShm要么降低抓屏区域要么上硬件编码把整体链路压下来。常见做法是抓屏和编码分线程抓屏线程只负责把帧丢进队列编码线程慢慢消费队列满了就丢帧保证延迟不堆积。3.2 编码参数怎么设才不卡编码是第二个性能关口。软件编码用 x264硬件编码用 NVENC 或 QSV。远程桌面场景和视频点播不一样它要的是低延迟不是高压缩率。x264 的关键参数是preset、tune、gop、bitrate。我一般这样设# x264 低延迟参数远程桌面场景 ffmpeg -f rawvideo -pix_fmt bgra -s 1920x1080 -r 30 -i - \ -c:v libx264 -preset ultrafast -tune zerolatency \ -g 30 -keyint_min 30 -sc_threshold 0 \ -b:v 4M -maxrate 6M -bufsize 2M \ -f mpegts udp://127.0.0.1:9000逻辑说明-preset ultrafast牺牲压缩率换速度-tune zerolatency关掉 B 帧和前瞻-g 30每秒一个关键帧丢包后能快速恢复-sc_threshold 0禁用场景切换检测避免码率突变。-b:v 4M是目标码率1080p 桌面文字场景 4M 够用如果画面里视频多调到 6M 到 8M。-bufsize 2M控制缓冲区越小延迟越低但码率波动越大。注意-tune zerolatency和-preset ultrafast一起用CPU 占用能降一半但画质会糊文字边缘发虚。如果被控端是看代码或文档把-b:v提到 6M 以上或者改用硬件编码。3.3 推流与传输的协议选择传输层决定你在不同网络下能不能连上。局域网内 UDP 最省事延迟低跨网络就要考虑 NAT 穿透和丢包重传。源码包里常见三种裸 UDP、TCP、以及 WebRTC 的数据通道。裸 UDP 实现简单但丢包就花屏且没有拥塞控制公网容易把上行打满。TCP 可靠但队头阻塞一卡全卡。WebRTC 的 DataChannel 自带拥塞控制和重传策略是现在比较稳的做法但引入的依赖多。我一般会先看源码包用的是哪种。如果是裸 UDP我会加一层简单的 FEC 或重传如果是 TCP我会把编码码率调低减少阻塞概率。下面是一个 UDP 收发的骨架用来验证链路通不通# udp_relay.py 被控端发主控端收 import socket def send_frames(addr, frames): s socket.socket(socket.AF_INET, socket.SOCK_DGRAM) for f in frames: # 每帧切 1200 字节避免 IP 分片 for i in range(0, len(f), 1200): s.sendto(f[i:i1200], addr) s.close() def recv_frames(port): s socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind((0.0.0.0, port)) while True: data, _ s.recvfrom(2048) # 这里交给解码器 yield data逻辑说明UDP 单包超过 MTU 会分片分片丢一个整个包就废所以按 1200 字节切。参数上2048是接收缓冲区够放一个切片。这个骨架只验证链路没有重传和排序实际用的时候要在包头加序号和时间戳接收端做 jitter buffer。4. 主控端渲染与输入回传延迟到底卡在哪4.1 解码与渲染的线程模型主控端要做三件事收包、解码、渲染。这三件事如果串在一个线程里任何一步慢都会拖累整体。常见做法是收包线程只负责把包按序号放进队列解码线程从队列取包解成帧渲染线程从帧队列取帧上屏。线程模型的关键是队列长度。队列太长延迟堆积队列太短网络抖动就卡顿。我一般把解码前的队列设成 3 到 5 帧渲染前的队列设成 1 到 2 帧。超过就丢最旧的帧保证画面跟手。下面是一个带丢帧策略的队列实现import threading from collections import deque class FrameQueue: def __init__(self, maxlen3): self.q deque(maxlenmaxlen) self.lock threading.Lock() self.cond threading.Condition(self.lock) def put(self, frame): with self.cond: # deque 满了自动丢最旧保证低延迟 self.q.append(frame) self.cond.notify() def get(self): with self.cond: while not self.q: self.cond.wait() return self.q.popleft()逻辑说明deque(maxlen3)在满的时候自动从左边丢天然实现「丢旧保新」。Condition用来在队列空时阻塞消费者避免忙等。参数上maxlen就是延迟上限3 帧在 30fps 下约 100ms能接受如果网络差调到 5 帧但操作手感会变肉。4.2 输入回传的时序问题输入回传是远程桌面「跟手」的关键。主控端采集鼠标键盘事件打包发给被控端被控端注入。这条链路如果和视频链路共用一条连接视频的大包会把输入的小包堵在后面导致点击延迟。常见做法是输入走单独通道或者给输入包高优先级。源码包里如果只有一条连接我会在协议层给输入包打标记发送端优先发。下面是一个简单的优先级发送逻辑import queue class PrioritySender: def __init__(self): self.high queue.Queue() # 输入事件 self.low queue.Queue() # 视频帧 def send_loop(self, sock): while True: # 先清空高优先级队列 while not self.high.empty(): sock.send(self.high.get()) if not self.low.empty(): sock.send(self.low.get())逻辑说明每轮发送前先把输入队列清空再发一帧视频。参数上没有复杂配置核心是「高优先级先发」。实际用的时候要注意如果视频帧太大单次send会阻塞所以视频帧要切片每片发完检查一次高优先级队列。4.3 延迟测量别靠感觉靠打点「卡不卡」不能靠感觉要打点。我在被控端抓屏时记一个时间戳编码后塞进包头主控端渲染时记一个时间戳两者相减就是端到端延迟。这个数字比任何主观描述都准。打点要注意时钟同步。同一台机器上可以用CLOCK_MONOTONIC跨机器就要用 NTP 或直接在协议里做往返测量。我一般先在局域网测排除网络因素再放到真实网络里测。环节典型耗时1080p 30fps优化手段抓屏10-30msXShm、DRM编码5-20ms硬件编码、ultrafast传输1-50msUDP、FEC解码3-10ms硬件解码渲染2-8ms双缓冲、GPU这张表是我实测的粗略范围具体数值取决于硬件和网络。如果端到端超过 150ms操作就会明显不跟手优先查抓屏和编码。5. 避坑远程控制源码落地最常见的五个翻车点5.1 编译过了但连不上现象是连接超时现象agent 和 controller 都编译成功启动后主控端一直显示连接中日志里没有报错。原因八成是监听地址绑到了127.0.0.1或者防火墙没放行端口。源码包里默认配置经常是本地回环方便开发调试但部署到另一台机器就连不上。解决检查 agent 的监听配置改成0.0.0.0或具体网卡地址用ss -tulnp确认端口在听防火墙放行对应端口。如果是云主机还要看安全组。5.2 画面能出来但鼠标点不准现象能看到被控端桌面但鼠标位置偏移或者点击没反应。原因坐标缩放没做。主控端窗口大小和被控端分辨率不一致时鼠标坐标要按比例映射。很多源码包只做了 1:1 映射窗口一缩放就偏。解决在输入注入前做坐标变换x_target x_local * target_width / window_widthy 同理。还要注意多显示器场景被控端有多个屏幕时要确定注入到哪个屏幕。5.3 高分辨率下帧率暴跌现象1080p 能跑 30fps换到 4K 就掉到 5fps。原因抓屏和编码都是按像素量线性增长的4K 像素是 1080p 的四倍软件编码扛不住。解决优先上硬件编码NVENC 或 QSV抓屏改用 XShm 或 DRM如果都不行降低采集帧率到 15fps或者只传变化区域。变化区域检测是远程桌面的经典优化静态画面只传增量能省大量带宽和算力。5.4 输入事件重复或丢失现象点一下变成点两下或者拖动时断断续续。原因输入事件队列没有去重或者网络丢包后重传导致重复。鼠标移动事件频率很高如果每个事件都单独发包网络压力大且容易乱序。解决输入事件做合并鼠标移动只发最新位置按键事件保证顺序。接收端按序号去重旧序号直接丢。5.5 长时间运行后内存涨到爆现象跑几个小时内存占用从几百兆涨到几个 G最后被 OOM 杀掉。原因抓屏的 XImage 或编码的 AVFrame 没有释放或者队列无界导致积压。解决所有XGetImage配XDestroyImageav_frame_alloc配av_frame_free。队列必须有界满了丢帧。用valgrind或heaptrack跑一遍能定位到泄漏点。6. 进阶把远程控制源码改成自己能维护的形态源码包能跑起来只是起点真正要投入生产得做三件事加认证、加加密、加日志。认证方面源码包里常见的是裸连接谁连上谁控制。至少要加一个预共享密钥或 token 校验在握手阶段验证。加密方面如果传输层没加密用 TLS 包一层或者用 libsodium 做端到端加密。日志方面把连接、断开、输入事件、错误都记下来出问题时有据可查。我自己的习惯是拿到任何远程控制源码先不改功能先加日志和延迟打点跑一周把瓶颈和异常都摸清楚再动代码。这样后面改起来心里有底不会改出一个更难查的问题。还有一个具体技巧把抓屏区域做成可配置。默认全屏但支持指定窗口或指定区域。这样在只需要看一个终端的场景下抓屏和编码的负载能降一个数量级。实现上就是在抓屏前判断配置只抓目标区域编码分辨率也跟着变。# 区域抓屏配置示例 config { capture_mode: region, # full / region / window region: {x: 0, y: 0, w: 1280, h: 720}, fps: 30, bitrate: 2M } # 抓屏时按 region 裁剪编码分辨率用 w/h逻辑说明capture_mode控制抓屏范围region指定坐标和尺寸fps和bitrate跟着区域大小调。参数上区域越小码率可以越低720p 区域 2M 就够。这个改动不大但收益很明显尤其在被控端性能有限的情况下。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AWR基本操作入门:用LC低通滤波器跑通射频仿真全流程

AWR基本操作入门:用LC低通滤波器跑通射频仿真全流程

大概一年前,我第一次在项目里用 AWR(Cadence AWR Design Environment,核心设计工具叫 Microwave Office)做一套射频前端匹配网络。当时手头有 ADS 的使用经验,本以为换个工具只是界面区别,结果打开 AWR 的第…

2026/10/5 8:21:08 阅读更多 →
实现 DWG 转 PDF/PNG/JPG 服务(强化版)

实现 DWG 转 PDF/PNG/JPG 服务(强化版)

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

2026/10/5 8:21:08 阅读更多 →
DeepSeek私有化部署指南:硬件选型、LoRA微调与推理加速实战

DeepSeek私有化部署指南:硬件选型、LoRA微调与推理加速实战

简介:面向希望落地AI能力的中小型企业及技术决策者,这份PDF围绕DeepSeek的私有化部署与业务应用展开,系统讲解了从核心技术原理、部署架构到客户服务、市场营销、生产制造等场景的适配方案,并给出电商、制造、物流三类企业案例&am…

2026/10/5 8:20:08 阅读更多 →

最新新闻

从淮师大6个月全量上线经验出发 省属高校数据治理型智慧校园落地全场景高频答疑

从淮师大6个月全量上线经验出发 省属高校数据治理型智慧校园落地全场景高频答疑

省属高校在已有数字化校园基础上启动智慧校园升级,合理的项目落地周期一般是多久?参考已落地的实操经验,适配省属高校存量系统的智慧校园升级项目,采用高效协同模式的前提下,招标后1个月即可完成核心平台搭建&#xff…

2026/10/5 9:46:38 阅读更多 →
Origin Pro 2023绘制Piper三线图全攻略:从数据换算到论文级出图

Origin Pro 2023绘制Piper三线图全攻略:从数据换算到论文级出图

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

2026/10/5 9:46:38 阅读更多 →
LPC546xx USB VBUS检测设计:从阈值计算到冷启动排查

LPC546xx USB VBUS检测设计:从阈值计算到冷启动排查

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

2026/10/5 9:46:38 阅读更多 →
工业级MRAM与PIC32嵌入式存储方案:高频写入与掉电保护实战

工业级MRAM与PIC32嵌入式存储方案:高频写入与掉电保护实战

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

2026/10/5 9:46:38 阅读更多 →
均匀分布生成高斯分布的三大核心算法解析

均匀分布生成高斯分布的三大核心算法解析

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

2026/10/5 9:46:38 阅读更多 →
安卓逆向学习路线:从应用层分析到Native层对抗

安卓逆向学习路线:从应用层分析到Native层对抗

这几年时不时就有人跑来问我:安卓逆向怎么学?是不是得会汇编?要不要先学破解?也有人直接在搜索框里敲“android 逆向学习路线”“安卓逆向教程”,然后被一堆零散的资料劝退。作为常年在这行折腾的人,我太清…

2026/10/5 9:45:38 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

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

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

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

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/4 11:40:45 阅读更多 →
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/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练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/4 20:14:29 阅读更多 →