2010-02-09 73 views
1

我有一个XNA应用程序呈现到第二个监视器(适配器1),定期它会自己截图并将其存储为Texture2D。同时GraphicsDevice在不同的线程

随着此应用程序启动,它还显示一个带有面板的Windows窗体。该面板应该由独立的GraphicsDevice绘制,并显示Texture2D。

我遇到的问题是,正如我在Windows窗体运行该代码创建的GraphicsDevice:

mainDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, panel1.Handle, pp); 

我得到一个DeviceLostException。这种情况下的标准建议是捕捉异常,让线程休眠几秒钟然后重试,但这只会让我陷入无限循环。

我怀疑这是因为我的XNA类在同一时间使用硬件,而我正在考虑这是错误的方式。但是我无法找到任何关于如何正确执行此操作的文档。

任何帮助将不胜感激。

回答

1

GraphicsDevice是一个物理设备,不是附加到窗口的东西。如果您有两个物理设备,则可以使用不同的GraphicsAdapter(不是默认设置)实例化另一个GraphicsDevice。

如果您不打算在设备上施加太多负载,或者其中一个不需要大量硬件加速,则可以改为创建软件设备。这些功能可能相似,但会变慢很多。

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

0

我希望我错了,因为它会很酷。但我不相信XNA API允许您使用双重图形设备一次渲染到两个独立的显示器上。

3

如果我没有错,您试图在两个不同的显示器上同时绘制两个不同的应用程序(或者更好地放置两个不同的GraphicsDevice对象)。

让我们先看看正确的东西。

物理上你有一个显示卡和一个显示器。当然,大多数视频交互平台,比如DirectX,OpenGL,XNA等主要在视频卡上播放,而不是处理器,对吧?

现在,在基于编程的概念中,我们有GraphicsDevice类和GraphicsAdapter类。铃响了吗?

虽然GraphicsDevice和Videocart以及GraphicsAdapter和监视器之间没有确切的关联,但这些对象之间存在非常密切的关系。

GraphicsDevice实际上并不代表一个显示卡(尽管Jeff用一种非常简单的方式使其可以理解)。 GraphicsDevice对象是与视频卡的INTERACTOR。类似地,我们可以认为GraphicsDevice对象是一个绘画教师,指示绘画师(视频卡)在哪里绘画。它旨在指导如何完成这些任务。

GraphicsAdapter与监视器的关系稍微靠近一点,所以我们将在我们的比喻中看到它作为画布。

现在让我们来看看。想象一下,我们的绘画师拥有与Videocard支持的GraphicsAdapters一样多的武器。这意味着它可以在同一时间绘制尽可能多的画布。

以编程方式,我们可以为painter及其画布实例化尽可能多的GraphicsDevice。每位教师都可以告诉绘画师在不同的画布上绘制不同的东西。但是,如果两位导师告诉他在同一张画布上绘制不同的东西,画家会不会有点困惑?

当然会。画家一次只能在画布上进行绘画指导(当然,这看起来非常肤浅,但足以理解这个概念)。这就是为什么你不能在同一个适配器上实例化和访问两个图形设备的原因。只要适配器更改其图形设备(教师),其他教师就会“丢失”。意思是说,他在一段时间内没有注意到,直到另一位老师完成了,无论教师告诉画家(比如,使用什么画笔,画什么颜色)都会被遗忘。

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

只有一个GraphicsDevice可以在一个适配器上同时执行。

正如Jeff所说,在创建其他GraphicsDevice时使用其他适配器(显示器)。另一种选择是协调这两个应用程序的操作,如果您希望绘制到同一个显示器上。其他选项是,你把所有的东西都放在窗口中,因为当事情“窗口化”时,操作系统拥有设备,这意味着操作系统负责组合应用程序的绘图。 (它的问题,不是你的)