正在退出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的源代码并找到了解决方案。
以下是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不是您想要的唯一退出触发器的情况下向表单中添加一个函数即可。