• 大小: 285KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-07-22
  • 语言: 其他
  • 标签: 双缓冲  GDI+  碰撞  

资源简介

一款绘制很漂亮的星空小球碰撞情景软件。使用了两种绘制方法:使用双缓冲绘制和不使用双缓冲绘制。可明显对比出未使用双缓冲的屏幕很闪,使用后屏幕显示很流畅。(内附GDI+绘图屏闪原因以及解决方案)

资源截图

代码片段和文件信息

/*导致画面闪烁的关键原因分析: 

    
 * 一、绘制窗口由于大小位置状态改变进行重绘操作时 

   
       * 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示。
   
 * 刷新过程中会导致所有图元重新绘制,而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用
     
 * Paint事件一次。窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口,因此整个窗口中,只要是图元所在的位置,
    
 * 都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现。 
   
 * 所以说,此时导致窗口闪烁现象的关键因素并不在于Paint事件调用的次数多少,而在于各个图元的重绘。 
   
 * 根据以上分析可知,当图元数目不多时,窗口刷新的位置也不多,窗口闪烁效果并不严重;当图元数目较多时,
     
 * 绘图窗口进行重绘的图元数量增加,绘图窗口每一次刷新都会导致较多的图元重新绘制,窗口的较多位置都在刷新,
     
 * 闪烁现象自然就会越来越严重。特别是图元比较大绘制时间比较长时,闪烁问题会更加严重,因为时间延迟会更长。 

     
 * 解决上述问题的关键在于:窗口刷新一次的过程中,让所有图元同时显示到窗口。 

      二、进行鼠标跟踪绘制操作或者对图元进行变形操作时 

     
    * 当进行鼠标跟踪绘制操作或者对图元进行变形操作时,Paint事件会频繁发生,这会使窗口的刷新次数大大增加。
    
 * 虽然窗口刷新一次的过程中所有图元同时显示到窗口,但也会有时间延迟,因为此时窗口刷新的时间间隔远小于图元
     
 * 每一次显示到窗口所用的时间。因此闪烁现象并不能完全消除! 

    
 * 所以说,此时导致窗口闪烁现象的关键因素在于Paint事件发生的次数多少。 

    
 * 解决此问题的关键在于:设置窗体或控件的几个关键属性。
    
 * this.Setstyle(Controlstyles.OptimizedDoubleBuffer |    

                  Controlstyles.ResizeRedraw | 

                  Controlstyles.AllPaintingInWmPaint true); 


*/



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Media;
using System.Runtime.InteropServices;    


namespace 课程设计
{
    public partial class Form1 : Form
    {
        #region parameter
        Bitmap bmp = new Bitmap(610 700);//在内存中创建一块610 * 700大小的Bitmap

        Graphics g g2;//定义两画布变量
        Pen mypen;//画笔,用于话中间分隔线


        Brush[] p2 = new Brush[18];//定义一个笔刷数组用于绘画各个圆
        Brush[] p1 = new Brush[255];//定义一个笔刷数组用于绘画星星
             
        Point[] point = new Point[18];//定义圆的位置以及数量
        Point[] starsum = new Point[250];// 定义星星位置,每侧数量为50个

        int []vx = new int[18];//各个圆的移动速度
        int []vy = new int[18];

        System.Random rnd = new System.Random();//用于取随机数
        int myValue1;
        int myValue2;
        int myValue3;
        int myValue4;
        int myValue5;// 用于画刷的随机颜色变化

        Color mycolor mycolor2 mycolor4 mycolor5;//自定义颜色

        #endregion


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Paint(object sender PaintEventArgs e)
        {
            //填充背景色为黑色
            Color newC = Color.Black;
            this.BackColor = newC;
        }

