zoukankan      html  css  js  c++  java
  • 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();

                
    消息循环
            }

        }

    }
  • 相关阅读:
    常用内建函数
    函数作用域
    异常处理语句
    迭代器---待延申扩展
    流程控制语句
    字典
    集合
    数据类型的可变与不可变
    Openstack keystone组件详解
    云计算openstack介绍(001)
  • 原文地址:https://www.cnblogs.com/neoragex2002/p/129720.html
Copyright © 2011-2022 走看看