正在退出SharpDX RenderLoop

本文关键字:RenderLoop SharpDX 退出 | 更新日期: 2023-09-27 18:30:03

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,因为这只会结束当前循环迭代。

正在退出SharpDX RenderLoop

由于我也遇到了这个问题,我查看了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;
}

您可以处理它:

myDXControl.Dispose();

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

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

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

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

例如,

RenderForm.Close();

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