在winforms控件上绘制xna时的乱码图形

时间:2009-08-31 13:19:04

标签: winforms performance xna

我正在使用以下代码在winforms控件上绘制xna项目:

this.GraphicsDevice.Present(MainForm.GamePanelHandle);

此winforms控件放在最大化的Form上,使用以下代码隐藏任务栏:

this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;

不幸的是,这使得xna代码运行不断,而不是让xna创建自己的窗口并将其设置为全屏。据我了解这是因为显卡需要注意整个窗口系统和其他活动形式。

在全屏winforms表单中嵌入时,是否有任何技巧可以让xna运行得更快?

2 个答案:

答案 0 :(得分:1)

您是否尝试过设置:

DoubleBuffered = true;

在表单的加载处理程序中?

这至少会有助于表格的绘画。我不确定它是否会对XNA产生影响,但值得一试。

答案 1 :(得分:0)

如果您正在显示最大化的表单甚至隐藏任务栏,为什么不进入真正的全屏模式?通过使用看起来像全屏的窗口模式,您获得了什么?你肯定会通过这样做来降低你的帧率。

根据我的经验,当窗口(XNA控件)只是整个窗体的一小部分时,窗口模式效果最佳。这实际上是窗口模式的要点,因为它允许您同时与其他标准表单控件进行交互。

进入全屏模式可让您的应用程序独家访问视频帧缓冲区 并避免在窗口模式下处理Windows GDI / GDI +的开销。

此外,如果您使用集成显卡(即功能不强),您将需要每个GPU和CPU处理周期。

如果你必须坚持窗口模式,我发现窗口越小,性能越好。在窗口模式下,减小窗口大小会对帧速率产生很大影响,因为降低了显示场景的复杂性。

您还可以考虑将应用程序的进程优先级设置为AboveNormal或甚至High。请注意,执行此操作会导致其他应用程序在应用程序运行时响应速度变慢。为避免系统不稳定,建议避免使用RealTime。

在.NET中,这可以使用进程上的Process.PriorityClass属性来完成:

// Set the current application (process) priority to high.
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;