首页 > 编程语言 >测试C#GDI+双缓冲高效绘图--BufferedGraphicsContext

测试C#GDI+双缓冲高效绘图--BufferedGraphicsContext

时间:2024-05-28 11:54:50浏览次数:16  
标签:C# rnd -- BufferedGraphicsContext Graphics 缓冲区 Next true

奥斯卡好的b、

测试C#GDI+双缓冲高效绘图
```
        #region C#GDI+双缓冲高效绘图
        #region temp
        //Rectangle rectangle = e.ClipRectangle;//取出次窗体或者画布的有效区的矩形区域
        //BufferedGraphicsContext GraphicsContext = BufferedGraphicsManager.Current;//获取程序住缓冲区域的BufferedGraphicsContext(双缓存类,此类用于提供双缓冲的功能)对象
        //BufferedGraphics myBuffer = GraphicsContext.Allocate(e.Graphics, e.ClipRectangle);//获取缓冲区
        // Graphics g = myBuffer.Graphics;

        //指定在呈现期间像素偏移的方式。
        //g.PixelOffsetMode = PixelOffsetMode.HighQuality;//高质量低速度呈现
        //指定是否将平滑处理(消除锯齿)应用于直线、曲线和已填充区域的边缘。
        //g.SmoothingMode = SmoothingMode.HighQuality;// 指定高质量、低速度呈现。
        //g.Clear(BackColor);//或者使用invalidate方法==有效区的擦除
        //Pen bluePen2 = new Pen(Color.Blue);
        //LineDrawRoutine(g, bluePen2);
        //myBuffer.Render(e.Graphics);  //将图形缓冲区的内容写入指定的 Graphics 对象。
        //g.Dispose();
        //myBuffer.Dispose();


        //其实在C#里如果是在Form中绘图的话直接把Form的DoubleBuffered = true就可以了(利用winfrom窗体的默认双缓冲)
        //把所有的绘图放在一个picturebox里面绘制,
        //不要直接再在form里面绘
        //SetStyle(ControlStyles.UserPaint, true);
        //SetStyle(ControlStyles.ResizeRedraw, true);
        //SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        //SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        //SetStyle(ControlStyles.Selectable, true);

        // 如果你在Form中绘图的话,不论是不是采用的双缓存,都会看到图片在更新的时候都会不断地闪烁,解决方法就是在这个窗体的构造函数中增加以下三行代码:
        //请在构造函数里面底下加上如下几行:
        //SetStyle(ControlStyles.UserPaint, true);
        //SetStyle(ControlStyles.AllPaintingInWmPaint, true);   //   禁止擦除背景.
        //SetStyle(ControlStyles.DoubleBuffer, true);   //   双缓冲
        //参数说明:
        //UserPaint
        //如果为true,控件将自行绘制,而不是通过操作系统来绘制。此样式仅适用于派生自 Control的类。
        //AllPaintingInWmPaint
        //如果为true,控件将忽略 WM_ERASEBKGND窗口消息以减少闪烁。仅当UserPaint 位设置为true时,才应当应用该样式。
        //DoubleBuffer
        //如果为true,则绘制在缓冲区中进行,完成后将结果输出到屏幕上。双重缓冲区可防止由控件重绘引起的闪烁。要完全启用双重缓冲,还必须将UserPaint和AllPaintingInWmPaint样式位设置为   true。   
        #endregion


        #region MyRegion
        //在构造函数中加如下代码
        //代码一:
        //SetStyle(ControlStyles.UserPaint, true);
        //SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
        //SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
        //或代码二:
        //this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
        //this.UpdateStyles();
        #endregion

        #region MyRegion
        //.netframework提供了一个类BufferedGraphicsContext负责单独分配和管理图形缓冲区。每个应用程序域都有自己的默认 BufferedGraphicsContext 实例来管理此应用程序的所有默认双缓冲。大多数情况下,每个应用程序只有一个应用程序域,所以每个应用程序通常只有一个默认 BufferedGraphicsContext。默认 BufferedGraphicsContext 实例由 BufferedGraphicsManager 类管理。通过管理BufferedGraphicsContext实现双缓冲的步骤如下:
        //(1)获得对 BufferedGraphicsContext 类的实例的引用。
        //(2)通过调用 BufferedGraphicsContext.Allocate 方法创建 BufferedGraphics 类的实例。
        //(3)通过设置 BufferedGraphics.Graphics 属性将图形绘制到图形缓冲区。
        //(4)当完成所有图形缓冲区中的绘制操作时,可调用 BufferedGraphics.Render 方法将缓冲区的内容呈现到与该缓冲区关联的绘图图面或者指定的绘图图面。
        //(5)完成呈现图形之后,对 BufferedGraphics 实例调用释放系统资源的 Dispose 方法。
        //BufferedGraphicsContext current01 = BufferedGraphicsManager.Current; //(1)初始化BufferedGraphicsContext 类的新实例
        //BufferedGraphics bg01 = current01.Allocate(this.CreateGraphics(), this.DisplayRectangle); //(2) 使用指定的Graphics 的像素格式,创建指定大小的图形缓冲区。
        //Graphics g01 = bg.Graphics;//(3)通过设置 BufferedGraphics.Graphics 属性将图形绘制到图形缓冲区
        ////随机 宽400 高400
        //System.Random rnd = new Random();

        //int x, y, w, h, r, i;
        //for (i = 0; i < 10000; i++)
        //{
        //    x = rnd.Next(400);
        //    y = rnd.Next(400);
        //    r = rnd.Next(20);
        //    w = rnd.Next(10);
        //    h = rnd.Next(10);
        //    g.DrawEllipse(Pens.Blue, x, y, w, h);
        //}

        //bg.Render();//(4)当完成所有图形缓冲区中的绘制操作时,可调用 BufferedGraphics.Render 方法将缓冲区的内容呈现到与该缓冲区关联的绘图图面或者指定的绘图图面。
        ////bg.Render(this.CreateGraphics());
        //bg.Dispose();//(5)完成呈现图形之后,对 BufferedGraphics 实例调用释放系统资源的 Dispose 方法。
        #endregion

        public void TestBufferedGraphics01()
        {
            //完整的例子,在一个200 * 200的矩形框内绘制10000个随机生成的小圆
            BufferedGraphicsContext current = BufferedGraphicsManager.Current; //(1)初始化BufferedGraphicsContext 类的新实例
            //BufferedGraphics bg = current.Allocate(this.CreateGraphics(), this.DisplayRectangle); //(2)使用指定的Graphics 的像素格式,创建指定大小的图形缓冲区。
            using (BufferedGraphics bg = current.Allocate(this.pbx01.CreateGraphics(), this.pbx01.DisplayRectangle))  //(2)使用指定的Graphics 的像素格式,创建指定大小的图形缓冲区。
            {
                //随机 宽400 高400
                using (Graphics g = bg.Graphics)//(3)通过设置 BufferedGraphics.Graphics 属性将图形绘制到图形缓冲区
                {
                    System.Random rnd = new Random();
                    int x, y, w, h, r, i;
                    for (i = 0; i < 10000; i++)
                    {
                        x = rnd.Next(200);
                        y = rnd.Next(200);
                        r = rnd.Next(20);
                        w = rnd.Next(10);
                        h = rnd.Next(10);
                        g.DrawEllipse(Pens.Blue, x, y, w, h);
                    }
                    bg.Render();
                    //bg.Render(this.pbx01.CreateGraphics());//(4)当完成所有图形缓冲区中的绘制操作时,可调用 BufferedGraphics.Render 方法将缓冲区的内容呈现到与该缓冲区关联的绘图图面或者指定的绘图图面。
                    //bg.Render(this.CreateGraphics());
                    bg.Dispose();//(5)完成呈现图形之后,对 BufferedGraphics 实例调用释放系统资源的 Dispose 方法。
                }
            }
        }

        public void TestBufferedGraphics02()
        {
            //开辟一个缓冲区(如一个不显示的Bitmap对象),在其中绘制完成后,再一次性显示
            using (Bitmap bt = new Bitmap(200, 200))
            {
                using (Graphics bg = Graphics.FromImage(bt))
                {
                    System.Random rnd = new Random();
                    int x, y, w, h, r, i;
                    for (i = 0; i < 10000; i++)
                    {
                        x = rnd.Next(200);
                        y = rnd.Next(200);
                        r = rnd.Next(20);
                        w = rnd.Next(10);
                        h = rnd.Next(10);
                        bg.DrawEllipse(Pens.Blue, x, y, w, h);
                    }
                    //this.CreateGraphics().DrawImage(bt, new PointF(0, 0));
                    this.pbx01.CreateGraphics().DrawImage(bt, new PointF(0, 0));
                }
            }
        }
        #endregion
```

 

