一种控制CPU线程和GPU线程同步的方法及装置与流程

文档序号:12034448阅读:602来源:国知局
一种控制CPU线程和GPU线程同步的方法及装置与流程

本发明涉图像处理技术领域,尤其涉及一种控制cpu线程和gpu线程同步的方法及装置。



背景技术:

当程序运行的指令运行在cpu(centralprocessingunit,中央处理器)中时,只要上一条指令运行完,就可以判定该任务执行完成,然后即可进行后面的任务。但是,当指令运行在gpu(graphicsprocessingunit,图形处理器)中时,在某些情况下,可能需要明确的知道运行在gpu中的指令是否完成,若确定已完成,再进行后面的任务。

在direct3d9到direct3d11的图形开发api(applicationprograminterface,应用编程接口)中,显示函数都是同步的,也就是说,cpu会等到gpu将绘制指令执行完成后才返回。

但是,到了direct3d12,显示函数是异步的,也就是说,cpu线程和gpu线程不同步,cpu不会等到gpu执行完成后才返回,而是直接就返回了。这样就造成了一个很大的问题,那就是程序逻辑与程序画面的不同步。例如:在运行游戏程序时,游戏逻辑已经到了t2时刻,而屏幕上显示出来的游戏画面还是先前的t1时刻的内容。



技术实现要素:

本申请实施例通过提供一种控制cpu线程和gpu线程同步的方法及装置,解决了现有技术中,在direct3d12上存在的程序逻辑与程序画面难以同步的技术问题,实现了在direct3d12上程序逻辑与程序画面同步的技术效果。

第一方面,本申请通过本申请的一实施例提供如下技术方案:

一种控制cpu线程和gpu线程同步的方法,包括:

在gpu进行图像帧渲染时,为gpu线程创建gpu栅栏,所述gpu栅栏的初始状态为关闭状态;

为cpu线程创建信号事件,所述信号事件的初始状态为无信号状态;

将所述gpu栅栏和所述信号事件进行绑定;

调用预设函数将所述cpu线程挂起,并等待所述信号事件变为有信号状态;

在所述gpu完成对所述图像帧的渲染时,将所述gpu栅栏打开,并将所述信号事件设置为所述有信号状态,从而通过所述预设函数将所述cpu线程唤醒。

优选地,所述为gpu线程创建gpu栅栏,包括:

调用createfence函数,为所述gpu线程创建所述gpu栅栏。

优选地,所述为cpu线程创建信号事件,包括:

调用createevent函数,为所述cpu线程创建所述信号事件。

优选地,所述将所述gpu栅栏和所述信号事件进行绑定,包括:

创建一帧计数器,其中,所述帧计数器用于统计所述gpu完成渲染的图像祯的数量;

将所述帧计数器和所述信号事件设置到所述gpu栅栏的完成事件中。

优选地,所述调用一预设函数将所述cpu线程挂起,并等待所述信号事件变为有信号状态,包括:

调用waitforsingleobject函数,将所述cpu线程挂起,并等待所述信号事件变为有信号状态。

优选地,所述在所述gpu完成对所述图像帧的渲染时,将所述gpu栅栏打开,包括:

在所述帧计数器的计数值加1时,调用signal函数,将所述gpu栅栏打开。

优选地,所述将所述信号事件设置为所述有信号状态,包括:

调用setevent函数,将所述信号事件设置为所述有信号状态。

第二方面,本申请通过本申请的一实施例提供如下技术方案:

一种控制cpu线程和gpu线程同步的装置,其特征在于,包括:

第一创建单元,用于在gpu进行图像帧渲染时,为gpu线程创建gpu栅栏,所述gpu栅栏的初始状态为关闭状态;

第二创建单元,用于为cpu线程创建信号事件,所述信号事件的初始状态为无信号状态;

绑定单元,用于将所述gpu栅栏和所述信号事件进行绑定;

