Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SlimDX处理窗口大小调整_Slimdx - Fatal编程技术网

SlimDX处理窗口大小调整

SlimDX处理窗口大小调整,slimdx,Slimdx,我正在尝试处理正在调整大小的程序窗口,而我在下面拼凑的代码(我认为效率低下)似乎就起到了作用 有没有更好的方法来实现这一点,最好是在调整窗口大小时不产生口吃,并且不经常使用12-17%的CPU?我还怀疑MessagePump.Run可能在form.Resize再次完成设备设置之前运行,并抛出错误 谢谢 using System; using System.Drawing; using System.Windows.Forms; using SlimDX; using SlimDX.Direct

我正在尝试处理正在调整大小的程序窗口,而我在下面拼凑的代码(我认为效率低下)似乎就起到了作用

有没有更好的方法来实现这一点,最好是在调整窗口大小时不产生口吃,并且不经常使用12-17%的CPU?我还怀疑
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教程,了解该过程的一般工作原理