Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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# 同步图形设备&x27;它在不同的线程中_C#_Xna - Fatal编程技术网

C# 同步图形设备&x27;它在不同的线程中

C# 同步图形设备&x27;它在不同的线程中,c#,xna,C#,Xna,我有一个XNA应用程序,它可以在第二个监视器(适配器1)上渲染,每隔一段时间它会自动截图并将其存储为纹理2D 此应用程序启动时,还会显示一个带有面板的Windows窗体。该面板应该由单独的图形设备绘制,并显示纹理2D 我遇到的问题是,在Windows窗体中运行此代码以创建GraphicsDevice时: mainDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, panel1.Handl

我有一个XNA应用程序,它可以在第二个监视器(适配器1)上渲染,每隔一段时间它会自动截图并将其存储为纹理2D

此应用程序启动时,还会显示一个带有面板的Windows窗体。该面板应该由单独的图形设备绘制,并显示纹理2D

我遇到的问题是,在Windows窗体中运行此代码以创建GraphicsDevice时:

mainDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, panel1.Handle, pp);
我有一个魔鬼的例外。本例中的标准建议是捕获异常,让线程休眠几秒钟,然后重试,但这只会让我陷入无限循环

我怀疑这是因为我的XNA类同时在使用硬件,而我的想法是错误的。但我找不到任何关于如何正确操作的文档


任何帮助都将不胜感激。

我希望我错了,因为那样会很酷。但我不相信XNA API允许您使用双图形设备同时在两个单独的监视器上进行渲染。

我希望我错了,因为这样会很酷。但我不相信XNA API允许您使用双图形设备同时渲染到两个单独的监视器上。

图形设备是一个物理设备,而不是连接到窗口的东西。如果有两个物理设备,则可以使用不同的GraphicsAdapter(不是默认值)实例化另一个GraphicsDevice

如果您不打算给设备增加太多负载,或者其中一个设备不需要太多硬件加速,那么您可以创建一个软件设备。功能可能类似,但速度会慢得多


除此之外,我唯一能想到的是看看XNA是否支持命令缓冲区(我不确定它是否支持),并自己管理锁定/解锁设备。

GraphicsDevice是一个物理设备,而不是连接到窗口的设备。如果有两个物理设备,则可以使用不同的GraphicsAdapter(不是默认值)实例化另一个GraphicsDevice

如果您不打算给设备增加太多负载,或者其中一个设备不需要太多硬件加速,那么您可以创建一个软件设备。功能可能类似,但速度会慢得多


除此之外,我唯一能想到的是看看XNA是否支持命令缓冲区(我不确定它是否支持),并自己管理锁定/解锁设备。

如果我没有错,您正在尝试同时使用两个不同的应用程序在两个不同的监视器上绘图(或者,更确切地说,是两个不同的图形设备对象)

让我们先正确看待事物

实际上,你有一个显卡和一个显示器。当然,大多数视频交互平台,如DirectX、OpenGL、XNA等,主要在显卡上执行,而不是在处理器上执行,对吗

现在,在基于编程的概念中,我们有GraphicsDevice类和GraphicsAdapter类。听起来不错吧

尽管GraphicsDevice和Videocart、GraphicsAdapter和监视器之间没有确切的相关性,但这些对象之间的关系非常密切

GraphicsDevice实际上并不代表一张视频卡(尽管Jeff用一种非常简单的方式让它变得易懂)。GraphicsDevice对象是一个与视频卡交互的对象。类似地,我们可以认为GraphicsDevice对象是一个指示画家(视频卡)的绘画指导员在哪里和画什么。它的设计是为了指挥如何完成这些任务

GraphicsAdapter与监视器的关系更为密切,因此我们将在类比中将其视为画布

现在让我们看看。想象一下,我们的画师拥有与显卡支持的图形适配器一样多的手臂。这意味着它可以同时绘制尽可能多的画布

通过编程,我们可以为画家及其画布实例化我们想要的任意多个图形设备。每个讲师都可以告诉画家在不同的画布上绘制不同的东西。但是如果两个讲师告诉画家在同一画布上绘制不同的东西,画家会不会有点困惑

当然会。画家一次只能在画布上执行绘画指令(当然,看得很肤浅,但足以理解概念)。这就是为什么不能在同一适配器上实例化和访问两个图形设备。每当适配器更改其图形设备时(讲师)也就是说,在另一位老师讲完之前,他有一段时间都不会被注意到,而老师告诉油漆工的任何事情(比如,用什么刷子,或涂什么颜色)都会被忘记

因此,GraphicsDevice是一个“LostDevice”。因此,当您让另一个应用程序在适配器上绘图时,该显卡和适配器的任何设备(最近创建的或未创建的)都将丢失,直到另一个应用程序释放真正的设备(显卡)

一个适配器上只能同时执行一个GraphicsDevice


正如Jeff所说,在创建其他GraphicsDevice时使用另一个适配器(监视器)。如果您希望在同一个监视器上绘图,另一个选项是协调两个应用程序的操作。另一个选项是将所有内容都设置为窗口,因为当“窗口化”时,操作系统拥有该设备,这意味着它将是负责组合应用程序绘图的操作系统。(它的问题,不是你的)

如果我没有错的话,你试图同时在两个不同的监视器上绘制两个不同的应用程序(或者更确切地说,两个不同的图形设备对象)

让我们先正确看待事物

当然,你有一张显卡和一个显示器