代码之家  ›  专栏  ›  技术社区  ›  zackery.fix

如果我要破坏我最初为之设计的装置的表面(形状),我该怎么做…?

  •  1
  • zackery.fix  · 技术社区  · 15 年前

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

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

    现在假设一个用户打开ModelViewer对话框。如果这样调用deviceContext.createDevice(modelViewPanel)并从中获取设备引用,则也可以确保设备实例不是“空”。如果设备不为空,它将为其视图创建交换链(模型将在其中呈现)。

    好的,我们有一个场景编辑器,有四个视图(左上角的面板是用来创建设备对象的控件)和另外三个面板对象,它们被创建为交换链。接下来是用户打开的ModelViewer。这有一个面板创建为交换链。

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

    如果有什么不明白,请要求重新考虑这个问题,谢谢。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Reed Copsey    15 年前

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

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

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

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

        2
  •  0
  •   kyoryu    15 年前

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

    与此相反,考虑重构类以将该责任赋予单独的类,并在构造时为窗体提供对该类的引用。