Concise Sample of Managed DirectDraw (9.0c)

自批:读者注意,以下都是肤浅之谈,诚不足作为参考。

今天查了一下Managed DirectX 9.0的情况。据我所知现在有三种DirectX开发方式:C-C++/COM Raw-Interface、VB/COM Component、.Net/Managed DirectX;其中当然是使用COM的原始接口方式最快,其实目前我并不看好Managed DirectX,总体感觉其接口目前还处于不稳定状态,简直就是一片一片的subject to change/deprecated--! 使用这种方式的商业游戏也几乎没有,而且托管方式又为程序的加速增加了一层额外的burden,尤其是在现在普遍对托管方式执行效率不是那么了解的环境下,但是我还是很好奇号称未来DirectX开发潮流的Managed DirectX究竟能有多快,至少应该要比GDI+快吧,至少应该要比Flash快吧,汗.... 小试了一把2D的,M$现在推荐大家使用Direct3D里面的2D渲染接口,也就是Texture + Sprite + Direct3DDevice方式,M$到底是M$,果然有够激进的: )  而传统的DirectDraw接口在DX7.0之后已经开始被M$亮黄牌了——has been deprecated,9.0c SDK里面的资料已严重不全,但还是有Managed的接口支持,下面是个Managed DirectDraw的简明实例,C#写的,保证稳定: ) 需要Managed DirectX的Assembly。至于使用感受么...hmmm....原有的DDraw有的缺点Managed DDraw都有,对错误流程控制要求高、消息循环交互性要求高、多任务友好程度需要额外注意(100% CPU占有率)、需要进行Surface Lost控制.....中个痛苦,试试便知: ) 据说Direct3D里这些方面都是由DX自动管理的,不知效果如何,过两天我再写个Direct3D方式的2D实例。

BTW,罗嗦一句,经试验发现,Managed DirectX 9里面的GraphicsStream类数据操作效率不要太高,显然是经过刻意优化的,像我这种又喜欢直接改写显存又懒的人总算找到救命稻草了,哈哈

#define FULLSCREEN

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;

using Microsoft.DirectX.DirectDraw;

namespace MDDraw
{
    
public class AppForm : System.Windows.Forms.Form
    
{
        
乱七八糟

        
public AppForm()
        
{
            
// Windows 窗体设计器支持所必需的
            InitializeComponent();        

            
#if FULLSCREEN
                FormBorderStyle 
= FormBorderStyle.None;
            
#else
                FormBorderStyle 
= FormBorderStyle.Sizable;
            
#endif

            InitDirectDraw();
        }

    
        
/////////////////////////////////////////////////////////////////////////////////////////////////
        private Device display;
        
private Surface front = null;
        
private Surface back = null;
        
private Surface title = null;
        
private Clipper clip = null;    
        
string titlescreen = "../../02.bmp";

        
private void InitDirectDraw()
        
{
            
////////////////////////////////////////////////////////////////////////////////
            初始化DirectDrawDevice
            
////////////////////////////////////////////////////////////////////////////////
            初始化Primary Surface
            
////////////////////////////////////////////////////////////////////////////////
            初始化Backup Surface
            
////////////////////////////////////////////////////////////////////////////////
            初始化裁剪器
            
////////////////////////////////////////////////////////////////////////////////
            初始化Off-Screen Surface
        }


        
public void Draw()
        
{        
            
if (front == null || this.WindowState == FormWindowState.Minimized)
                
return;
            
            
if (!display.TestCooperativeLevel())
                
return//非常关键! 没有这句话必Crash!

            
try
            
{    
                
绘制或者切换Primary Surface
            }

            
catch(WasStillDrawingException)
            
{
                
return;
            }

            
catch(CannotCreateDeviceContextException)
            
{
                
return;
            }

            
catch(SurfaceLostException)
            
{
                RestoreSurfaces();
            }

            
catch(Exception e)
            
{
                Close();
            }

        }


        
private void RestoreSurfaces()
        
{
            
try 
            
{
                display.RestoreAllSurfaces();
                SurfaceDescription description 
= new SurfaceDescription();
                title.Dispose();
                title 
= null;
                title 
= new Surface(titlescreen,description, display);
            }
 
            
catch (WrongModeException e)
            
{
                
return;
            }

            
catch (UnsupportedModeException e)
            
{
                
return;
            }

            
catch (Exception e)
            
{
                Close();
            }

            
return;
        }


        
private void AppForm_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        
{
            
if (e.KeyChar==(char)13 || e.KeyChar==(char)27)
            
{
                
this.Close();
            }

        }

    }


    
public class App
    
{
        [STAThread]
        
static void Main() 
        
{
            AppForm frm
=new AppForm();
            
            frm.Show();

            
消息循环
        }

    }

}
posted @ 2005-03-31 22:14  neoragex2002  阅读(2593)  评论(3编辑  收藏  举报