Cloud Render & Super-Resolution

为了将超分辨率整合进 GA,首先要搞明白 GamingAnywhere 的代码结构,参考知乎:

GameAnywhere代码结构

GameAnywhere 是一个开源的云游戏平台,由 Chun-Ying Huang 在2013年开发,最开始是毕业论文研究使用,近期随着云游戏风口正盛,这个项目关注度又有起色,本文介绍GameAnywhere代码构成。GameAnywhere 的License为…

现在的 IDEA 是在服务器端渲染出低分辨率的图像,再在客户端进行超分,得到高分辨率的结果

Step 1 降低服务器端渲染分辨率

服务器端首先会对游戏画面进行桌面级别的捕捉,提供DirectXGDI两种图像采集实现。因此降低服务器端渲染分辨率就只能直接修改游戏设置了,很悲剧地发现我用的 AssaultCube 游戏一改分辨率就报错闪退:

Further help & information can be found in your README, which is inside your AssaultCube directory.
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  153 (XFree86-VidModeExtension)
  Minor opcode of failed request:  10 (XF86VidModeSwitchToMode)
  Value in failed request:  0x4400010
  Serial number of failed request:  400
  Current serial number in output stream:  402

查一下可以发现大概率是 nvidia 驱动和 OpenGL 版本的问题,卸载了 NVIDIA 驱动,发现没问题了,但是没有驱动根本捕捉不了窗口 QAQ,只能先换一个游戏试试

💡

补充:恢复系统默认分辨率的指令是 xrandr -s 0

于是用 minetest 试了一下发现没问题,但是客户端显示的并不是游戏窗口,而是默认左上角的一块固定大小的屏幕

Step 2 客户端实现超分辨率

客户端渲染t画面的函数调用过程为:

main()ProcessEvent(&event)

render_image((struct RTSPThreadParam*) event->user.data1, (int) ch & 0x0ffffffff)

render_image() 函数中调用 SDL2 库进行视频显示,可以参考在两篇博客:

SDL2源代码分析6:复制到渲染器(SDL_RenderCopy())_Hardy20200507的博客-CSDN博客

SDL_RenderCopy()函数简介SDL使用SDL_RenderCopy()将纹理数据复制给渲染目标。SDL_RenderCopy()的原型如下。int SDLCALL SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect *_sdl_rendercopy

SDL2源代码分析7:显示(SDL_RenderPresent())_雷霄骅的博客-CSDN博客

上一篇文章分析了SDL纹理赋值给渲染目标的函数SDL_RenderCopy()。这篇文章分析SDL显示视频最后的一个函数:SDL_RenderPresent()。_sdl_renderpresent