wolf13h Posted July 15, 2005 Posted July 15, 2005 (edited) I rewrite matrices example from dx sdk with new fast loop. But its speed = speed Doevents loop? Why? using System; using System.Drawing; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; using Direct3D = Microsoft.DirectX.Direct3D; using System.Runtime.InteropServices; namespace MatricesTutorial { public class Matrices : Form { // Our global variables for this project Device device = null; // Our rendering device VertexBuffer vertexBuffer = null; PresentParameters presentParams = new PresentParameters(); bool pause = false; int count = 0; double fps = 0f; double time = 0f; Microsoft.DirectX.Direct3D.Font dxFont; System.Drawing.Font sysFont; public Matrices() { // Set the initial size of our form this.ClientSize = new System.Drawing.Size(400, 300); // And it's caption this.Text = "Direct3D Tutorial 3 - Matrices"; } public bool InitializeGraphics() { try { // Now let's setup our D3D stuff presentParams.Windowed = true; presentParams.SwapEffect = SwapEffect.Flip; device = new Device(0, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, presentParams); device.DeviceReset += new System.EventHandler(this.OnResetDevice); this.OnCreateDevice(device, null); this.OnResetDevice(device, null); pause = false; DXTimer.Init(); DXTimer.Start(); time = DXTimer.GetElapsedSeconds(); sysFont = new System.Drawing.Font("ARIAL", 20); dxFont = new Microsoft.DirectX.Direct3D.Font(device, sysFont); return true; } catch (DirectXException) { return false; } } public void OnCreateDevice(object sender, EventArgs e) { Device dev = (Device)sender; // Now Create the VB vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 3, dev, 0, CustomVertex.PositionColored.Format, Pool.Default); vertexBuffer.Created += new System.EventHandler(this.OnCreateVertexBuffer); this.OnCreateVertexBuffer(vertexBuffer, null); } public void OnResetDevice(object sender, EventArgs e) { Device dev = (Device)sender; // Turn off culling, so we see the front and back of the triangle dev.RenderState.CullMode = Cull.None; // Turn off D3D lighting, since we are providing our own vertex colors dev.RenderState.Lighting = false; } public void OnCreateVertexBuffer(object sender, EventArgs e) { VertexBuffer vb = (VertexBuffer)sender; CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[])vb.Lock(0, 0); verts[0].X = -1.0f; verts[0].Y = -1.0f; verts[0].Z = 0.0f; verts[0].Color = System.Drawing.Color.DarkGoldenrod.ToArgb(); verts[1].X = 1.0f; verts[1].Y = -1.0f; verts[1].Z = 0.0f; verts[1].Color = System.Drawing.Color.MediumOrchid.ToArgb(); verts[2].X = 0.0f; verts[2].Y = 1.0f; verts[2].Z = 0.0f; verts[2].Color = System.Drawing.Color.Cornsilk.ToArgb(); vb.Unlock(); } private void Render() { //if (device == null) // return; //if (pause) // return; //Clear the backbuffer to a blue color device.Clear(ClearFlags.Target, 0x00003F3F, 1.0f, 0); //Begin the scene device.BeginScene(); // Setup the world, view, and projection matrices SetupMatrices(); device.SetStreamSource(0, vertexBuffer, 0); device.VertexFormat = CustomVertex.PositionColored.Format; device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1); //End the scene device.EndScene(); device.Present(); count++; } private void SetupMatrices() { int iTime = Environment.TickCount % 1000; float fAngle = iTime * (2.0f * (float)Math.PI) / 1000.0f; device.Transform.World = Matrix.RotationY(fAngle); device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 3.0f, -5.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f)); device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, 1.0f, 1.0f, 100.0f); } /*protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e) { if ((int)(byte)e.KeyChar == (int)System.Windows.Forms.Keys.Escape) this.Close(); // Esc was pressed } protected override void OnResize(System.EventArgs e) { pause = ((this.WindowState == FormWindowState.Minimized) || !this.Visible); }*/ private bool AppStillIdle { get { Message msg; return !PeekMessage(out msg, IntPtr.Zero, 0, 0, 0); } } public enum WindowMessage : uint { // Misc messages Destroy = 0x0002, Close = 0x0010, Quit = 0x0012, Paint = 0x000F, // autres messages... } [structLayout(LayoutKind.Sequential)] public struct Message { public IntPtr hWnd; public WindowMessage msg; public IntPtr wParam; public IntPtr lParam; public uint time; public System.Drawing.Point p; } [system.Security.SuppressUnmanagedCodeSecurity] // We won't use this maliciously [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern bool PeekMessage(out Message msg, IntPtr hWnd, uint messageFilterMin, uint messageFilterMax, uint flags); private void OnApplicationIdle(object sender, EventArgs e) { while (AppStillIdle) { // Render a frame during idle time (no messages are waiting) //UpdateEnvironment(); Render(); } } /// <summary> /// The main entry point for the application. /// </summary> static void Main() { using (Matrices frm = new Matrices()) { if (!frm.InitializeGraphics()) // Initialize Direct3D { MessageBox.Show("Could not initialize Direct3D. This tutorial will exit."); return; } //frm.Show(); // While the form is still valid, render and process messages System.Windows.Forms.Application.Idle += new EventHandler(frm.OnApplicationIdle); System.Windows.Forms.Application.Run(frm); } } } } Edited July 15, 2005 by PlausiblyDamp Quote
DrunkenHyena Posted July 15, 2005 Posted July 15, 2005 I'm pretty sure it's syncing with the vertical blank, so you're not going to see a difference. At any rate you are worrying far too much about a message loop. Trying to optimize a single triangle draw is pretty pointless. Quote
wolf13h Posted July 15, 2005 Author Posted July 15, 2005 Render chabge I change render function: private void Render() { device.BeginScene(); device.EndScene(); device.Present(); count++; } but unaffected. But if i comment device.Present(); then speed is very big. Sorry my english :D Quote
wolf13h Posted July 15, 2005 Author Posted July 15, 2005 it may well be that device settings wrong. what is the matter? Quote
DrunkenHyena Posted July 15, 2005 Posted July 15, 2005 If you don't present, then nothing is drawn and no flip occurs. Essentially you have an empty loop, so of course it's fast. Flipping is what gets sync'd to the refresh, so no flip no sync. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.