我正在使用 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 吗?