调用单元,用于调用预设函数将所述cpu线程挂起,并等待所述信号事件变为有信号状态;

打开单元,用于在所述gpu完成对所述图像帧的渲染时,将所述gpu栅栏打开,并将所述信号事件设置为所述有信号状态,从而通过所述预设函数将所述cpu线程唤醒。

第三方面,本申请通过本申请的一实施例提供如下技术方案:

一种控制cpu线程和gpu线程同步的装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:

在gpu进行图像帧渲染时,为gpu线程创建gpu栅栏,所述gpu栅栏的初始状态为关闭状态;为cpu线程创建信号事件,所述信号事件的初始状态为无信号状态;将所述gpu栅栏和所述信号事件进行绑定;调用预设函数将所述cpu线程挂起,并等待所述信号事件变为有信号状态;在所述gpu完成对所述图像帧的渲染时,将所述gpu栅栏打开,并将所述信号事件设置为所述有信号状态,从而通过所述预设函数将所述cpu线程唤醒。

第四方面,本申请通过本申请的一实施例提供如下技术方案:

一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:

在gpu进行图像帧渲染时,为gpu线程创建gpu栅栏,所述gpu栅栏的初始状态为关闭状态;为cpu线程创建信号事件,所述信号事件的初始状态为无信号状态;将所述gpu栅栏和所述信号事件进行绑定;调用预设函数将所述cpu线程挂起,并等待所述信号事件变为有信号状态;在所述gpu完成对所述图像帧的渲染时,将所述gpu栅栏打开,并将所述信号事件设置为所述有信号状态,从而通过所述预设函数将所述cpu线程唤醒。

本申请实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:

在本申请实施例中,公开了一种控制cpu线程和gpu线程同步的方法,包括:在gpu进行图像帧渲染时,为gpu线程创建gpu栅栏,所述gpu栅栏的初始状态为关闭状态;为cpu线程创建信号事件,所述信号事件的初始状态为无信号状态;将所述gpu栅栏和所述信号事件进行绑定;调用预设函数将所述cpu线程挂起,并等待所述信号事件变为有信号状态;在所述gpu完成对所述图像帧的渲染时,将所述gpu栅栏打开,并将所述信号事件设置为所述有信号状态,从而通过所述预设函数将所述cpu线程唤醒。由于保证了cpu线程和gpu线程的同步,所以解决了现有技术中在direct3d12上存在的程序逻辑与程序画面难以同步的技术问题,实现了在direct3d12上程序逻辑与程序画面同步的技术效果。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。

图1为本申请实施例中一种控制cpu线程和gpu线程同步的方法的流程图;

图2为本申请实施例中一种控制cpu线程和gpu线程同步的装置的结构图;

图3为本申请实施例中一种控制cpu线程和gpu线程同步的装置的结构图;

图4为本申请实施例中一种计算机可读存储介质的结构图。

具体实施方式

本申请实施例通过提供一种控制cpu线程和gpu线程同步的方法及装置,解决了现有技术中,在direct3d12上存在的程序逻辑与程序画面难以同步的技术问题,实现了在direct3d12上程序逻辑与程序画面同步的技术效果。

本申请实施例的技术方案为解决上述技术问题,总体思路如下:

一种控制cpu线程和gpu线程同步的方法,包括:在gpu进行图像帧渲染时,为gpu线程创建gpu栅栏,所述gpu栅栏的初始状态为关闭状态;为cpu线程创建信号事件,所述信号事件的初始状态为无信号状态;将所述gpu栅栏和所述信号事件进行绑定;调用预设函数将所述cpu线程挂起,并等待所述信号事件变为有信号状态;在所述gpu完成对所述图像帧的渲染时,将所述gpu栅栏打开,并将所述信号事件设置为所述有信号状态,从而通过所述预设函数将所述cpu线程唤醒。

为了更好的理解上述技术方案,下面将结合说明书附图以及具体的实施方式对上述技术方案进行详细的说明。

