如何在游戏中实现类似Radeon与Geforce软件的OSD/Overlay?
全屏游戏叠加文本/界面的实现逻辑(以Nvidia/AMD软件为例)
核心实现思路
Nvidia GeForce Experience、AMD Adrenalin这类软件能在任何全屏游戏上叠加UI,核心是驱动级图形注入+Windows图形API钩子,直接绕开了普通窗口在独占全屏模式下被覆盖的限制。
1. 图形API钩子拦截
全屏游戏基本都依赖DirectX、OpenGL或Vulkan渲染。厂商驱动会在游戏进程中注入钩子函数,拦截关键的帧提交操作:
- 比如游戏调用DirectX的
Present()、OpenGL的SwapBuffers(),或者Vulkan的vkQueuePresentKHR()时,驱动会等游戏完成当前帧渲染后,插入自己的渲染指令,把叠加的文本、监控面板等内容直接画到帧缓冲区的最上层。 - 这种属于后处理渲染,完全在游戏渲染流程的最后一步介入,不会影响游戏本身的运行,而且因为是驱动级操作,优先级比普通窗口高得多。
2. Windows API的辅助作用
确实会用到Windows的核心API,主要分两类:
- 2D渲染API:比如GDI或者Direct2D,用来绘制叠加的文本、图标这些UI元素,比如N卡的FPS数字、A卡的性能条,都是用这些API画好后,再通过钩子注入到游戏帧里。
- 窗口管理API:像
SetWindowPos()、GetWindowDC()这类,只在窗口化全屏(无边框窗口)模式下帮着定位叠加窗口,但在真正的独占全屏模式下,普通窗口根本显示不出来,所以核心还是驱动钩子。
3. 独占全屏模式的特殊处理
游戏开独占全屏时,系统会把显示输出完全交给游戏进程,其他窗口都会被屏蔽。但厂商驱动有硬件级别的访问权限,能直接操作显卡的帧缓冲区,跳过系统的窗口层级限制,把叠加内容直接写到要输出到显示器的最终帧数据里,所以不管游戏是不是独占全屏,都能显示出来。
个人开发的替代方案
如果自己想做类似功能,很难拿到厂商那种驱动级权限,通常的做法是:
- 针对窗口化全屏游戏:创建一个顶层透明窗口(用
WS_EX_LAYERED属性+SetLayeredWindowAttributes()API),直接在上面画文本,这种方式完全依赖Windows API,但对独占全屏游戏没用。 - 针对独占全屏游戏:用注入工具(比如
EasyHook)钩子游戏的图形API,在Present()这类函数执行后插入自己的渲染代码,但这种方式容易被反作弊系统检测到,慎用。
内容的提问来源于stack exchange,提问作者Cláudio Júlio
相关产品推荐
相关产品推荐

