2

我正在使用 SlimDX 和 Direct3D9 类来创建 C# 游戏引擎。

一年前我开始使用它,我记得我成功并安全地设法捕获丢失的设备并重置它们(在 Windows 7 上)。现在(在 Windows 8 上)我再次开始处理它,但看起来我无论如何都不会捕获丢失的设备,尤其是在 Ctrl+Alt+Del 的情况下。

这是之前的工作代码:“IsDeviceLost”方法在 Ctrl+Alt+Del 时错误地返回 false,因此设备即将出现,但它崩溃到 Direct3D9Exception:“D3DERR_DEVICELOST”:

    public void Update(float time)
    {
        if (!IsDeviceLost(true))
        {
            _device.Present();
        }
    }

    private bool IsDeviceLost(bool resetIfNeeded)
    {
        bool deviceLost = false;

        // Check if DeviceLost is detected
        Result result = _device.TestCooperativeLevel();
        if (result == ResultCode.DeviceLost)
        {
            Log.Write(LogType.Warning, "Direct3D9Manager: Device lost and cannot be reset yet.");
            // Device has been lost and cannot be reset yet
            deviceLost = true;
        }
        else if (result == ResultCode.DeviceNotReset)
        {
            Log.Write(LogType.Information, "Direct3D9Manager: ResultCode.DeviceNotReset");
            // Device is available again but has not yet been reset
            if (resetIfNeeded)
            {
                // Reset device and check if it can work again
                _device.Reset(_presentParams);
                deviceLost = IsDeviceLost(false);
                if (deviceLost)
                {
                    // Reset failed, device still lost
                }
                else
                {
                    // Reset successful, device restored
                    // TODO: Reload textures and render states which are lost after a reset
                }
            }
            else
            {
                deviceLost = true;
            }
        }

        return deviceLost;
    }

所以我在网上研究了这个问题,发现了几个代码,将更新代码放入 try-catch 块的 try 部分,但我不确定这是否是解决这个问题的正确方法。

  • 对于每帧调用的游戏引擎中的 Update 方法,try-catch 不是很慢吗?
  • 难道没有更好的方法来捕捉丢失的设备,而不是使用 try-catch 吗?
4

0 回答 0