gpt4 book ai didi

c# - 不同线程中的同步 GraphicsDevice

转载 作者:太空宇宙 更新时间:2023-11-03 22:23:37 24 4
gpt4 key购买 nike

我有一个 XNA 应用程序可以在第二台显示器(适配器 1)上呈现,它会定期截取自己的屏幕截图并将其存储为 Texture2D。

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

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

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

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

我怀疑这是因为我的 XNA 类同时使用了硬件,而我正在以错误的方式思考这个问题。但是我找不到任何关于我应该如何正确执行此操作的文档。

如有任何帮助,我们将不胜感激。

最佳答案

如果我没记错的话,您正试图同时在两个不同的显示器上使用两个不同的应用程序(或者更确切地说,两个不同的 GraphicsDevice 对象)进行绘图。

让我们先正确看待事物。

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

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

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

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

GraphicsAdapter 与显示器的关系更近一些,因此我们将其视为类比中的 Canvas 。

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

以编程方式,我们可以为画家及其 Canvas 实例化任意数量的 GraphicsDevice。每个导师都可以告诉画家在不同的 Canvas 上画不同的东西。但是如果两个导​​师让他在同一张 Canvas 上画不同的东西,画家会不会有点困惑?

当然可以。画家一次只能在 Canvas 上执行绘画指令(当然,看起来很肤浅,但足以理解这个概念)。这就是为什么您不能在同一适配器上实例化和访问两个图形设备的原因。每当适配器更改其图形设备(指导器)时,另一个指导器就会“丢失”。意思是,在另一位教练完成之前,他有一段时间没有受到关注,并且教练告诉油漆工的任何内容(例如,使用什么刷子,或者要画什么颜色)都会被遗忘。

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

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

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

关于c# - 不同线程中的同步 GraphicsDevice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2228284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com