CN105597321B - 一种全屏游戏状态下的弹幕显示方法与系统 - Google Patents

一种全屏游戏状态下的弹幕显示方法与系统 Download PDF

Info

Publication number
CN105597321B
CN105597321B CN201510964324.1A CN201510964324A CN105597321B CN 105597321 B CN105597321 B CN 105597321B CN 201510964324 A CN201510964324 A CN 201510964324A CN 105597321 B CN105597321 B CN 105597321B
Authority
CN
China
Prior art keywords
game
rendering
bitmap
engine
function
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201510964324.1A
Other languages
English (en)
Other versions
CN105597321A (zh
Inventor
杨亮
田东辉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuhan Douyu Network Technology Co Ltd
Original Assignee
Wuhan Douyu Network Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Wuhan Douyu Network Technology Co Ltd filed Critical Wuhan Douyu Network Technology Co Ltd
Priority to CN201510964324.1A priority Critical patent/CN105597321B/zh
Publication of CN105597321A publication Critical patent/CN105597321A/zh
Application granted granted Critical
Publication of CN105597321B publication Critical patent/CN105597321B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • AHUMAN NECESSITIES
    • A63SPORTS; GAMES; AMUSEMENTS
    • A63FCARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
    • A63F13/00Video games, i.e. games using an electronically generated display having two or more dimensions
    • A63F13/60Generating or modifying game content before or while executing the game program, e.g. authoring tools specially adapted for game development or game-integrated level editor
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T13/00Animation
    • G06T13/203D [Three Dimensional] animation
    • AHUMAN NECESSITIES
    • A63SPORTS; GAMES; AMUSEMENTS
    • A63FCARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
    • A63F2300/00Features of games using an electronically generated display having two or more dimensions, e.g. on a television screen, showing representations related to the game
    • A63F2300/50Features of games using an electronically generated display having two or more dimensions, e.g. on a television screen, showing representations related to the game characterized by details of game servers
    • A63F2300/53Features of games using an electronically generated display having two or more dimensions, e.g. on a television screen, showing representations related to the game characterized by details of game servers details of basic data processing
    • A63F2300/538Features of games using an electronically generated display having two or more dimensions, e.g. on a television screen, showing representations related to the game characterized by details of game servers details of basic data processing for performing operations on behalf of the game client, e.g. rendering

Abstract

本发明公开了一种全屏游戏状态下的弹幕显示方法,包括:接收用户所发送的弹幕文本;将接收到的弹幕文本绘制到一张位图中;在游戏中创建一个用于绘制弹幕的纹理;根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图。通过上述方法能够判断游戏所使用的渲染引擎,并且接收用户所发送的弹幕文本,将所述弹幕文本通过所述渲染引擎所对应的游戏绘制函数在全屏游戏状态下绘制在游戏中。从而解决了现有技术中无法当游戏全屏后处于全屏独占模式时无法显示弹幕的问题,从而提高了用户的交互性与娱乐性。本发明还提供了相应的全屏游戏状态下的弹幕显示系统。

Description

一种全屏游戏状态下的弹幕显示方法与系统
技术领域
本发明属于图形图像显示技术领域,更具体地,涉及一种全屏游戏状态下的弹幕显示方法与系统。
背景技术
随着互联网和网络视频直播技术的发展,弹幕越来越多的被使用到视频直播平台中,用以增加用户的互动性和娱乐性。然后,在当前的应用场景中,主要是将收到的弹幕在窗口模式下显示出来,而无法将弹幕在全屏游戏中显示出来,因为当游戏全屏后处于全屏独占模式时无法显示弹幕。
发明内容
为了实现上述目的,本发明提供了一种全屏游戏状态下的弹幕显示方法与系统,能够在当游戏全屏后处于全屏独占模式时也能够显示弹幕。
为了实现上述目的,按照本发明的一个方面,提供了一种全屏游戏状态下的弹幕显示方法,包括如下步骤:
接收用户所发送的弹幕文本;
将接收到的弹幕文本绘制到一张位图中;
在游戏中创建一个用于绘制弹幕的纹理;
根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图。
在本发明的一个实施例中,在根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图之前,还包括判断所述游戏所使用的渲染引擎,具体为:
预先对各种渲染引擎的动态链接库(Dynamic Link Library,DLL)进行 API函数挂钩,如果游戏进程中存在opengl.dll,则分别挂钩OpenGL的游戏绘制函数SwapBuffers、wglSwapBuffers、wglSwapLayerdBuffers为SwapBuffersHook、wglSwapBuffersHook、wglSwapLayerdBuffersHook;如果游戏进程中存在ddraw.dll,则挂钩DirectDraw的游戏绘制函数Blt为BltHook;如果游戏进程中存在d3d8.dll,则挂钩Direct3D8的游戏绘制函数Present为D3D8Present;如果游戏进程中存在d3d9.dll,则挂钩Direct3D9的游戏绘制函数Present为D3D9Present;如果游戏进程中存在d3d10.dll或者d3d11.dll,则挂钩交换链接口IDXGISwapChain的游戏绘制函数DXGISwapPresent为DXGISwapPresentHook;
判断游戏的调用堆栈中进入了哪一种游戏绘制函数,如果游戏的调用堆栈中进入了SwapBuffersHook、wglSwapBuffersHook、wglSwapLayerdBuffersHook,则该游戏使用的是OpenGL渲染引擎;如果该游戏进入了BltHook,则该游戏使用的是DirectDraw渲染引擎;如果该游戏进入了D3D8Present,则该游戏使用的是Direct3D8渲染引擎;如果该游戏进入了D3D9Present,则该游戏使用的是Direct3D9渲染引擎;如果该游戏进入了DXGISwapPresentHook,则该游戏使用的是Direct3D10或者Direct3D11。
在本发明的一个实施例中,所述根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图,具体为:
如果所述渲染引擎为Direct3D8,则加载d3dx8d.dll;
通过d3dx8d.dll的导出函数D3DXCreateSprite创建ID3DXSprite接口;
挂钩d3dx8d的游戏绘制函数Present,并在被挂钩的游戏绘制函数Present中,通过ID3DXSprite的Draw方法在所述纹理中绘制上述位图;
如果所述渲染引擎为Direct3D9,则加载d3dx9_43.dll;
通过d3dx9_43.dll的导出函数D3DXCreateSprite创建ID3DXSprite接口;
挂钩d3dx9的游戏绘制函数Present,并在被挂钩的游戏绘制函数Present中,通过ID3DXSprite的Draw方法在所述纹理中绘制上述位图。
在本发明的一个实施例中,所述根据所述游戏所使用的渲染引擎,选用对应的图像绘制方法在所述纹理中绘制上述位图,具体为:
如果所述渲染引擎为Direct3D10,则调用ID3D10StateBlock的Capture方法保存当前游戏的所有渲染状态;
调用ID3D10Device的ClearState方法将游戏当前的渲染状态设置为Direct3D10的默认状态;
设置Direct3D10中的相关渲染状态;
调用ID3D10Device的Draw方法绘制上述位图;
调用ID3D10StateBlock的Apply接口,恢复Direct3D10游戏的之前渲染状态;
如果所述渲染引擎为Direct3D11,则调用ID3D11StateBlock的Capture方法保存当前游戏的所有渲染状态;
调用ID3D11Device的ClearState方法将游戏当前的渲染状态设置为Direct3D11的默认状态;
设置Direct3D11中的相关渲染状态;
调用ID3D11Device的Draw方法绘制上述位图;
调用ID3D11StateBlock的Apply接口,恢复Direct3D11游戏的之前渲染状态。
在本发明的一个实施例中,所述根据所述游戏所使用的渲染引擎,选用对应的图像绘制方法在所述纹理中绘制上述位图,具体为,具体为:
如果所述渲染引擎为OpenGL,则调用游戏绘制函数SwapBuffers显示上述位图;
如果所述渲染引擎为DirectDraw,则调用游戏绘制函数Blt显示上述位图。
按照本发明的另一方面,还提供了一种全屏游戏状态下的弹幕显示系统,包括弹幕接收模块、位图绘制模块、纹理绘制模块和弹幕绘制模块,其中:
所述弹幕接收模块用于接收用户所发送的弹幕文本;
所述位图绘制模块用于将所述弹幕接收模块接收到的弹幕文本绘制到一张位图中;
所述纹理绘制模块用于在游戏中创建一个用于绘制弹幕的纹理;
所述弹幕绘制模块用于根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图。
在本发明的一个实施例中,所述弹幕显示系统还包括渲染引擎判断模块,所述渲染引擎判断模块用于在所述弹幕绘制模块根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图之前,判断所述游戏所使用的渲染引擎,具体包括游戏绘制函数挂钩子模块和渲染引擎判断子模块,其中:
所述游戏绘制函数挂钩子模块,用于预先对各种渲染引擎的动态链接库(DynamicLink Library,DLL)进行API函数挂钩,如果游戏进程中存在opengl.dll,则分别挂钩OpenGL的游戏绘制函数SwapBuffers、wglSwapBuffers、wglSwapLayerdBuffers为SwapBuffersHook、wglSwapBuffersHook、wglSwapLayerdBuffersHook;如果游戏进程中存在ddraw.dll,则挂钩DirectDraw的游戏绘制函数Blt为BltHook;如果游戏进程中存在d3d8.dll,则挂钩Direct3D8的游戏绘制函数Present为D3D8Present;如果游戏进程中存在d3d9.dll,则挂钩Direct3D9的游戏绘制函数Present为D3D9Present;如果游戏进程中存在d3d10.dll或者d3d11.dll,则挂钩交换链接口IDXGISwapChain的游戏绘制函数DXGISwapPresent为DXGISwapPresentHook;
所述渲染引擎判断子模块,用于判断游戏的调用堆栈中进入了哪一种 游戏绘制函数,如果游戏的调用堆栈中进入了SwapBuffersHook、wglSwapBuffersHook、wglSwapLayerdBuffersHook,则该游戏使用的是OpenGL渲染引擎;如果该游戏进入了BltHook,则该游戏使用的是DirectDraw渲染引擎;如果该游戏进入了D3D8Present,则该游戏使用的是Direct3D8渲染引擎;如果该游戏进入了D3D9Present,则该游戏使用的是Direct3D9渲染引擎;如果该游戏进入了DXGISwapPresentHook,则该游戏使用的是Direct3D10或者Direct3D11。
在本发明的一个实施例中,所述弹幕绘制模块中包含有Direct3D8引擎绘制模块或Direct3D9引擎绘制模块,其中:
所述Direct3D8引擎绘制模块,用于在所述渲染引擎为Direct3D8时,加载d3dx8d.dll;通过d3dx8d.dll的导出函数D3DXCreateSprite创建ID3DXSprite接口;并挂钩d3dx8d的游戏绘制函数Present,并在被挂钩的游戏绘制函数Present中,通过ID3DXSprite的Draw方法在所述纹理中绘制上述位图;
所述Direct3D9引擎绘制模块,用于在所述渲染引擎为Direct3D9时,加载d3dx9_43.dll;通过d3dx9_43.dll的导出函数D3DXCreateSprite创建ID3DXSprite接口;并挂钩d3dx9的游戏绘制函数Present,并在被挂钩的游戏绘制函数Present中,通过ID3DXSprite的Draw方法在所述纹理中绘制上述位图。
在本发明的一个实施例中,所述弹幕绘制模块中包含有Direct3D10引擎绘制模块或Direct3D11引擎绘制模块,其中:
所述Direct3D10引擎绘制模块,用于调用ID3D10StateBlock的Capture方法保存当前游戏的所有渲染状态;调用ID3D10Device的ClearState方法将游戏当前的渲染状态设置为Direct3D10的默认状态;设置Direct3D10中的相关渲染状态;调用ID3D10Device的Draw方法绘制上述位图;调用ID3D10StateBlock的Apply接口,恢复Direct3D10游戏的之前渲染状态;
所述Direct3D11引擎绘制模块,用于调用ID3D11StateBlock的Capture方法保存当前游戏的所有渲染状态;调用ID3D11Device的ClearState方法将游戏当前的渲染状态设置为Direct3D11的默认状态;设置Direct3D11中的相关渲染状态;调用ID3D11Device的Draw方法绘制上述位图;调用ID3D11StateBlock的Apply接口,恢复Direct3D11游戏的之前渲染状态。
在本发明的一个实施例中,所述弹幕绘制模块中包含有OpenGL引擎绘制模块或DirectDraw引擎绘制模块,其中:
所述OpenGL引擎绘制模块,用于调用游戏绘制函数SwapBuffers显示上述位图;
所述DirectDraw引擎绘制模块,用于调用游戏绘制函数Blt显示上述位图。
通过本发明提供的全屏游戏状态下的弹幕显示方法与系统,能够判断游戏所使用的渲染引擎,并且接收用户所发送的弹幕文本,将所述弹幕文本通过所述渲染引擎所对应的游戏绘制函数在全屏游戏状态下绘制在游戏中。从而解决了现有技术中无法当游戏全屏后处于全屏独占模式时无法显示弹幕的问题,从而提高了用户的交互性与娱乐性。
附图说明
图1是本发明实施例中全屏游戏状态下的弹幕显示方法流程图;
图2是本发明实施例中全屏游戏状态下的弹幕显示系统结构示意图;
图3是本发明另一实施例中全屏游戏状态下的弹幕显示系统结构示意图;
图4是本发明实施例中渲染引擎判断模块的结构示意图;
图5是本发明实施例中弹幕绘制模块的结构示意图;
图6是本发明实施例中全屏游戏状态下的弹幕显示效果图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及 实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
如图1所示,本发明提供了一种全屏游戏状态下的弹幕显示方法,具体包括如下步骤:
接收用户所发送的弹幕文本;
将接收到的弹幕文本绘制到一张位图中;
在游戏中创建一个用于绘制弹幕的纹理;
根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图。
在根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图之前,需要判断所述游戏所使用的渲染引擎,通常所用的游戏渲染引擎包括OpenGL、DirectDraw、Direct3D8、Direct3D9、Direct3D10或Direct3D11。
各种不同的渲染引擎对不同的动态链接库(Dynamic Link Library,DLL),具体地,OPENGL对应opengl.dll,DirectDraw对应ddraw.dll,Direct3D8对应d3d8.dll,Direct3D9对应d3d9.dll,Direct3D10对应d3d10.dll,Direct3D11对应d3d11.dll。
因为一个游戏中上述的DLL可能有多个存在,所以要判断该游戏到底使用的哪种渲染引擎,必须预先对各种渲染引擎的DLL进行API函数挂钩,如果游戏进程中存在opengl.dll,则分别挂钩OpenGL的游戏绘制函数SwapBuffers、wglSwapBuffers、wglSwapLayerdBuffers为SwapBuffersHook、wglSwapBuffersHook、wglSwapLayerdBuffersHook;如果游戏进程中存在ddraw.dll,则挂钩DirectDraw的游戏绘制函数Blt为BltHook;如果游戏进程中存在d3d8.dll,则挂钩Direct3D8的游戏绘制函数Present为D3D8Present; 如果游戏进程中存在d3d9.dll,则挂钩Direct3D9的游戏绘制函数Present为D3D9Present;如果游戏进程中存在d3d10.dll或者d3d11.dll,则挂钩交换链接口IDXGISwapChain的游戏绘制函数DXGISwapPresent为DXGISwapPresentHook。
并且判断游戏的调用堆栈中进入了哪一种游戏绘制函数,如果游戏的调用堆栈中进入了SwapBuffersHook、wglSwapBuffersHook、wglSwapLayerdBuffersHook,则该游戏使用的是OpenGL渲染引擎;如果该游戏进入了BltHook,则该游戏使用的是DirectDraw渲染引擎;如果该游戏进入了D3D8Present,则该游戏使用的是Direct3D8渲染引擎;如果该游戏进入了D3D9Present,则该游戏使用的是Direct3D9渲染引擎;如果该游戏进入了DXGISwapPresentHook,则该游戏使用的是Direct3D10或者Direct3D11。具体地可以根据对应的设备接口类型,判断是Direct3D10还是Direct3D11。
在判断完游戏渲染引擎后,就需要在游戏中显示图像,下面具体地对各种渲染引擎所对应的图形绘制方法进行说明:
如果所述渲染引擎为Direct3D8,则加载d3dx8d.dll;
通过d3dx8d.dll的导出函数D3DXCreateSprite创建ID3DXSprite接口;
挂钩d3dx8d的游戏绘制函数Present,并在被挂钩的游戏绘制函数Present中,通过ID3DXSprite的Draw方法在所述纹理中绘制上述位图;
如果所述渲染引擎为Direct3D9,则加载d3dx9_43.dll;
通过d3dx9_43.dll的导出函数D3DXCre;ateSprite创建ID3DXSprite接口;
挂钩d3dx9的游戏绘制函数Present,并在被挂钩的游戏绘制函数Present中,通过ID3DXSprite的Draw方法在所述纹理中绘制上述位图;
如果所述渲染引擎为Direct3D10,调用ID3D10StateBlock的Capture方法保存当前游戏的所有渲染状态;
调用ID3D10Device的ClearState方法将游戏当前的渲染状态设置为Direct3D10的默认状态;
设置Direct3D10中的相关渲染状态;具体地,需要设置Direct3D10中的禁用深度与模板检测、禁用背面剔除、设置视口;设置顶点图元格式、设置世界矩阵、设置顶点坐标和纹理坐标;设置顶点着色器和像素着色器;
调用ID3D10Device的Draw方法绘制上述位图;
调用ID3D10StateBlock的Apply接口,恢复Direct3D10游戏的之前渲染状态。
如果所述渲染引擎为Direct3D11,调用ID3D11StateBlock的Capture方法保存当前游戏的所有渲染状态;
调用ID3D11Device的ClearState方法将游戏当前的渲染状态设置为Direct3D11的默认状态;
设置Direct3D11中的相关渲染状态;
调用ID3D11Device的Draw方法绘制上述位图;
调用ID3D11StateBlock的Apply接口,恢复Direct3D11游戏的之前渲染状态。
如果所述渲染引擎为OpenGL,则调用游戏绘制函数SwapBuffers显示上述位图;
如果所述渲染引擎为DirectDraw,则调用游戏绘制函数Blt显示上述位图。
进一步,如图2所示,本发明还提供了一种全屏游戏状态下的弹幕显示系统,包括弹幕接收模块、位图绘制模块、纹理绘制模块和弹幕绘制模块,其中:
所述弹幕接收模块用于接收用户所发送的弹幕文本;
所述位图绘制模块用于将所述弹幕接收模块接收到的弹幕文本绘制到一张位图中;
所述纹理绘制模块用于在游戏中创建一个用于绘制弹幕的纹理;
所述弹幕绘制模块用于根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图。
进一步地,如图3所示,所述系统还包括渲染引擎判断模块,所述渲染引擎判断模块用于在所述弹幕绘制模块根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图之前,判断所述游戏所使用的渲染引擎。具体地,如图4所示,所述渲染引擎判断模块包括游戏绘制函数挂钩子模块和渲染引擎判断子模块,其中:
所述游戏绘制函数挂钩子模块,用于预先对各种渲染引擎的动态链接库(DynamicLink Library,DLL)进行API函数挂钩,如果游戏进程中存在opengl.dll,则分别挂钩OpenGL的游戏绘制函数SwapBuffers、wglSwapBuffers、wglSwapLayerdBuffers为SwapBuffersHook、wglSwapBuffersHook、wglSwapLayerdBuffersHook;如果游戏进程中存在ddraw.dll,则挂钩DirectDraw的游戏绘制函数Blt为BltHook;如果游戏进程中存在d3d8.dll,则挂钩Direct3D8的游戏绘制函数Present为D3D8Present;如果游戏进程中存在d3d9.dll,则挂钩Direct3D9的游戏绘制函数Present为D3D9Present;如果游戏进程中存在d3d10.dll或者d3d11.dll,则挂钩交换链接口IDXGISwapChain的游戏绘制函数DXGISwapPresent为DXGISwapPresentHook;
所述渲染引擎判断子模块,用于判断游戏的调用堆栈中进入了哪一种游戏绘制函数,如果游戏的调用堆栈中进入了SwapBuffersHook、wglSwapBuffersHook、wglSwapLayerdBuffersHook,则该游戏使用的是OpenGL渲染引擎;如果该游戏进入了BltHook,则该游戏使用的是DirectDraw渲染引擎;如果该游戏进入了D3D8Present,则该游戏使用的是Direct3D8渲染引擎;如果该游戏进入了D3D9Present,则该游戏使用的是Direct3D9渲染引擎;如果该游戏进入了DXGISwapPresentHook,则该游戏 使用的是DXGI,则该游戏使用的是Direct3D10或者Direct3D11。
进一步地,如图5所示,所述弹幕绘制模块中包含有Direct3D8引擎绘制模块或Direct3D9引擎绘制模块,其中:
所述Direct3D8引擎绘制模块,用于在所述渲染引擎为Direct3D8时,加载d3dx8d.dll;通过d3dx8d.dll的导出函数D3DXCreateSprite创建ID3DXSprite接口;并挂钩d3dx8d的游戏绘制函数Present,并在被挂钩的游戏绘制函数Present中,通过ID3DXSprite的Draw方法在所述纹理中绘制上述位图;
所述Direct3D9引擎绘制模块,用于在所述渲染引擎为Direct3D9时,加载d3dx9_43.dll;通过d3dx9_43.dll的导出函数D3DXCreateSprite创建ID3DXSprite接口;并挂钩d3dx9的游戏绘制函数Present,并在被挂钩的游戏绘制函数Present中,通过ID3DXSprite的Draw方法在所述纹理中绘制上述位图。
所述弹幕绘制模块中包含有Direct3D10引擎绘制模块或Direct3D11引擎绘制模块,其中:
所述Direct3D10引擎绘制模块,用于调用ID3D10StateBlock的Capture方法保存当前游戏的所有渲染状态;调用ID3D10Device的ClearState方法将游戏当前的渲染状态设置为Direct3D10的默认状态;设置Direct3D10中的相关渲染状态;调用ID3D10Device的Draw方法绘制上述位图;调用ID3D10StateBlock的Apply接口,恢复Direct3D10游戏的之前渲染状态;
具体地设置Direct3D10中的相关渲染状态,需要设置Direct3D10中的禁用深度与模板检测、禁用背面剔除、设置视口;设置顶点图元格式、设置世界矩阵、设置顶点坐标和纹理坐标;设置顶点着色器和像素着色器;
所述Direct3D11引擎绘制模块,用于调用ID3D11StateBlock的Capture方法保存当前游戏的所有渲染状态;
调用ID3D11Device的ClearState方法将游戏当前的渲染状态设置为 Direct3D11的默认状态;
设置Direct3D11中的相关渲染状态;
调用ID3D11Device的Draw方法绘制上述位图;
调用ID3D11StateBlock的Apply接口,恢复Direct3D11游戏的之前渲染状态。
所述弹幕绘制模块中包含有OpenGL引擎绘制模块或DirectDraw引擎绘制模块,其中:
所述OpenGL引擎绘制模块,用于调用游戏绘制函数SwapBuffers显示上述位图;
所述DirectDraw引擎绘制模块,用于调用游戏绘制函数Blt显示上述位图。
具体地,在实现过程中,可以提供统一绘制接口给外部模块调用,首先需要在各种渲染引擎类型的游戏中实现图像的绘制功能,该功能可建立一个游戏图像绘制模块hookd3d9.dll模块来实现,hookd3d9.dll模块包含了各种游戏渲染引擎的图像绘制功能;并且需要提供绘制接口给外部模块调用,来实现全屏弹幕的显示,此功能可能通过建立图像外部接口模块GraphicReader.dll模块来实现,该两个模块之间是通过共享系统内存来联系的。GraphicReader.dll模块可提供如下接口:AddSpirite(创建精灵),该接口的功能是在游戏中创建一个纹理,用来绘制弹幕;DrawSpirite(绘制精灵),该接口的功能是在游戏中绘制一个图像;RemoveSpirite(删除精灵),该接口的功能是在游戏中删除一个纹理,回收资源。
例如,在游戏直播平台斗鱼TV中,hookd3d9(游戏图像绘制模块)与GraphicReader(图像外部接口模块)之间是通过共享内存的方式,来完成游戏与斗鱼TV直播伴侣的通信的。当斗鱼TV伴侣调用IsFullScreenMode函数判断当前系统进入了全屏状态后,便根据该函数返回的进程id,调用AddSpirite来创建一个精灵,调用该函数后,会将一个创建纹理的请求写到 hookd3d9模块的消息中心中,该消息被hookd3d9模块执行后,游戏便创建了一个相应大小的纹理,并通知GraphicReader模块创建精灵请求成功;GraphicReader模块便会调用DrawSpirite接口将要绘制的图像像素写到共享内存中并提示hookd3d9模块来更新相应的纹理;在游戏的渲染循环中,hookd3d9模块会绘制所有通过AddSpirite接口创建的纹理,这样便可以将实时的图像显示在游戏中了。当斗鱼TV直播伴侣退出时,便会调用RemoveSpirite接口将所有创建的精灵全部删掉,释放游戏的纹理资源。
斗鱼TV直播伴侣中,用户通过登陆,便产生了一个同斗鱼TV弹幕服务器的TCP连接,当主播用户打开弹幕助手后,观众所发的弹幕,斗鱼TV直播伴侣都可以收到。通过上述步骤,斗鱼TV伴侣模块douyuTool中只需将收到的弹幕文本,通过GDI+(Windows图形接口)绘制到一张Bitmap(位图)中,并将该Bitmap的图像像素取出,通过调用DrawSpirite接口绘制到游戏中。至此,通过上述的所有步骤,便完成了将斗鱼TV的弹幕显示到全屏游戏中。从而如图6所示,可在全屏游戏状态下显示弹幕,包括当前在线的人数,以及各用户发送的弹幕文本。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种全屏游戏状态下的弹幕显示方法,其特征在于,所述方法包括如下步骤:
接收用户所发送的弹幕文本;
将接收到的弹幕文本通过图形接口绘制到一张位图中;
在游戏中创建一个用于绘制弹幕的纹理;
根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图。
2.如权利要求1所述的全屏游戏状态下的弹幕显示方法,其特征在于,在根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图之前,还包括判断所述游戏所使用的渲染引擎,具体为:
预先对各种渲染引擎的动态链接库进行API函数挂钩,如果游戏进程中存在opengl.dll,则分别挂钩OpenGL的游戏绘制函数SwapBuffers、wglSwapBuffers、wglSwapLayerdBuffers为SwapBuffersHook、wglSwapBuffersHook、wglSwapLayerdBuffersHook;如果游戏进程中存在ddraw.dll,则挂钩DirectDraw的游戏绘制函数Blt为BltHook;如果游戏进程中存在d3d8.dll,则挂钩Direct3D8的游戏绘制函数Present为D3D8Present;如果游戏进程中存在d3d9.dll,则挂钩Direct3D9的游戏绘制函数Present为D3D9Present;如果游戏进程中存在d3d10.dll或者d3d11.dll,则挂钩交换链接口IDXGISwapChain的游戏绘制函数DXGISwapPresent为DXGISwapPresentHook;
判断游戏的调用堆栈中进入了哪一种游戏绘制函数,如果游戏的调用堆栈中进入了SwapBuffersHook、wglSwapBuffersHook、wglSwapLayerdBuffersHook,则该游戏使用的是OpenGL渲染引擎;如果该游戏进入了BltHook,则该游戏使用的是DirectDraw渲染引擎;如果该游戏进入了D3D8Present,则该游戏使用的是Direct3D8渲染引擎;如果该游戏进入了D3D9Present,则该游戏使用的是Direct3D9渲染引擎;如果该游戏进入了DXGISwapPresentHook,则该游戏使用的是Direct3D10或者Direct3D11。
3.如权利要求1或2所述的全屏游戏状态下的弹幕显示方法,其特征在于,所述根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图,具体为:
如果所述渲染引擎为Direct3D8,则加载d3dx8d.dll;
通过d3dx8d.dll的导出函数D3DXCreateSprite创建ID3DXSprite接口;
挂钩d3dx8d的游戏绘制函数Present,并在被挂钩的游戏绘制函数Present中,通过ID3DXSprite的Draw方法在所述纹理中绘制上述位图;
如果所述渲染引擎为Direct3D9,则加载d3dx9_43.dll;
通过d3dx9_43.dll的导出函数D3DXCreateSprite创建ID3DXSprite接口;
挂钩d3dx9的游戏绘制函数Present,并在被挂钩的游戏绘制函数Present中,通过ID3DXSprite的Draw方法在所述纹理中绘制上述位图。
4.如权利要求1或2所述的全屏游戏状态下的弹幕显示方法,其特征在于,所述根据所述游戏所使用的渲染引擎,选用对应的图像绘制方法在所述纹理中绘制上述位图,具体为:
如果所述渲染引擎为Direct3D10,则调用ID3D10StateBlock的Capture方法保存当前游戏的所有渲染状态;
调用ID3D10Device的ClearState方法将游戏当前的渲染状态设置为Direct3D10的默认状态;
设置Direct3D10中的相关渲染状态;
调用ID3D10Device的Draw方法绘制上述位图;
调用ID3D10StateBlock的Apply接口,恢复Direct3D10游戏的之前渲染状态;
如果所述渲染引擎为Direct3D11,则调用ID3D11StateBlock的Capture方法保存当前游戏的所有渲染状态;
调用ID3D11Device的ClearState方法将游戏当前的渲染状态设置为Direct3D11的默认状态;
设置Direct3D11中的相关渲染状态;
调用ID3D11Device的Draw方法绘制上述位图;
调用ID3D11StateBlock的Apply接口,恢复Direct3D11游戏的之前渲染状态。
5.如权利要求1或2所述的全屏游戏状态下的弹幕显示方法,其特征在于,所述根据所述游戏所使用的渲染引擎,选用对应的图像绘制方法在所述纹理中绘制上述位图,具体为:
如果所述渲染引擎为OpenGL,则调用游戏绘制函数SwapBuffers显示上述位图;
如果所述渲染引擎为DirectDraw,则调用游戏绘制函数Blt显示上述位图。
6.一种全屏游戏状态下的弹幕显示系统,其特征在于,所述系统包括弹幕接收模块、位图绘制模块、纹理绘制模块和弹幕绘制模块,其中:
所述弹幕接收模块用于接收用户所发送的弹幕文本;
所述位图绘制模块用于将所述弹幕接收模块接收到的弹幕文本通过图形接口绘制到一张位图中;
所述纹理绘制模块用于在游戏中创建一个用于绘制弹幕的纹理;
所述弹幕绘制模块用于根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图。
7.如权利要求6所述的全屏游戏状态下的弹幕显示系统,其特征在于,所述弹幕显示系统还包括渲染引擎判断模块,所述渲染引擎判断模块用于在所述弹幕绘制模块根据所述游戏所使用的渲染引擎,选用对应的游戏绘制函数在所述纹理中绘制上述位图之前,判断所述游戏所使用的渲染引擎,具体包括游戏绘制函数挂钩子模块和渲染引擎判断子模块,其中:
所述游戏绘制函数挂钩子模块,用于预先对各种渲染引擎的动态链接库进行API函数挂钩,如果游戏进程中存在opengl.dll,则分别挂钩OpenGL的游戏绘制函数SwapBuffers、wglSwapBuffers、wglSwapLayerdBuffers Present为SwapBuffersHook、wglSwapBuffersHook、wglSwapLayerdBuffersHook;如果游戏进程中存在ddraw.dll,则挂钩DirectDraw的游戏绘制函数Blt为BltHook;如果游戏进程中存在d3d8.dll,则挂钩Direct3D8的游戏绘制函数Present为D3D8Present;如果游戏进程中存在d3d9.dll,则挂钩Direct3D9的游戏绘制函数Present为D3D9Present;如果游戏进程中存在d3d10.dll或者d3d11.dll,则挂钩交换链接口IDXGISwapChain的游戏绘制函数DXGISwapPresent为DXGISwapPresentHook;
所述渲染引擎判断子模块,用于判断游戏的调用堆栈中进入了哪一种游戏绘制函数,如果游戏的调用堆栈中进入了SwapBuffersHook、wglSwapBuffersHook、wglSwapLayerdBuffersHook,则该游戏使用的是OpenGL渲染引擎;如果该游戏进入了BltHook,则该游戏使用的是DirectDraw渲染引擎;如果该游戏进入了D3D8Present,则该游戏使用的是Direct3D8渲染引擎;如果该游戏进入了D3D9Present,则该游戏使用的是Direct3D9渲染引擎;如果该游戏进入了DXGISwapPresentHook,则该游戏使用的是Direct3D10或者Direct3D11。
8.如权利要求6或7所述的全屏游戏状态下的弹幕显示系统,其特征在于,所述弹幕绘制模块中包含有Direct3D8引擎绘制模块或Direct3D9引擎绘制模块,其中:
所述Direct3D8引擎绘制模块,用于在所述渲染引擎为Direct3D8时,加载d3dx8d.dll;通过d3dx8d.dll的导出函数D3DXCreateSprite创建ID3DXSprite接口;并挂钩d3dx8d的游戏绘制函数Present,并在被挂钩的游戏绘制函数Present中,通过ID3DXSprite的Draw方法在所述纹理中绘制上述位图;
所述Direct3D9引擎绘制模块,用于在所述渲染引擎为Direct3D9时,加载d3dx9_43.dll;通过d3dx9_43.dll的导出函数D3DXCreateSprite创建ID3DXSprite接口;并挂钩d3dx9的游戏绘制函数Present,并在被挂钩的游戏绘制函数Present中,通过ID3DXSprite的Draw方法在所述纹理中绘制上述位图。
9.如权利要求6或7所述的全屏游戏状态下的弹幕显示系统,其特征在于,所述弹幕绘制模块中包含有Direct3D10引擎绘制模块或Direct3D11引擎绘制模块,其中:
所述Direct3D10引擎绘制模块,用于调用ID3D10StateBlock的Capture方法保存当前游戏的所有渲染状态;调用ID3D10Device的ClearState方法将游戏当前的渲染状态设置为Direct3D10的默认状态;设置Direct3D10中的相关渲染状态;调用ID3D10Device的Draw方法绘制上述位图;调用ID3D10StateBlock的Apply接口,恢复Direct3D10游戏的之前渲染状态;
所述Direct3D11引擎绘制模块,用于调用ID3D11StateBlock的Capture方法保存当前游戏的所有渲染状态;调用ID3D11Device的ClearState方法将游戏当前的渲染状态设置为Direct3D11的默认状态;设置Direct3D11中的相关渲染状态;调用ID3D11Device的Draw方法绘制上述位图;调用ID3D11StateBlock的Apply接口,恢复Direct3D11游戏的之前渲染状态。
10.如权利要求6或7所述的全屏游戏状态下的弹幕显示系统,其特征在于,所述弹幕绘制模块中包含有OpenGL引擎绘制模块或DirectDraw引擎绘制模块,其中:
所述OpenGL引擎绘制模块,用于调用游戏绘制函数SwapBuffers显示上述位图;
所述DirectDraw引擎绘制模块,用于调用游戏绘制函数Blt显示上述位图。
CN201510964324.1A 2015-12-18 2015-12-18 一种全屏游戏状态下的弹幕显示方法与系统 Active CN105597321B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510964324.1A CN105597321B (zh) 2015-12-18 2015-12-18 一种全屏游戏状态下的弹幕显示方法与系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510964324.1A CN105597321B (zh) 2015-12-18 2015-12-18 一种全屏游戏状态下的弹幕显示方法与系统

Publications (2)

Publication Number Publication Date
CN105597321A CN105597321A (zh) 2016-05-25
CN105597321B true CN105597321B (zh) 2020-07-10

Family

ID=55978008

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510964324.1A Active CN105597321B (zh) 2015-12-18 2015-12-18 一种全屏游戏状态下的弹幕显示方法与系统

Country Status (1)

Country Link
CN (1) CN105597321B (zh)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106060671B (zh) * 2016-06-02 2018-10-19 武汉斗鱼网络科技有限公司 一种基于游戏直播弹幕控制去重方法及装置
CN106331832B (zh) * 2016-09-14 2019-09-13 腾讯科技(深圳)有限公司 信息显示方法和装置
CN106445535B (zh) * 2016-09-28 2020-09-11 北京奇虎科技有限公司 一种操作处理方法和装置
CN106713968B (zh) * 2016-12-27 2020-04-24 北京奇虎科技有限公司 一种直播数据显示方法和装置
CN106658145B (zh) * 2016-12-27 2020-07-03 北京奇虎科技有限公司 一种直播数据处理方法和装置
CN107092643B (zh) * 2017-03-06 2020-10-16 武汉斗鱼网络科技有限公司 一种弹幕渲染方法及装置
CN107135427B (zh) * 2017-03-28 2021-01-01 武汉斗鱼网络科技有限公司 一种显示弹幕信息的方法和系统
CN109218817B (zh) * 2017-06-29 2021-05-28 武汉斗鱼网络科技有限公司 一种显示虚拟礼物提示消息的方法和装置
CN107911708B (zh) * 2017-11-09 2022-04-05 腾讯数码(天津)有限公司 弹幕显示方法、直播方法、及相关装置
CN110012338A (zh) * 2019-04-10 2019-07-12 广州虎牙信息科技有限公司 一种显示弹幕数据的方法、装置、计算机设备和存储介质
CN110237531A (zh) * 2019-07-17 2019-09-17 网易(杭州)网络有限公司 游戏控制的方法、装置、终端和存储介质
CN111131910B (zh) * 2020-01-02 2022-04-12 广州虎牙科技有限公司 弹幕实现方法、装置、电子设备和可读存储介质
CN111586489A (zh) * 2020-06-22 2020-08-25 腾讯科技(深圳)有限公司 弹幕渲染方法、装置、计算机设备及存储介质
CN112423111A (zh) * 2020-11-05 2021-02-26 上海哔哩哔哩科技有限公司 图形引擎和适用于播放器的图形处理方法

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101078982A (zh) * 2006-05-24 2007-11-28 北京壁虎科技有限公司 基于绘图引擎的屏幕显示方法
CN102622236A (zh) * 2012-01-13 2012-08-01 深圳市妙趣工场信息科技有限公司 一种Geart3D游戏引擎
CN104618813A (zh) * 2015-01-20 2015-05-13 腾讯科技(北京)有限公司 弹幕信息处理方法、客户端及服务平台
CN104703044A (zh) * 2015-02-12 2015-06-10 北京橘子文化传媒有限公司 一种图片弹幕发布方法
CN104735543A (zh) * 2015-03-30 2015-06-24 北京奇艺世纪科技有限公司 一种弹幕显示方法及装置
CN104754396A (zh) * 2015-03-12 2015-07-01 腾讯科技(北京)有限公司 弹幕数据的显示方法及装置
CN105939493A (zh) * 2016-03-30 2016-09-14 广州华多网络科技有限公司 一种视频弹幕的显示方法及显示装置

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3367934B2 (ja) * 2000-03-24 2003-01-20 株式会社コナミコンピュータエンタテインメントジャパン ゲームシステム、ゲームシステムにおける画像描画方法およびゲーム用プログラムが記憶されたコンピュータ読み取り可能な記録媒体
CN101227421B (zh) * 2007-01-16 2012-04-18 沃天醒石(北京)科技有限公司 全屏图形模式下的即时通讯方法和装置
CN101547163A (zh) * 2008-03-27 2009-09-30 华硕电脑股份有限公司 在全屏幕画面程序中即时通信的方法

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101078982A (zh) * 2006-05-24 2007-11-28 北京壁虎科技有限公司 基于绘图引擎的屏幕显示方法
CN102622236A (zh) * 2012-01-13 2012-08-01 深圳市妙趣工场信息科技有限公司 一种Geart3D游戏引擎
CN104618813A (zh) * 2015-01-20 2015-05-13 腾讯科技(北京)有限公司 弹幕信息处理方法、客户端及服务平台
CN104703044A (zh) * 2015-02-12 2015-06-10 北京橘子文化传媒有限公司 一种图片弹幕发布方法
CN104754396A (zh) * 2015-03-12 2015-07-01 腾讯科技(北京)有限公司 弹幕数据的显示方法及装置
CN104735543A (zh) * 2015-03-30 2015-06-24 北京奇艺世纪科技有限公司 一种弹幕显示方法及装置
CN105939493A (zh) * 2016-03-30 2016-09-14 广州华多网络科技有限公司 一种视频弹幕的显示方法及显示装置

Also Published As

Publication number Publication date
CN105597321A (zh) 2016-05-25

Similar Documents

Publication Publication Date Title
CN105597321B (zh) 一种全屏游戏状态下的弹幕显示方法与系统
US10699365B2 (en) Method, apparatus, and storage medium for processing particle system
JP4481166B2 (ja) ユーザによる合成画像およびビデオ画像のリアルタイムのミキシングを可能にする方法およびシステム
CN110704768B (zh) 基于图形处理器的网页渲染方法以及装置
CN107274476B (zh) 一种阴影图的生成方法及装置
CN107729095B (zh) 图像处理方法、虚拟化平台及计算机可读存储介质
CN105487848B (zh) 一种3d应用的显示刷新方法及系统
TWI739828B (zh) 資料處理方法及系統
CN110968962B (zh) 基于云渲染在移动端或大屏三维展示方法及系统
CN107369200B (zh) 一种3d场景特效处理方法及存储设备
KR100610689B1 (ko) 3차원 화면에 동영상을 삽입하는 방법 및 이를 위한 기록매체
CN115546377B (zh) 一种视频融合方法、装置、电子设备及存储介质
CN112001993A (zh) 一种面向大场景的多gpu城市仿真系统
CN103927722A (zh) 一种增强现实的实现方法及装置
CN112884665A (zh) 一种动画播放方法、装置、计算机设备及存储介质
CN113706504A (zh) 一种残影处理方法、装置、存储介质及电子设备
US20230316626A1 (en) Image rendering method and apparatus, computer device, and computer-readable storage medium
CN109859303B (zh) 图像的渲染方法、装置、终端设备及可读存储介质
US20230377242A1 (en) A-buffer dynamic allocation
CN115588064A (zh) 视频生成方法、装置、电子设备及存储介质
WO2018143502A1 (ko) 데이터 포맷 변환 방법
CN114089896A (zh) 一种渲染图像截取方法及装置
CN114428573A (zh) 特效图像处理方法、装置、电子设备及存储介质
WO2021109105A1 (en) Synchronization between graphical processing units and display processing units
CN100367199C (zh) 覆盖表面视频信息的获取方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant