最终画面输出原理¶
注册、消费者、生命周期和读回方式见 API reference。
捕获位置¶
捕获位于宿主最终屏幕 blit 处,世界、后处理、HUD、GUI 和加载界面已经完成。输出复用原生最终 blit 的 shader 与缩放,不替换主渲染目标,也不为最终画面再次渲染世界。 世界机位产物与包含完整界面的最终主画面是不同层次,详见 多机位原理。
每视角共享一次捕获¶
路由器以视角为资源所有权边界。同一视角的一帧只捕获一次,同步消费者借用同一份完成帧与颜色纹理。 首次有效输出延迟分配目标;最后一个消费者离开时释放目标。没有订阅时直接执行原生屏幕 blit。
独占输出只取消本帧的屏幕 blit,不关闭窗口事件、游戏循环或 display swap。消费/捕获失败时, 如果没有独占输出成功,仍保留屏幕展示,避免导出故障永久吞掉画面。
借用、同步与释放¶
输出是渲染线程上的同步只读借用,不允许消费者改变尺寸或删除纹理。下一帧会覆盖 storage, 尺寸变更会替换目标。回调外保留画面需要复制到自己的 GPU/CPU storage,并处理同步。 GPU 纹理编号只是句柄,不能作为 CPU 指针,也不能直接交给无当前 GL context 的线程。
单个消费者异常只移除该消费者,目标创建/绘制异常则关闭该视角。交付中关闭或替换订阅时, 真正的释放延迟到本次交付结束,保证其他回调仍能读取借用画面。
输出颜色使用 RGBA8、不透明 alpha,没有深度附件;原点沿用 OpenGL 左下角约定。 目标按实际 framebuffer 像素尺寸调整。捕获恢复 read/draw FBO、viewport 及临时改变的 GPU 状态; 消费者仍需恢复自身额外改动,宿主关闭则在主 context 销毁前统一释放输出资源。