DirectX 9.0中的UpdateSurface问题
小弟最近在写一个图像采集卡显示的窗体控件,想用Managed DX9实现,基本思路是在SystemMemory中创建一个Off-Screen Surface,将图像采集卡的数据重采样至此Surface中,屏幕的刷新则用UpdateSurface将此Surface更新至BackBuffer中。程序通常状况运行正常,但是在DeviceLost事件触发后就有问题了。按照MSDN中的说法,SystemMemory中创建的资源在DeviceLost时是不需要re-create的,但实际调试过程中,发现DeviceLost之后,SystemMemory中的Surface对象内容被清空。请教各位大虾是否遇到同样的问题。部分源代码示意如下:
Device device = null;
PresentParameter present = null;
Surface surfMem = null;
Surface surfBack = null;
bool deviceLost = false;
InitializeGraphic()
{
...
present = new PresentParameter();
surfMem = device.CreateOffScreenPlainSurface(..., Pool.SystemMemory);
// for test, fill data from a bitmap file to the surface in memory
...
device.DeviceLost += new System.EventHandler(this.OnDeviceLost);
device.DeviceReset += new System.EventHandler(this.OnDeviceReset);
}
OnDeviceLost()
{
// do nothing
}
OnDeviceReset()
{
// do nothing
}
AttemptRestroeDevice()
{
try
{
TestCooperativeLevel();
}
catch(DeviceLostException)
{
System.Thread.Sleep(50);
}
catch(DeviceNotResetException)
{
device.Reset();
deviceLost = false;
}
}
Render()
{
if (device == null)
return;
if (deviceLost)
AttemptRestroeDevice();
if (deviceLost)
return;
try
{
device.BeginScene();
surfBack = device.GetBackBuffer();
device.UpdateSurface(surfMem, surfBack);
device.EndScene();
device.Present();
}
catch(DevciceLostException)
{
deviceLost = true;
}
}
调试时监视surfMem对象,发现在进入OnDeviceLost时,其内容均正常,一旦离开OnDeviceLost函数后,其内容全部被清空,难道说SystemMemory中的内容也会被清空?不解!