实施例一

本实施例提供了一种控制cpu线程和gpu线程同步的方法,应用于终端设备中,所述终端设备可以是pc(personalcomputer,个人电脑)、或智能手机、或平板电脑、或智能电视、等等,此处,对于所述终端设备具体是何种设备,本实施例不做具体限定。

如图1所示,所述控制cpu线程和gpu线程同步的方法,包括:

步骤s101:在gpu进行图像帧渲染时,为gpu线程创建gpu栅栏,gpu栅栏的初始状态为关闭状态。

所谓栅栏,就是一个隔离器,在正常情况下,栅栏是关闭的,这样其它任务是不能进入到栅栏里面的,只有当满足一定的条件后,栅栏才会打开,其它任务才可以进入到栅栏内部。同理,gpu栅栏也是这样的原理,当gpu栅栏被关闭时,gpu将不允许gpu线程访问,gpu线程将会被挂起,只有当gpu栅栏被打开时,gpu线程才会被唤醒,从而继续执行绘制渲染指令。

在具体实施过程中,在gpu进行图像帧渲染时,可以为gpu线程创建一个gpu栅栏,gpu栅栏的初始状态为关闭状态,这样,gpu线程被挂起,gpu只能对当前图像祯进行渲染,而其它任务不会进入gpu栅栏,gpu不会去执行其它任务。

作为一种可选的实施例,所述为gpu线程创建gpu栅栏,包括:调用createfence函数,为gpu线程创建一gpu栅栏。

在具体实施过程中,可以调用id3d12device接口中的createfence函数,来创建id3d12fence接口,id3d12fence接口是一个物理显卡的抽象,在direct3d12中用来表示gpu栅栏的接口,其中,id3d12fence接口中的signal函数可以用来打开gpu栅栏。

步骤s102:为cpu线程创建信号事件,信号事件的初始状态为无信号状态。

在windows操作系统上,有一种内核对象叫做事件对象event,用于线程的同步与互斥。事件对象通常有两种状态,一种是有信号状态,一种是无信号状态。当一个cpu线程去等待一个有信号状态的事件时,等待条件得到满足,该线程会继续执行不会阻塞;而当一个线程去等待一个无信号状态的事件时,等待条件得不到满足,该cpu线程不会继续执行,并且会被系统的线程调度程序剥夺执行权,只有当该等待的事件变为有信号状态时,该线程才会被唤醒,从而继续执行。在本实施例中,在direct3d12中,cpu与gpu的同步就是依靠这种机制来实现的。

作为一种可选的实施例,步骤s102,包括:调用createevent函数,为cpu线程创建一信号事件。

在具体实施过程中,可以调用windows系统中的api函数createevent函数,来创建一个无信号状态的信号事件hcpuevent。

步骤s103:将gpu栅栏和信号事件进行绑定。

作为一种可选的实施例,步骤s103,包括:

创建一帧计数器,其中,该帧计数器用于统计gpu完成渲染的图像祯的数量;将该帧计数器和信号事件设置到gpu栅栏的完成事件中。

在具体实施过程中,由于事件信号与gpu栅栏是绑定在一起的,gpu可以根据当前的渲染帧索引来判断当前帧是否渲染完成。所以,可以创建一个索引计数器(即:帧计数器)framecount,其初始值为1,gpu每渲染完成一帧,该值加1。

在具体实施过程中,可以基于id3d12fence接口中的seteventoncompletion函数,将帧计数器framecount和信号事件hcpuevent设置到gpu栅栏的完成事件中。在当前帧渲染完成后,gpu栅栏会将hcpuevent事件设定为有信号状态。

步骤s104:调用预设函数将cpu线程挂起,并等待信号事件变为有信号状态。

作为一种可选的实施例,步骤s104,包括:调用waitforsingleobject函数,将cpu线程挂起,并等待信号事件变为有信号状态。

