如果我要破坏表面(表格)我该怎么办?我实际上为...创建了设备?

时间:2010-02-14 06:03:38

标签: c# directx slimdx

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

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

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

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

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

如果不理解某些事情,请要求重新考虑问题,谢谢。

2 个答案:

答案 0 :(得分:2)

  

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

基本上,如果用户销毁了创建设备的控件,则需要根据新控件(和窗口句柄)创建 new 设备。

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

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

答案 1 :(得分:0)

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

除此之外,考虑重构类以将该责任赋予单独的类,并在构造时为表单提供对该类的引用。