Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有可能多线程调用GPU吗?_C#_Multithreading_Performance_Xna_Gpu - Fatal编程技术网

C# 有可能多线程调用GPU吗?

C# 有可能多线程调用GPU吗?,c#,multithreading,performance,xna,gpu,C#,Multithreading,Performance,Xna,Gpu,我在我的xna游戏中有一个照明系统,它循环通过每个灯光,并将这些灯光添加到包含所有灯光的最终灯光贴图中 创建这些灯光的过程涉及许多与图形设备有关的功能,例如使用效果/着色器和绘图渲染目标,以及使用graphics.device.clear清除渲染目标等 所以我的问题是,是否有可能多线程每个灯?或者这是不可能的,因为只有一个图形设备,并且一次只有一个线程可以使用它?如果可能,它会提高性能吗?基本上不会。XNA中的图形设备是单线程渲染的。您可以从多个线程向GPU发送资源(纹理、顶点缓冲区等)。但是您

我在我的xna游戏中有一个照明系统,它循环通过每个灯光,并将这些灯光添加到包含所有灯光的最终灯光贴图中

创建这些灯光的过程涉及许多与图形设备有关的功能,例如使用效果/着色器和绘图渲染目标,以及使用graphics.device.clear清除渲染目标等


所以我的问题是,是否有可能多线程每个灯?或者这是不可能的,因为只有一个图形设备,并且一次只有一个线程可以使用它?如果可能,它会提高性能吗?

基本上不会。XNA中的
图形设备是单线程渲染的。您可以从多个线程向GPU发送资源(纹理、顶点缓冲区等)。但是您只能从主线程调用
Draw
(以及其他渲染函数,如
Present

我已经成功地通过适当的锁定从多个线程渲染类型。但这看起来像是“坏巫毒”。正如链接的帖子所说:“XNA框架文档在这里没有做出任何承诺”。更不用说:即使是正确锁定也很棘手

我真的不确定是否要制作多个图形设备——我自己也没有试过。我认为这是可能的,但是你不能在设备之间共享资源,这使得它毫无用处。可能不值得这么做

正如jalf在对你的问题的评论中提到的——一旦你进入GPU,一切都已经并行处理了。因此,这只有在您由于点击而受到CPU限制时才有用(因为几乎所有不是批处理的内容都可以移动到另一个线程)。在这种情况下,在尝试这样一个疯狂的计划之前,首先要考虑的是要减少批次的数量。(你已经衡量了你的表现,对吗?)


听起来您可能正在尝试将相当复杂的场景渲染到背景中的渲染目标,并将负载分散到多个帧上。在这种情况下,如果性能要求要求,您可能可以在主线程上跨多个帧进行渲染,手动安排渲染时间。不要忘记设置
RenderTargetUsage。保留内容
,这样每次将其放在图形设备上时它不会被清除。

GPU所做的一切都已经在数百个线程上并行化了。在编程GPU时,不要考虑CPU线程。但是在XNA编程中,您已经将图形设备设置为目标rendertarget,并且您绘制的所有内容都指向该目标,这意味着您的GPU所做的所有事情都指向该目标。执行我想要的操作的过程包括使用多个渲染目标并多次更改图形设备目标,因此,如果我在此过程中创建多个线程,它们会相互干扰吗?