【问题标题】:Stuck on white screen at XNA game startupXNA 游戏启动时卡在白屏
【发布时间】:2011-09-20 04:41:50
【问题描述】:

启动 XNA 游戏时,白屏会快速闪烁。在较慢的机器上,这比在较快的机器上更明显。我们使用 WPF 开发的菜单系统开发游戏套装。此菜单启动我们的 XNA 游戏并将其窗口设置为前景窗口(仅当它本身具有焦点时才有效)

我们遇到的问题是,如果玩家在开始游戏后一直按左键,系统就会卡在这个白屏闪烁中。屏幕保持白色,玩家无法用鼠标退出此屏幕(alt-tab 有效,但不受欢迎)。

如何防止这种情况发生?我确实想将 XNA 游戏设置为前台窗口,因为根据玩家单击的位置,菜单系统可能会保持活动状态。

这是启动 XNA 游戏的菜单系统的代码。

var process = Process.Start(info);
var currentProcess = Process.GetCurrentProcess();
while (!process.HasExited)
{
    Thread.Sleep(50);
    if (GetForegroundWindow() == currentProcess.MainWindowHandle)
    {
        Activate(process.MainWindowHandle);
    }
}

这是将 XNA 游戏设置为前台窗口的代码。

    /// <summary>
    /// Sets the window to be foreground
    /// </summary>
    [DllImport("User32")]
    private static extern int SetForegroundWindow(IntPtr hwnd);

    /// <summary>
    /// Activate or minimize a window
    /// </summary>
    [DllImportAttribute("User32.DLL")]
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    private const int SW_SHOW = 5;
    private const int SW_MINIMIZE = 6;
    private const int SW_RESTORE = 9;

    /// <summary>
    /// The GetForegroundWindow function returns a handle to the foreground window.
    /// </summary>
    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    private static void Activate(IntPtr windowHandle)
    {
        ShowWindow(windowHandle, SW_RESTORE);
        SetForegroundWindow(windowHandle);
    }

谢谢, 沃特

【问题讨论】:

    标签: c# windows xna


    【解决方案1】:

    首先,闪存可能是由于在 XNA 窗口从最小化状态恢复或最初创建设备时发生的 DirectX 设备初始化;有些事件可以捕获这些事件。我不知道您按下左键时在做什么,但我会检查以确保您不会导致另一个设备初始化发生。

    关键事件是GraphicsDeviceManager中包含的事件,尤其是重置事件。确保在设备重置时不处理任何输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多