随便记录下,想得起来的多少写多少:
Windows:
GDI 全屏:fullscreen desktop BitBlt 速度是 20ms / 帧
GDI 窗口:Win7+可以录制游戏和非游戏,XP以前只能录制普通界面,截不到游戏窗口
DirectDraw 全屏:full screen primary surface 异步到 offscreen-surface XP下闪电速度 1ms / 帧
D3D9: render target -> offscreen surface XP下 16ms Win7 下 10ms
D3D Hook: Hook Device::Present -> 保存 StateBlock -> 截屏 -> 恢复 StateBlock 极速!
Linux:framebuffer: 打开 /dev/fb0 映射到内存,直接读里面内容,部分显卡驱动启用硬件加速绘图后,framebuffer会被跳过,直接调用 framebuffer 导致读取出来的东西为空。
Android:
framebuffer: 需要 root 权限才能访问 framebuffer
RootView: 取得 root view 然后得到 drawing cache 然后保存,兼容性好,慢。
OpenGL:直接 glReadPixel 保险,但是会卡到应用。
OpenGL FBO: 更改渲染的 FBO ,让渲染到纹理,从纹理取下来,还行,速度还好。
screenshot: SurfaceComposerClient::getBuiltInDisplay Android 4.0 以后,性能不错。
native buffer: ANativeWindowBuffer -> GraphicBuffer -> 映射读取, 性能不错
iOS:
OpenGL: 直接 glReadPixel 同 Android,同样会卡到应用
OpenGL FBO: 渲染到 FBO,读取下来,还行。
大部分方法可以用 Hook 的方式注入到目标程序,或者系统 API,在不需要目标程序改一行代码的情况下实现功能。