2012-04-22 24 views
1

サイズ変更中のプログラムウィンドウを処理しようとしていますが、私は下に一緒に飛んできた(私は非効率だと思います)コードは、このトリックを行うようです。SlimDXウィンドウのサイズ変更

これを行うには良い方法はありますか?ウィンドウのサイズを変更するときにスタッターを作成せず、CPUの12-17%を常に使用しない方が良いですか?私はまた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); 
     } 
    } 
} 

答えて

1

あなたは、ウィンドウのサイズを変更したときに実行する必要がある以上に進んでいます。グラフィックスデバイスを含め、作成したすべてのDirectXオブジェクトをリリースしてから、すべてを再作成します。これは比較的長い時間がかかるため、パフォーマンス上の問題が発生しています。

実際には、あなたのオブジェクトを解放する必要はありません。デバイスのReset()関数を呼び出して、新しいウィンドウサイズに合わせてバックバッファを再作成してください。ウィンドウのサイズ変更に関するDirect3D9チュートリアルのネイティブを調べて、一般的なプロセスの仕組みを確認してください。

+0

助けてくれてありがとう!私は今、馬鹿だと感じる。 –

関連する問題