在具体实施过程中,可以调用系统的waitforsingleobject函数,来等待信号事件hcpuevent变为有信号状态,当信号事件hcpuevent变成有信号状态之前,该cpu线程将会一直阻塞。

步骤s105:在gpu完成对图像帧的渲染时,将gpu栅栏打开,并将信号事件设置为有信号状态,从而通过预设函数将cpu线程唤醒。

作为一种可选的实施例,所述在gpu完成对图像帧的渲染时,将gpu栅栏打开,包括:在帧计数器的计数值加1时,调用signal函数,将gpu栅栏打开。

在具体实施过程中,在通过帧计数器确定gpu已完成对当前帧的渲染时,可以调用id3d12fence接口中的signal函数,将gpu栅栏打开。

作为一种可选的实施例,所述将信号事件设置为有信号状态,包括:调用setevent函数,将信号事件设置为有信号状态。

在具体实施过程中,因为在步骤s103中通过seteventoncompletion将gpu栅栏和该信号事件绑定在一起,所以当gpu完成对当前帧的渲染后,将会调用系统的setevent函数将信号事件hcpuevent变为有信号状态,从而使得waitforsingleobject函数返回,进而使cpu线程继续运行。这样,便实现了在direct3d12中cpu线程与gpu线程的同步,从而实现了在direct3d12上程序逻辑与程序画面同步的技术效果。

利用本实施例中的控制cpu线程和gpu线程同步的方法,可以开启多线程渲染,从而极大提高游戏的渲染性能,进而解决了从direct3d9到direct3d11时代只能单线程渲染游戏的瓶颈。

上述本申请实施例中的技术方案,至少具有如下的技术效果或优点:

在本申请实施例中,公开了一种控制cpu线程和gpu线程同步的方法,包括:在gpu进行图像帧渲染时,为gpu线程创建gpu栅栏,所述gpu栅栏的初始状态为关闭状态;为cpu线程创建信号事件,所述信号事件的初始状态为无信号状态;将所述gpu栅栏和所述信号事件进行绑定;调用预设函数将所述cpu线程挂起,并等待所述信号事件变为有信号状态;在所述gpu完成对所述图像帧的渲染时,将所述gpu栅栏打开,并将所述信号事件设置为所述有信号状态,从而通过所述预设函数将所述cpu线程唤醒。本申请实施例保证了cpu线程和gpu线程的同步,所以解决了现有技术中在direct3d12上存在的程序逻辑与程序画面难以同步的技术问题,实现了在direct3d12上程序逻辑与程序画面同步的技术效果。

实施例二

如图2所示,本实施例提供了一种控制cpu线程和gpu线程同步的装置200,包括:

第一创建单元201,用于在gpu进行图像帧渲染时,为gpu线程创建gpu栅栏,所述gpu栅栏的初始状态为关闭状态;

第二创建单元202,用于为cpu线程创建信号事件,所述信号事件的初始状态为无信号状态;

绑定单元203,用于将所述gpu栅栏和所述信号事件进行绑定;

调用单元204,用于调用预设函数将所述cpu线程挂起,并等待所述信号事件变为有信号状态;

打开单元205,用于在所述gpu完成对所述图像帧的渲染时,将所述gpu栅栏打开,并将所述信号事件设置为所述有信号状态,从而通过所述预设函数将所述cpu线程唤醒。

作为一种可选的实施例,第一创建单元201,具体用于:调用createfence函数,为所述gpu线程创建所述gpu栅栏。

作为一种可选的实施例,第二创建单元202,具体用于:调用createevent函数,为所述cpu线程创建所述信号事件。

作为一种可选的实施例,绑定单元203,具体用于:创建一帧计数器,其中,所述帧计数器用于统计所述gpu完成渲染的图像祯的数量;将所述帧计数器和所述信号事件设置到所述gpu栅栏的完成事件中。

