【问题标题】:What should I do if I were to destroy the surface (Form) I intialiy created the device for and...?如果我要破坏我最初创建设备的表面(表格),我该怎么办......?
【发布时间】:2010-02-14 14:20:31
【问题描述】:

假设我有一个基于 SlimDX 的游戏编辑器。我有一个 DeviceContext 实例,它基本上控制设备的所有状态,处理丢失的设备,创建它等。编辑器并不总是在渲染发生的地方打开一个视口。相反,它包含各种编辑器、场景编辑器、纹理查看器/编辑器、动画编辑器、材质编辑器等。

现在假设用户打开了 SceneEditor(一个对话框,其中四个视图呈现到面板中)。当编辑器被实例化时,它会从 DeviceContext 中获取一个引用,如果找到“null”,它会调用 context.CreateDevice(Control ctrl)。此方法“确保”设备不会丢失、无效或处置。如果是这样,它会根据正在发生的事情来处理它。现在编辑器在创建/重置设备时向控件(面板)发送“CreateDevice”方法,该控件是代表 TopLeft 视图的面板。接下来,它从上下文中获取“设备”引用,然后创建它的交换链视图(作为其他三个视口面板)。

现在假设用户打开了 ModelViewer 对话框。这也确保了设备实例不是 'null' ,如果是这样调用 DeviceContext.CreateDevice(ModelViewPanel) 并从中获取设备引用。如果 Device 不为 null,它会为其视图创建一个交换链(模型将在其中渲染)。

好的,所以我们有一个带有四个视图的场景编辑器(TopLeft Panel 是用于创建 Device 对象的控件)和三个其他 Panel 对象创建为交换链。接下来我们有用户打开的 ModelViewer。这有一个作为交换链创建的面板。

我的问题是: 由于场景编辑器拥有最初创建设备实例的控件,如果用户关闭场景编辑器,我该怎么办?我是调用Devi)ce.Reset() 还是使用ModelViewer 的显示参数创建一个“新的”Device()'?

如果有不明白的地方,请重新考虑问题,谢谢。

【问题讨论】:

    标签: c# directx slimdx


    【解决方案1】:

    我的问题是:由于场景编辑器拥有最初创建设备实例的控件,如果用户关闭场景编辑器我该怎么办?我是调用 Dev)ce.Reset() 还是使用 ModelViewer 的显示参数创建一个“新的”Device()'?

    基本上,如果用户破坏了创建设备的控件,您将需要基于新控件(和窗口句柄)制作一个设备。

    由于您已经在使用交换链,因此另一个非常好的选择是制作一个(不可见的)1 像素控件,并使用它来创建您的设备。然后使用交换链创建所有单独的表面。

    当然,这里的优点是您可以在应用程序的整个生命周期内保持 HWND(1 像素控件的句柄)处于活动状态 - 无需再担心用户会破坏您的设备。

    【讨论】:

    • 我已经考虑过了。我只是不想“破解”我的代码结构。由于通过游戏引擎图形框架进行的所有渲染都是抽象的,因此这不是一个可行的选择,但仍有可能。
    • 现在“重新创建”设备。这听起来是最好的选择,也是最干净的。另一个想法是创建一个 50 x 50 的小画布并在其中渲染一个徽标或其他东西。并将其用于我最初的“设备”创建者画布。 PS - 抱歉在这里重复发布:/ ...它不允许我编辑:?
    【解决方案2】:

    您似乎在设计中描述的核心问题是,您有两个不同的类负责同一件事 - 创建一个设备。

    取而代之的是,考虑重构类以将该责任赋予一个单独的类,并在构造时为您的表单提供对该类的引用。

    【讨论】:

    • 您的描述是我在关于 DeviceContext 的问题中给出的确切描述。 DeviceContext 处理与设备相关的所有内容。它是创建、重置、销毁等。它还在内部实现了一个用于处理正在使用的 DirectX 资源的工作系统。
    • 没错,但我仍然在您的个人表单中看到很多设备管理代码。我会尝试让它更活跃,而不是听起来主要是一个存储库。
    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    相关资源
    最近更新 更多