SlimDX处理窗口大小调整
我正在尝试处理正在调整大小的程序窗口,而我在下面拼凑的代码(我认为效率低下)似乎就起到了作用 有没有更好的方法来实现这一点,最好是在调整窗口大小时不产生口吃,并且不经常使用12-17%的CPU?我还怀疑SlimDX处理窗口大小调整,slimdx,Slimdx,我正在尝试处理正在调整大小的程序窗口,而我在下面拼凑的代码(我认为效率低下)似乎就起到了作用 有没有更好的方法来实现这一点,最好是在调整窗口大小时不产生口吃,并且不经常使用12-17%的CPU?我还怀疑MessagePump.Run可能在form.Resize再次完成设备设置之前运行,并抛出错误 谢谢 using System; using System.Drawing; using System.Windows.Forms; using SlimDX; using SlimDX.Direct
MessagePump.Run
可能在form.Resize
再次完成设备设置之前运行,并抛出错误
谢谢
using System;
using System.Drawing;
using System.Windows.Forms;
using SlimDX;
using SlimDX.Direct3D9;
using SlimDX.Windows;
namespace SlimDX_1
{
struct Vertex
{
public Vector4 Position;
public int Color;
}
static class Program
{
private static VertexBuffer vertices;
private static Device device;
private static RenderForm form;
private static PresentParameters present;
private static VertexDeclaration vertexDecl;
private static VertexElement[] vertexElems;
private static bool wasMinimized = false;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
form = new RenderForm("Tutorial 1: Basic Window");
init();
form.Resize += (o, e) =>
{
if (form.WindowState == FormWindowState.Minimized)
{
foreach (var item in ObjectTable.Objects)
{
item.Dispose();
}
wasMinimized = true;
}
else
{
foreach (var item in ObjectTable.Objects)
{
item.Dispose();
}
init();
device.SetRenderState(RenderState.FillMode, FillMode.Wireframe);
device.SetRenderState(RenderState.CullMode, Cull.None);
present.BackBufferHeight = form.ClientSize.Height;
present.BackBufferWidth = form.ClientSize.Width;
device.Reset(present);
}
};
MessagePump.Run(form, () =>
{
if (form.WindowState == FormWindowState.Minimized)
{
return;
}
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);
device.BeginScene();
device.SetStreamSource(0, vertices, 0, 20); // 20 is the size of each vertex
device.VertexDeclaration = vertexDecl;
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
device.EndScene();
device.Present();
});
foreach (var item in ObjectTable.Objects)
{
item.Dispose();
}
}
private static void init()
{
present = new PresentParameters();
//present.EnableAutoDepthStencil = false;
//present.BackBufferCount = 1;
//present.SwapEffect = SwapEffect.Discard;
present.Windowed = true;
present.BackBufferHeight = form.ClientSize.Height;
present.BackBufferWidth = form.ClientSize.Width;
//present.BackBufferFormat = Format.Unknown;
device = new Device(new Direct3D(), 0, DeviceType.Hardware, form.Handle, CreateFlags.HardwareVertexProcessing, present);
vertices = new VertexBuffer(device, 3 * 20, Usage.WriteOnly, VertexFormat.None, Pool.Managed);
vertices.Lock(0, 0, LockFlags.None).WriteRange(new Vertex[]
{
new Vertex() { Color = Color.Red.ToArgb(), Position = new Vector4(400.0f, 100.0f, 0.5f, 1.0f) },
new Vertex() { Color = Color.Blue.ToArgb(), Position = new Vector4(650.0f, 500.0f, 0.5f, 1.0f) },
new Vertex() { Color = Color.Green.ToArgb(), Position = new Vector4(150.0f, 500.0f, 0.5f, 1.0f) }
});
vertices.Unlock();
// specifies the layout of the vertexes
vertexElems = new VertexElement[]
{
new VertexElement(0, 0, DeclarationType.Float4, DeclarationMethod.Default, DeclarationUsage.PositionTransformed, 0),
new VertexElement(0, 16, DeclarationType.Color, DeclarationMethod.Default, DeclarationUsage.Color, 0),
VertexElement.VertexDeclarationEnd
};
vertexDecl = new VertexDeclaration(device, vertexElems);
}
}
}
使用系统;
使用系统图;
使用System.Windows.Forms;
使用SlimDX;
使用SlimDX.Direct3D9;
使用SlimDX.Windows;
名称空间SlimDX_1
{
结构顶点
{
公共向量4位置;
公共int颜色;
}
静态类程序
{
私有静态顶点缓冲顶点;
专用静态设备;
私有静态渲染窗体;
私有静态PresentParameters present;
私有静态vertexDecl声明vertexDecl;
私有静态顶点元素[]顶点元素;
私有静态bool=false;
///
///应用程序的主要入口点。
///
[状态线程]
静态void Main()
{
形式=新的渲染形式(“教程1:基本窗口”);
init();
形式.调整大小+=(o,e)=>
{
if(form.WindowState==FormWindowState.Minimized)
{
foreach(ObjectTable.Objects中的var项)
{
item.Dispose();
}
wasmimized=true;
}
其他的
{
foreach(ObjectTable.Objects中的var项)
{
item.Dispose();
}
init();
device.SetRenderState(RenderState.FillMode,FillMode.Wireframe);
device.SetRenderState(RenderState.CullMode,Cull.None);
present.BackBufferHeight=form.ClientSize.Height;
present.BackBufferWidth=form.ClientSize.Width;
设备。重置(存在);
}
};
MessagePump.Run(表单,()=>
{
if(form.WindowState==FormWindowState.Minimized)
{
返回;
}
设备。清除(ClearFlags.Target | ClearFlags.ZBuffer,彩色。黑色,1.0f,0);
device.BeginScene();
device.SetStreamSource(0,顶点,0,20);//20是每个顶点的大小
device.VertexDeclaration=vertexDecl;
device.DrawPrimitives(PrimitiveType.TriangleList,0,1);
device.EndScene();
device.Present();
});
foreach(ObjectTable.Objects中的var项)
{
item.Dispose();
}
}
私有静态void init()
{
present=新PresentParameters();
//present.EnableAutoDepthStencil=false;
//present.BackBufferCount=1;
//present.SwapEffect=SwapEffect.Discard;
present.Windowed=true;
present.BackBufferHeight=form.ClientSize.Height;
present.BackBufferWidth=form.ClientSize.Width;
//present.BackBufferFormat=Format.Unknown;
设备=新设备(新的Direct3D(),0,DeviceType.Hardware,form.Handle,CreateFlags.HardwareVertexProcessing,present);
顶点=新的顶点缓冲区(设备,3*20,Usage.WriteOnly,VertexFormat.None,Pool.Managed);
顶点.Lock(0,0,LockFlags.None).WriteRange(新顶点[])
{
新顶点(){Color=Color.Red.ToArgb(),位置=newvector4(400.0f,100.0f,0.5f,1.0f)},
新顶点(){Color=Color.Blue.ToArgb(),位置=newvector4(650.0f,500.0f,0.5f,1.0f)},
新顶点(){Color=Color.Green.ToArgb(),Position=newvector4(150.0f,500.0f,0.5f,1.0f)}
});
顶点。解锁();
//指定顶点的布局
顶点元素=新顶点元素[]
{
新的VertexElement(0,0,DeclarationType.Float4,DeclarationMethod.Default,DeclarationUsage.PositionTransformed,0),
新的VertexElement(0,16,DeclarationType.Color,DeclarationMethod.Default,DeclarationUsage.Color,0),
VertexElement.VertexDeclarationEnd
};
vertexDecl=新的顶点声明(设备、顶点);
}
}
}
在调整窗口大小时,您所做的远远超过了您需要做的。您正在释放您创建的每个DirectX对象,包括图形设备,然后重新创建所有内容。这需要相对较长的时间,这就是为什么您会看到性能问题
事实上,您的任何对象都不需要释放。只需在设备上调用Reset()函数,即可重新创建backbuffer以匹配新窗口大小。查看一些有关窗口大小调整的本机Direct3D9教程,了解该过程的总体工作原理。调整窗口大小时,您所做的工作远远超出了您需要做的工作。您正在释放您创建的每个DirectX对象,包括图形设备,然后重新创建所有内容。这需要相对较长的时间,这就是为什么您会看到性能问题 事实上,您的任何对象都不需要释放。只需在设备上调用Reset()函数,即可重新创建backbuffer以匹配新窗口大小。查看一些有关窗口大小调整的本机Direct3D9教程,了解该过程的一般工作原理