        private void Form1_Load(object sender EventArgs e)
        {
            //若要完全启用双缓冲则要设置窗体或者用于绘图控件的属性
            //可以将 OptimizedDoubleBuffer 和 AllPaintingInWmPaint 位设置为 true。但是,
            //启用双缓冲的首选方法是将该控件的 DoubleBuffered 属性设置为 true,这会产生同样的结果
            //如果要设置以上属性,必须先设置UserPaint为true。
            //详情可查阅MSDN里的Setstyle和Controlstyles。
            this.Setstyle(Controlstyles.UserPaint | Controlstyles.AllPaintingInWmPaint
                         | Controlstyles.OptimizedDoubleBuffe

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2012-05-24 10:47  双缓冲 - 副本\
     目录           0  2012-05-24 10:47  双缓冲 - 副本\bin\
     目录           0  2012-05-24 10:47  双缓冲 - 副本\bin\Debug\
     文件       61440  2011-08-16 23:12  双缓冲 - 副本\bin\Debug\AxInterop.WMPLib.dll
     文件      339968  2012-05-23 20:00  双缓冲 - 副本\bin\Debug\Interop.WMPLib.dll
     文件       13312  2012-05-24 10:47  双缓冲 - 副本\bin\Debug\课程设计_29030201018_冯铿宇.exe
     文件       42496  2012-05-24 10:47  双缓冲 - 副本\bin\Debug\课程设计_29030201018_冯铿宇.pdb
     文件       14328  2012-05-24 10:48  双缓冲 - 副本\bin\Debug\课程设计_29030201018_冯铿宇.vshost.exe
     文件         490  2009-06-11 05:14  双缓冲 - 副本\bin\Debug\课程设计_29030201018_冯铿宇.vshost.exe.manifest
     文件       15590  2012-05-24 10:47  双缓冲 - 副本\Form1.cs
     文件        2166  2011-08-16 23:19  双缓冲 - 副本\Form1.Designer.cs
     文件        6008  2011-08-16 23:19  双缓冲 - 副本\Form1.resx
     目录           0  2012-05-24 10:47  双缓冲 - 副本\obj\
     目录           0  2012-05-24 10:47  双缓冲 - 副本\obj\Debug\
     文件       61440  2011-08-16 23:12  双缓冲 - 副本\obj\Debug\AxInterop.WMPLib.dll
     文件      339968  2012-05-23 20:00  双缓冲 - 副本\obj\Debug\Interop.WMPLib.dll
     文件         180  2012-05-23 20:35  双缓冲 - 副本\obj\Debug\Project.Properties.Resources.resources
     目录           0  2010-12-21 11:35  双缓冲 - 副本\obj\Debug\Refactor\
     目录           0  2012-05-24 10:47  双缓冲 - 副本\obj\Debug\TempPE\
     文件        4608  2010-12-19 22:02  双缓冲 - 副本\obj\Debug\TempPE\Properties.Resources.Designer.cs.dll
     文件        4649  2012-05-24 10:48  双缓冲 - 副本\obj\Debug\双缓冲.csproj.FileListAbsolute.txt
     文件         847  2011-08-16 23:19  双缓冲 - 副本\obj\Debug\双缓冲.csproj.GenerateResource.Cache
     文件         544  2012-05-23 20:00  双缓冲 - 副本\obj\Debug\双缓冲.csproj.ResolveComReference.cache
     文件        2074  2010-12-16 12:45  双缓冲 - 副本\obj\Debug\课程设计.Form1 (1).txt
     文件         847  2010-12-16 12:05  双缓冲 - 副本\obj\Debug\课程设计.Form1 (2).Cache
     文件         180  2012-05-23 20:35  双缓冲 - 副本\obj\Debug\课程设计.Form1.resources
     文件        2800  2011-08-16 23:12  双缓冲 - 副本\obj\Debug\课程设计_29030201018_冯铿宇.csproj.FileListAbsolute.txt
     文件         847  2010-12-22 10:03  双缓冲 - 副本\obj\Debug\课程设计_29030201018_冯铿宇.csproj.GenerateResource.Cache
     文件         544  2011-08-16 23:12  双缓冲 - 副本\obj\Debug\课程设计_29030201018_冯铿宇.csproj.ResolveComReference.cache
     文件       13312  2012-05-24 10:47  双缓冲 - 副本\obj\Debug\课程设计_29030201018_冯铿宇.exe
     文件       42496  2012-05-24 10:47  双缓冲 - 副本\obj\Debug\课程设计_29030201018_冯铿宇.pdb
............此处省略13个文件信息

评论

共有 条评论