1.Draw Directly XXXX ……
2.Memory + DrawImage XXX > 5fps
3.Memory + BitBlt XX > 15fps
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; namespace Yozora { public struct Dot { public float X, Y; public float Vx, Vy; public float Radius; public Color Color; static Random random = new Random((int)DateTime.Now.ToBinary()); public Dot(int width, int height, Color color) { X = (float)random.NextDouble() * width; Y = (float)random.NextDouble() * height; Vx = -0.5f + (float)random.NextDouble(); Vy = -0.5f + (float)random.NextDouble(); Radius = (float)random.NextDouble() * 2; Color = color; } } public class DotMgr { private Dot[] dot_array_; //the width of lines private Int32 b_ = 1; //the quanlity of dots private float d_ = 0.2f; //the origin and bitmap graphics private Graphics dst_g_, mmr_g_; // private Bitmap m_; //width private Int32 w_ = 1920; //height private Int32 h_ = 1200; //the limit of fps private Int32 f_ = 24; //the quanlity of stars private float s_ = 0.2f; //the lines of stars private Int32 l_ = 5; private IntPtr mmr_dc_ = IntPtr.Zero; private IntPtr dst_dc_ = IntPtr.Zero; public bool ok = true; public Inf Init(Graphics g, Int32 width, Int32 height, Int32 frame, float stars, float dots) { dst_g_ = g; w_ = width; h_ = height; f_ = frame; s_ = stars; d_ = dots; m_ = new Bitmap(w_, h_); mmr_g_ = Graphics.FromImage(m_); dst_g_.Clear(Color.Black); mmr_dc_ = mmr_g_.GetHdc(); dst_dc_ = dst_g_.GetHdc(); mmr_g_.ReleaseHdc(); return new Inf(0, "success init."); } public void CreateDots() { } public Inf DrawStar() { Inf inf = new Inf(2, "start drawing"); mmr_g_.FillRectangle(new SolidBrush(Color.FromArgb(255, 0, 0 ,0)), 0, 0, w_, h_); Int32 x, y, r1, r2; Int32 angle = 180 / l_; Int32 l = l_ * 2; Point[] star = new Point[l+1]; Color color; Pen p; Random rnd = new Random(); for (Int32 i = 0; i < w_ * s_; ++i) { x = rnd.Next(10, w_ - 10); y = rnd.Next(10, h_ - 10); // ? r1 = rnd.Next(4, 7); r2 = rnd.Next(8, 12); color = Color.FromArgb(240, rnd.Next(1, 254), rnd.Next(1, 254), rnd.Next(1, 254)); p = new Pen(color, b_); for (Int32 j = 0; j < l+1; ++j) { star[j].X = Convert.ToInt32(Math.Round(j % 2 == 0 ? (x + r1 * Math.Cos(j * 3.14159 / l_)) : (x + r2 * Math.Cos(j * 3.14159 / l_)), 2, MidpointRounding.AwayFromZero)); star[j].Y = Convert.ToInt32(Math.Round(j % 2 == 0 ? (y + r1 * Math.Sin(j * 3.14159 / l_)) : (y + r2 * Math.Sin(j * 3.14159 / l_)), 2, MidpointRounding.AwayFromZero)); } mmr_g_.DrawLines(p, star); if (rnd.Next(0, 100) > 50) mmr_g_.FillPolygon(new SolidBrush(color), star); } ok = true;
//spciy chicken W32.SelectObject(mmr_dc_, m_.GetHbitmap()); W32.BitBlt(dst_dc_, 0, 0, w_, h_, mmr_dc_, 0, 0, W32.SRCCOPY); return new Inf(1, "draw successfully!"); } } }