标签:C#,rnd,--,BufferedGraphicsContext,Graphics,缓冲区,Next,true
From: https://www.cnblogs.com/1175429393wljblog/p/18217640

相关文章

  • LED车灯150v降压恒流驱动芯片AP5191pwm精确调光过温保护
    产品描述AP5191是一款PWM工作模式,高效率、外围简单、内置功率MOS管,适用于4.5-150V输入的高精度降压LED恒流驱动芯片。输出最大功率150W,最大电流6A。AP5191可实现线性调光和PWM调光,线性调光脚有效电压范围0.55-2.6V.AP5191工作频率可以通过RT外部电阻编程来设定,同时内置抖频......
  • 2882. 删去重复的行
    2882.删去重复的行DataFramecustomers+-------------+--------+|ColumnName|Type|+-------------+--------+|customer_id|int||name|object||email|object|+-------------+--------+在DataFrame中基于email列存在一些重复行。编写一个......
  • 1、时间函数-DATEPART
    时间函数-DATEPART1、语法selectdatepart(datepart,date)datepart:所需要的输出的时间格式,如year、month、day、hour等。date:所要查询的时间字段(cloumn)。2、案例获取年份SELECTDATEPART(year,GETDATE())ASCurrentYear;获取月份SELECTDATEPART(month,GETDATE(......
  • 本地编译memos, 不使用dock
    memos简介memos是一个开源的个人博客,类似个人朋友圈,日记本之内的。先从memos的官方github项目主页下载源码、解压这些就不说了。前端使用nodejs,后端使用go后端编译直接进入解压后的bin目录下(.\memos-0.19.1\bin\memos),执行编译命令(这个过程中会下载一些go的包,可能需要kx......
  • 【舞台灯方案】LED驱动恒流芯片pwm深度调光APS54085降压IC
    产品描述APS54085是一款PWM工作模式,高效率、外围简单、内置功率MOS管,适用于5-100V输入的高精度降压LED恒流驱动芯片。最大电流2.0A。APS54085可实现线性调光和PWM调光,线性调光有效电压范围0.52-2.55V.PWM调光频率范围100HZ-30KHZ。APS54085工作频率可以通过R......
  • 挂职是怎么一回事
    根据新华网上提供的文章《四问:公务员挂职是怎么一回事?》,我们可以这样理解公务员挂职:1.**定义**:挂职是公务员内部交流的一种方式,可以是“上挂”(基层公务员到上级机关或中央和国家部委挂职)或“下挂”(上级公务员到下级机关挂职),也可以是横向交流。2.**目的**:挂职主要是为了......
  • 2024-05-28 英语学习纪要
    Recentyear,moreandmorechineseculturalproductshavecomeintoglobalmarketandgetincreasinglyfacinatedbycustomersabroad.WiththerapiddevelopmentofofChineseculturaltrade(对外文化贸易,真的不会翻译……),theamountofexportedChinesecultura......
  • kafka解决重复消费问题
    Kafka避免消息重复消费通常依赖于以下策略和机制:  总结就是通过消费者组+手动提交偏移量+处理消息的幂等性(数据库redis分布式锁等)1.ConsumerGroupIDKafka使用ConsumerGroupID来跟踪每个消费者所读取的消息。确保每个消费者都具有唯一的GroupID。如果多个消费者属......
  • 挣扎中的赛季末
    前言别看这标题非常像一个神秘的叙事文,但是实际上这是篇考试总结+类日记。Day1\(\Leftrightarrow\)5.28Day1补了昨天考试的题。T1智障了。不难发现如果找到全局最优点对,剩下就只有这两个点到根这两个路径上的点不是这个答案,然后扫两边就行了。T2神仙DP。考虑到我们......
  • XPath随记
    1、XPath基础:1、/   #从根节点开始2、//  #选择匹配的任何位置3、.   #当前节点4、..  #父节点5、@  #选择属性6、[node]#选取所有node子元素7、[@attr]  #选择带有attr属性的所有元素2、选取......