1

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

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

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

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

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

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

4

2 回答 2

1

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

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

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

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

于 2010-02-14T06:06:28.327 回答
0

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

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

于 2010-02-14T06:20:31.697 回答