【问题标题】:Exiting the SharpDX RenderLoop退出 SharpDX 渲染循环
【发布时间】:2012-04-05 14:15:46
【问题描述】:

SharpDX 有一个RenderLoop,它在渲染循环中运行给定的委托:

RenderLoop.Run(m_RenderForm, () =>
{
    // Do stuff here to render things...
}

我需要做的是以某种方式退出渲染循环。

RenderLoop.Run(m_RenderForm, () =>
{
    if (DoINeedToQuit() == true)
    {
        // What do I put here?
    }
}

我不能只return,因为那只会结束当前循环迭代。

【问题讨论】:

    标签: c# sharpdx


    【解决方案1】:

    由于我也遇到了这个问题,所以我查看了SharpDX的源代码并找到了解决方案。

    下面是Run方法的源码:

    public static void Run(Control form, RenderCallback renderCallback, bool useApplicationDoEvents = false)
    {
        if (form == null)
            throw new ArgumentNullException("form");
        if (renderCallback == null)
            throw new ArgumentNullException("renderCallback");
        form.Show();
        using (var renderLoop = new RenderLoop(form) { UseApplicationDoEvents = useApplicationDoEvents })
            while (renderLoop.NextFrame())
                renderCallback();
    }
    

    while 中有条件继续;修改那个条件就足够了。您可能希望使用以下代码创建一个静态类:

    private static bool mExitLoop = false;
    
    public static void Run(Control form, RenderCallback renderCallback, bool useApplicationDoEvents = false)
    {
        if (form is null)
            throw new ArgumentNullException(nameof(form));
    
        if (renderCallback is null)
            throw new ArgumentNullException(nameof(renderCallback));
    
        Contract.EndContractBlock();
    
        form.Show();
    
        using (var renderLoop = new RenderLoop(form) { UseApplicationDoEvents = useApplicationDoEvents })
        {
            while (renderLoop.NextFrame() && !mExitLoop)
                renderCallback();
        }
    
        mExitLoop = false;
    }
    
    public static void ExitLoop()
    {
        mExitLoop = true;
    }
    

    【讨论】:

      【解决方案2】:

      你可以丢弃它:

      myDXControl.Dispose();
      

      释放控件会导致渲染循环停止。要重新启动循环,请确保已将其处理为myDXControl.IsDisposed,然后重新初始化控件并重新启动循环。

      【讨论】:

        【解决方案3】:

        您必须退出应用程序 (Application.Exit)。

        或者,您可以在循环外、循环内完成您想做的工作。

        【讨论】:

          【解决方案4】:

          一种可能的解决方案是销毁RenderLoop 正在渲染的控件。

          例如,

          RenderForm.Close();
          

          【讨论】:

            【解决方案5】:

            正如最初的海报之一所示,循环中的代码相当简单。您调用的函数是为了方便起见,您实际上可以在表单中扮演自己的角色。不需要重新编译库,如果 application.exit 不是您想要的唯一退出触发器,只需在表单中添加一个函数。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-24
              • 1970-01-01
              • 1970-01-01
              • 2013-04-28
              • 1970-01-01
              相关资源
              最近更新 更多