一种基于多显卡的游戏画面渲染方法和系统与流程
本发明涉及云游戏技术领域,具体而言,涉及一种基于多显卡的游戏场景渲染方法和系统。
背景技术:
传统的游戏和游戏引擎只提供了单显卡的调用和渲染能力。多显卡渲染在云游戏及专业图形领域有一定的应用,使用多显卡渲染目前的方法是nvidia的sli、nvlink和amd的交火技术。nvidia的sli和nvlink需要保证使用的多张显卡是同型号,并且需要连接配件进行物理连接后才能使用。amd大多数显卡也是需要桥接器才能进行交火的,虽然少部分设备不需要桥接器,但a卡和n卡间的交火是无法进行的。另外,现有技术只能满足单进程单显卡的使用场景,中途也无法切换显卡。
技术实现要素:
为解决上述问题,本发明的目的在于提供一种在无sli和nvlink连接设备介入的情况下,使用多张来自不同的厂商、不同的型号和不同的运算能力的显卡进行游戏画面渲染的方法。
为实现上述目的,本发明提供了一种基于多显卡的游戏画面渲染方法,该方法包括:
识别物理主机上的m个物理显卡,其中,m为大于1的整数;
确定渲染任务并切分为至少一个渲染部分;
根据所述至少一个渲染部分确定目标物理显卡,其中,所述目标物理显卡为所述m个物理显卡中的一个或多个;
通过所述目标物理显卡对所述至少一个渲染部分进行渲染;
通过输出设备输出渲染结果。
作为本发明进一步的改进,所述物理主机上载有图形api,所述物理主机的显卡驱动程序控制所述m个物理显卡,
其中,识别物理主机上的m个物理显卡,包括:
通过所述显卡驱动程序和所述图形api识别所述m个物理显卡。
作为本发明进一步的改进,所述确定渲染任务并切分为至少一个渲染部分,包括:
当所述渲染任务为单个用户的游戏画面渲染任务时,将所述渲染任务切分为至少一个渲染部分,其中,每个渲染部分为该用户的一帧游戏画面或一帧游戏画面中的一部分;
当所述渲染任务为多个用户的游戏画面渲染任务时,将所述渲染任务切分为多个渲染部分,其中,每个渲染部分为一个用户的一帧游戏画面或一个用户的一帧游戏画面中的一部分。
作为本发明进一步的改进,所述渲染任务为单个用户的游戏画面渲染任务,
其中,所述根据所述至少一个渲染部分确定目标物理显卡,包括:
当所述渲染任务切分为一个渲染部分时,将所述m个物理显卡中的一个物理显卡确定为所述目标物理显卡;
当所述渲染任务切分为多个渲染部分时,将所述m个物理显卡中的的n个物理显卡确定为所述目标物理显卡,其中,n为大于1,小于或等于m的整数。
作为本发明进一步的改进,所述渲染任务为多个用户的游戏画面渲染任务,
其中,所述根据所述至少一个渲染部分确定目标物理显卡,包括:
将所述m个物理显卡中n个物理显卡确定为所述目标物理显卡,其中,n为大于1,小于或等于m的整数。
作为本发明进一步的改进,通过所述目标物理显卡对所述至少一个渲染部分进行渲染,包括:
创建至少一个逻辑设备;
创建与所述至少一个逻辑设备对应的至少一个渲染器,其中,一个逻辑设备对应一个渲染器;
通过所述目标物理显卡辅助所述至少一个渲染器,对所述至少一个渲染部分进行渲染处理。
作为本发明进一步的改进,所述渲染器将渲染结果导出至输出设备交换链,所述输出设备从所述输出设备交换链获取渲染结果。
作为本发明进一步的改进,所述创建至少一个逻辑设备,包括:
根据确定的所述目标物理显卡,分别从所述目标物理显卡的各个物理显卡中创建逻辑设备,其中,一个物理显卡对应至少一个逻辑设备。
作为本发明进一步的改进,所述通过输出设备输出渲染结果,包括:
当所述渲染任务切分为一个渲染部分时,所述输出设备输出渲染结果;
当所述渲染任务切分为多个渲染部分时,所述输出设备将所述至少一个渲染部分的渲染结果合并后输出。
作为本发明进一步的改进,所述物理主机上载有图形api,
其中,所述方法还包括:为所述至少一个逻辑设备创建对应的context,其中,一个所述渲染部分关联一个所述context,通过所述context调用所述图形api和提供逻辑设备的标识。
作为本发明进一步的改进,为每个所述渲染部分分配一个渲染线程进行渲染。
作为本发明进一步的改进,多个所述渲染线程共用一个公共渲染资源管理器。
作为本发明进一步的改进,所述渲染线程从所述公共渲染资源管理器获取当前渲染部分所需的渲染资源。
作为本发明进一步的改进,所述渲染线程根据当前渲染部分通过渲染资源管理器调用渲染资源,渲染器执行渲染过程后,通过输出设备交换链将渲染结果输出。
本发明还提供了一种基于多显卡的游戏画面渲染系统,该系统包括:
识别单元,用于识别物理主机上的m个物理显卡,其中,m为大于1的整数;
任务切分单元,用于确定渲染任务并切分为至少一个渲染部分;
显卡分配单元,用于根据所述至少一个渲染部分确定目标物理显卡,其中,所述目标物理显卡为所述m个物理显卡中的一个或多个;
渲染单元,用于通过所述目标物理显卡对所述至少一个渲染部分进行渲染;
输出单元,用于输出渲染结果。
作为本发明进一步的改进,所述识别单元通过所述物理主机上载有的显卡驱动程序和图形api识别所述m个物理显卡。
作为本发明进一步的改进,渲染单元通过所述目标物理显卡对所述至少一个渲染部分进行渲染,包括:
创建至少一个逻辑设备;
创建与所述至少一个逻辑设备对应的至少一个渲染器,其中,一个逻辑设备对应一个渲染器;
通过所述目标物理显卡辅助所述至少一个渲染器,对所述至少一个渲染部分进行渲染处理。
作为本发明进一步的改进,所述渲染器将渲染结果导出至输出设备交换链,所述输出设备从所述输出设备交换链获取渲染结果。
作为本发明进一步的改进,所述创建至少一个逻辑设备,包括:
根据确定的所述目标物理显卡,分别从所述目标物理显卡的各个物理显卡中创建逻辑设备,其中,一个物理显卡对应至少一个逻辑设备。
本发明的有益效果为:在单进程服务多用户的游戏进程中充分利用物理主机内的多张物理显卡完成渲染任务,既可以为每个接入用户分别用不同的显卡渲染游戏画面,也可以为单个用户同时使用多张显卡渲染一个游戏画面。通过图形api在单个进程内使用一张或多张显卡进行图形渲染,能充分利用多显卡资源,提高渲染能力,达到更高的帧率。
附图说明
图1为本发明实施例所述的一种基于多显卡的游戏画面渲染方法的流程示意图;
图2为本发明实施例所述的一种基于多显卡的游戏画面渲染方法的多显卡结构示意图;
图3为本发明实施例所述的一种基于多显卡的游戏画面渲染方法的渲染流程示意图;
图4为本发明实施例所述的一种基于多显卡的游戏画面渲染系统的系统结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对发明开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
需要说明,若本发明实施例中有涉及方向性指示(诸如上、下、左、右、前、后……),则该方向性指示仅用于解释在某一特定姿态(如附图所示)下各部件之间的相对位置关系、运动情况等,如果该特定姿态发生改变时,则该方向性指示也相应地随之改变。
另外,在本发明的描述中,所用术语仅用于说明目的,并非旨在限制本公开的范围。术语“包括”和/或“包含”用于指定元件、步骤、操作和/或组件的存在,但并不排除存在或添加一个或多个其他元件、步骤、操作和/或组件的情况。术语“第一”、“第二”等可能用于描述各种元件,不代表顺序,且不对这些元件起限定作用。此外,在本发明的描述中,除非另有说明,“多个”的含义是两个及两个以上。这些术语仅用于区分一个元素和另一个元素。结合以下附图,这些和/或其他方面变得显而易见,并且,本领域普通技术人员更容易理解关于本发明实施例的说明。附图仅出于说明的目的用来描绘本公开实施例。本领域技术人员将很容易地从以下说明中认识到,在不背离本公开原理的情况下,可以采用本发明所示结构和方法的替代实施例。
本发明实施例所述的一种基于多显卡的游戏画面渲染方法,如图1-3所示,该方法包括:
识别物理主机上的m个物理显卡,其中,m为大于1的整数;
确定渲染任务并切分为至少一个渲染部分;
根据至少一个渲染部分确定目标物理显卡,其中,目标物理显卡为m个物理显卡中的一个或多个;
通过目标物理显卡对至少一个渲染部分进行渲染;
通过输出设备输出渲染结果。
进一步的,物理主机上载有图形api,物理主机的显卡驱动程序控制m个物理显卡,
其中,识别物理主机上的m个物理显卡,包括:
通过显卡驱动程序和图形api识别m个物理显卡。
一种可选的实施方式,图形api例如为vulkanapi,通过vulkanapi选择物理显卡并从物理显卡创建逻辑设备,在游戏进程中,根据需要,选择m(1≤m≤显卡数)个物理显卡创建n(n≥m)个逻辑设备,再基于逻辑设备创建对应的渲染资源管理器、渲染器和对应输出目标的输出设备交换链。
进一步的,通过所述目标物理显卡对所述至少一个渲染部分进行渲染,包括:
创建至少一个逻辑设备;
创建与至少一个逻辑设备对应的至少一个渲染器,其中,一个逻辑设备对应一个渲染器;
通过目标物理显卡辅助至少一个渲染器,对至少一个渲染部分进行渲染处理。
进一步的,一个渲染器对应一个输出设备交换链,渲染器将渲染结果导出至输出设备交换链,输出设备从输出设备交换链获取与之对应的渲染器的渲染结果。输出设备交换链即为图3中swapchain。
进一步的,至少一个逻辑设备创建对应的context,其中,一个渲染部分关联一个context,通过context调用图形api和提供逻辑设备的标识。
进一步的,游戏进程为每个渲染部分分配一个渲染线程进行渲染。
进一步的,多个所述渲染线程共用一个公共渲染资源管理器。渲染资源包含当前渲染部分需要使用到的模型、纹理等数据。渲染线程从公共渲染资源管理器获取当前渲染部分所需的渲染资源。渲染任务为一个渲染部分并通过一个渲染器渲染时,渲染器通过输出设备交换链输出渲染结果至输出设备后显示;渲染任务切分为多个渲染部分,并通过多个渲染器渲染时,输出设备交换链输出渲染结果至输出设备,输出设备将多个渲染器的渲染结果合成后显示。
进一步的,确定渲染任务并切分为至少一个渲染部分,包括:
当渲染任务为单个用户的游戏画面渲染任务时,将渲染任务切分为至少一个渲染部分,其中,每个渲染部分为该用户的一帧游戏画面或一帧游戏画面中的一部分;
当渲染任务为多个用户的游戏画面渲染任务时,将渲染任务切分为多个渲染部分,其中,每个渲染部分为一个用户的一帧游戏画面或一个用户的一帧游戏画面中的一部分。
其中,渲染部分为一帧游戏画面中的一部分是,一种切分方式为:基于平面按网格等分切分的,整个平面的宽高可以确定,网格的每个小块的坐标、大小和偏移也是可以确定的,从而确定了每个切分部分的位置信息,后续合成基于上述位置信息进行合成。
进一步的,通过输出设备输出渲染结果,包括:
当渲染任务切分为一个渲染部分时,输出设备输出渲染结果;
当渲染任务切分为多个渲染部分时,输出设备将至少一个渲染部分的渲染结果合并后输出。
一种可选的实施方式,当需要使用多张显卡完成同一个渲染任务时,渲染数据流向可读缓冲区的交换链,辅助渲染的显卡把数据输出到缓冲区,再由负责合成画面的显卡进行组合,并通过输出到屏幕的交换链进行输出即可,以此通过合理分配渲染资源、渲染目标和组合渲染效果,就可以充分发挥多显卡共同渲染一个场景的能力。具体过程为:根据场景复杂度选择参与渲染的显卡数量,并根据分配的显卡数量对场景画面进行分块,为每个分块的显卡提供渲染所需的资源,让负责渲染的显卡并行的执行渲染工作,渲染完成所有的渲染结果组合渲染结果成为完整的游戏画面,最后将完成的游戏画面输出到显示设备或编码设备。
一种渲染的实施方式,渲染任务为单个用户的游戏画面,将渲染任务切分为一个渲染部分,渲染部分为该用户的一帧游戏画面,根据渲染部分确定一个目标物理显卡,对应创建一个逻辑设备,逻辑设备对应一个渲染器。渲染器对应渲染一帧游戏画面,渲染后的一帧游戏画面通过输出设备输出。上述方式与单显卡渲染的场景一样编写独立的渲染程序即可。
另一种渲染的实施方式,渲染任务为单个用户的游戏画面,将渲染任务切分为多个渲染部分,渲染部分为该用户的一帧游戏画面,根据渲染部分确定多个目标物理显卡,对应创建多个逻辑设备,每个逻辑设备对应一个渲染器和一个输出设备交换链,渲染器对应渲染一帧游戏画面,并将渲染后的一帧游戏画面输出至相应的输出设备交换链,输出设备从各输出设备交换链获取渲染后一帧游戏画面,并根据渲染任务切分时记录的帧画面的时间标标识和执行渲染操作的逻辑设备标识,将获取的多帧游戏画面整合以视频流的形式输出。
另一种渲染的实施方式,渲染任务为单个用户的游戏画面,将渲染任务切分为多个渲染部分,渲染部分为该用户的一帧游戏画面中的一部分,根据渲染部分确定多个目标物理显卡,对应创建多个逻辑设备,每个逻辑设备对应一个渲染器和一个输出设备交换链,渲染器对应渲染一帧游戏画面的一部分,并将渲染后的一帧游戏画面的一部分输出至相应的输出设备交换链,输出设备从输出设备交换链获取渲染后一帧游戏画面的一部分,并根据渲染任务切分时每个渲染部分的标标识和执行渲染操作的逻辑设备标识,将获取的多片游戏画面合并为一个完整的一帧游戏画面输出。
另一种渲染的实施方式,渲染任务为多个用户的游戏画面,将渲染任务切分为多个渲染部分,渲染部分为一个用户的一帧游戏画面,根据渲染部分确定多个目标物理显卡,对应创建多个逻辑设备,每个逻辑设备对应一个渲染器和一个输出设备交换链,并为每个用户分配多个渲染器渲染该用户的游戏画面,一个渲染器对应渲染一帧游戏画面,并将渲染后的一帧游戏画面输出至相应的输出设备交换链,输出设备从各输出设备交换链获取渲染后一帧游戏画面,并根据渲染任务切分时记录用户标识、帧画面的时间标标识和执行渲染操作的逻辑设备标识,分别将每个用户的渲染后的多帧游戏画面整合以视频流的形式输出。
另一种渲染的实施方式,渲染任务为多个用户的游戏画面,将渲染任务切分为多个渲染部分,渲染部分为一个用户的一帧游戏画面中的一部分,根据渲染部分确定多个目标物理显卡,对应创建多个逻辑设备,每个逻辑设备对应一个渲染器和一个输出设备交换链,渲染器对应渲染当前用户的一帧游戏画面的一部分,并将渲染后的当前用户的一帧游戏画面的一部分输出至相应的输出设备交换链,输出设备从输出设备交换链获取渲染后当前用户的一帧游戏画面的一部分,并根据渲染任务切分时记录的用户标识、每个渲染部分的标识和执行渲染操作的逻辑设备标识,将获取的当前用户的一帧游戏画面的多片游戏画面合并为一个完整的一帧游戏画面输出。
在一个游戏进程中为一个或多个用户执行渲染程序时,游戏进程运行在云服务器上,云服务器的物理主机上存在多张物理显卡,多张物理显卡通过显卡驱动程序管理,游戏进程通过显卡驱动程序和图形api识别物理显卡,并通过图形api可以将每个物理设备抽象成多个逻辑设备,并为每个逻辑设备对应创建一个渲染器,每个渲染器拥有的相对独立的显卡资源,每个渲染器对应一个输出设备用于输出和展示渲染结果。
具体的工作流程为:
(1)游戏进程开始,初始化游戏进程,初始化vulkanapi,识别物理主机上的所有物理显卡,并记录;
(2)初始化公共资源管理器;
(3)根据收到渲染任务(如加入一个用户),创建渲染部分,为渲染部分创建逻辑设备,并为渲染部分分配的逻辑设备创建渲染资源管理器、渲染器、输出设备交换链;
(4)渲染器执行渲染任务;
(5)渲染结束(如用户退出),销毁渲染部分,销毁分配的逻辑设备;
(6)进程结束,销毁公共渲染资源管理器,销毁vulkan对象。
本发明的方法可被封装成为一个具有多显卡调用能力的图形api库,开发者可以通过使用提供的api就可以在单个进程内使用一张或多张显卡进行图形渲染。单个进程可以使用多张显卡同时工作,即便是单个进程,也能充分使用多显卡资源;在一张显卡无法流畅渲染的复杂场景,可以依靠多张显卡的渲染能力,达到更高的帧率;而且还能把显卡的剩余计算力利用起来,减少浪费。
本发明实施例的一种基于多显卡的游戏画面渲染系统,如图4所示,该系统包括识别单元、任务切分单元、显卡分配单元、渲染单元和输出单元。识别单元用于识别物理主机上的m个物理显卡,其中,m为大于1的整数;任务切分单元用于确定渲染任务并切分为至少一个渲染部分;显卡分配单元用于根据所述至少一个渲染部分确定目标物理显卡,其中,所述目标物理显卡为所述m个物理显卡中的一个或多个;渲染单元用于通过所述目标物理显卡对所述至少一个渲染部分进行渲染;输出单元,用于输出渲染结果。
即,本领域技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本公开的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
此外,本领域普通技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
起点商标作为专业知识产权交易平台,可以帮助大家解决很多问题,如果大家想要了解更多知产交易信息请点击 【在线咨询】或添加微信 【19522093243】与客服一对一沟通,为大家解决相关问题。
此文章来源于网络,如有侵权,请联系删除