作为一种可选的实施例,调用单元204,具体用于:调用waitforsingleobject函数,将所述cpu线程挂起,并等待所述信号事件变为有信号状态。

作为一种可选的实施例,打开单元205,具体用于:在所述帧计数器的计数值加1时,调用signal函数,将所述gpu栅栏打开。

作为一种可选的实施例,打开单元205,具体用于:调用setevent函数,将所述信号事件设置为所述有信号状态。

由于本实施例所介绍的控制cpu线程和gpu线程同步的装置为实施本申请实施例中控制cpu线程和gpu线程同步的方法所采用的装置,故而基于本申请实施例中所介绍的控制cpu线程和gpu线程同步的方法,本领域所属技术人员能够了解本实施例的控制cpu线程和gpu线程同步的装置的具体实施方式以及其各种变化形式,所以在此对于该控制cpu线程和gpu线程同步的装置如何实现本申请实施例中的方法不再详细介绍。只要本领域所属技术人员实施本申请实施例中信息控制cpu线程和gpu线程同步的方法所采用的装置,都属于本申请所欲保护的范围。

上述本申请实施例中的技术方案,至少具有如下的技术效果或优点:

在本申请实施例中,公开了一种控制cpu线程和gpu线程同步的装置200,包括:第一创建单元,用于在gpu进行图像帧渲染时,为gpu线程创建gpu栅栏,所述gpu栅栏的初始状态为关闭状态;第二创建单元,用于为cpu线程创建信号事件,所述信号事件的初始状态为无信号状态;绑定单元,用于将所述gpu栅栏和所述信号事件进行绑定;调用单元,用于调用预设函数将所述cpu线程挂起,并等待所述信号事件变为有信号状态;打开单元,用于在所述gpu完成对所述图像帧的渲染时,将所述gpu栅栏打开,并将所述信号事件设置为所述有信号状态,从而通过所述预设函数将所述cpu线程唤醒。本申请实施例保证了cpu线程和gpu线程的同步,所以解决了现有技术中在direct3d12上存在的程序逻辑与程序画面难以同步的技术问题,实现了在direct3d12上程序逻辑与程序画面同步的技术效果。

实施例三

如图3所示,本实施例提供了一种控制cpu线程和gpu线程同步的装置300,包括存储器310、处理器320及存储在存储器310上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:

在gpu进行图像帧渲染时,为gpu线程创建gpu栅栏,所述gpu栅栏的初始状态为关闭状态;为cpu线程创建信号事件,所述信号事件的初始状态为无信号状态;将所述gpu栅栏和所述信号事件进行绑定;调用预设函数将所述cpu线程挂起,并等待所述信号事件变为有信号状态;在所述gpu完成对所述图像帧的渲染时,将所述gpu栅栏打开,并将所述信号事件设置为所述有信号状态,从而通过所述预设函数将所述cpu线程唤醒。

在具体实施过程中,处理器320执行计算机程序311时,可以实现实施一中的任一实施方式。

实施例四

如图4所示,本实施例提供了一种计算机可读存储介质400,其上存储有计算机程序411,计算机程序411被处理器执行时实现以下步骤:

在gpu进行图像帧渲染时,为gpu线程创建gpu栅栏,所述gpu栅栏的初始状态为关闭状态;为cpu线程创建信号事件,所述信号事件的初始状态为无信号状态;将所述gpu栅栏和所述信号事件进行绑定;调用预设函数将所述cpu线程挂起,并等待所述信号事件变为有信号状态;在所述gpu完成对所述图像帧的渲染时,将所述gpu栅栏打开,并将所述信号事件设置为所述有信号状态,从而通过所述预设函数将所述cpu线程唤醒。

在具体实施过程中,计算机程序411被处理器执行时,可以实现实施一中的任一实施方式。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其它可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其它可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其它可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其它可编程数据处理设备上,使得在计算机或其它可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其它可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1