Opbygning af Managed Direct3D fullscreen app
Er ved at rive håret af mig selv..Hvordan opbygges et gameloop i en fullscreen-app
med Managed Direct3D og C#, så det tager højde for
DeviceLostExceptions osv.
Har selv konstrueret nedenstående forslag, hvilket
virker udmærket, bortset fra når app'en minimeres
og derefter maksimeres igen. Så kommer der en fejlmedling
med unhandled DeviceLostException..
Synes selv, det burde virke. Men det gør det ikke..
Hvorfor?
using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
namespace D3DTest
{
public class Prog : Form
{
Device device;
PresentParameters presentParams;
bool deviceLost;
bool appRunning;
public void InitGfx()
{
presentParams = new PresentParameters();
presentParams.Windowed = false;
presentParams.SwapEffect = SwapEffect.Discard;
presentParams.BackBufferFormat = Manager.Adapters[0].CurrentDisplayMode.Format;
presentParams.BackBufferWidth = 800;
presentParams.BackBufferHeight = 600;
device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
appRunning = true;
}
public void MainLoop()
{
while (appRunning)
{
Application.DoEvents();
if (deviceLost)
{
try
{
device.TestCooperativeLevel();
}
catch (DeviceLostException)
{
}
catch (DeviceNotResetException)
{
device.Reset(presentParams);
deviceLost = false;
}
continue;
}
device.Clear(ClearFlags.Target, Color.PowderBlue, 1.0f, 0);
try
{
device.Present();
}
catch (DeviceLostException)
{
deviceLost = true;
}
}
}
static void Main()
{
Prog p = new Prog();
p.Show();
p.InitGfx();
p.MainLoop();
}
protected override void OnKeyUp(KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
appRunning = false;
}
}
}
