一、从一次深夜调试说起
上周三凌晨两点,我盯着屏幕上卡成PPT的实时检测画面,CPU占用率97%,YOLO推理一帧要接近900毫秒——这哪是打怪,简直是看幻灯片。问题出在单线程架构上:摄像头采集、YOLO推理、鼠标控制全挤在一个线程里,前一帧没推理完,后一帧就堵在队列里越堆越长。
这种架构在Demo阶段还能跑,一旦上真实游戏场景,资源争用立刻暴露。今天我们就来拆解这个烂摊子,聊聊怎么用多线程把系统从“能跑”变成“好用”。
二、线程划分:别把所有鸡蛋放一个篮子里
我最初的架构是这样的——典型的新手错误:
python
反面教材:千万别这样写
while True:
frame = capture() # 阻塞式采集
results = model(frame) # 阻塞式推理
move_mouse(results) # 阻塞式控制
# 三个环节串行,一卡全卡
优化后的四线程架构核心代码:
python
import threading
from queue import Queue
import time
class DetectionSystem:
def init(self):
# 三个队列,缓冲区别设太小,我吃过亏
self.frame_queue = Queue(maxsize=10) # 采集->推理
self.result_queue = Queue(maxsize=5) # 推理->控制
self.control_queue = Queue(maxsize=3) # 控制指令队列
# 事件信号,用来优雅退出
self.stop_event = threading.Event()
def capture_thread(self):
"""摄像头/截屏线程:只管拼命采帧"""
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PR
516



被折叠的 条评论
为什么被折叠?



