Spicy Chicken GDI in C#

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!");
        }
    }
}
时间: 2024-10-13 18:23:56

Spicy Chicken GDI in C#的相关文章

SpringMVC在@RequestMapping配置两个相同路径

这篇博客来自这个问题: 在SpringMVC中@RequestMapping可以配置两个相同的url路径吗. 首先,这个问题会点SpringMVC的人可能都知道答案,但是上次面试中我就回答了可以...可以..Spicy Chicken!!! 参考文章: http://lgbolgger.iteye.com/blog/2105108 这个问题要从 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter 讲起了. 首先,在配置文件中声明

抽象工程模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace KFCandM { class Program { interface IFactory { Burger Makeburger(); Drink Makedrink(); Chicken Makechicken(); } class KFC :

python-建造者模式

说明: 假如要组装一台电脑,将主板,CPU,内存等部件按照某个稳定的步骤组合,基本过程是不变的,而组成电脑的各个部件却可以是不同性能的,不同价位,或者是不同版本的,当组成电脑的时只需要选择不同的组件就可以按照基本相同的过程造出不同配置的电脑.也就是说建造者模式的意图是将一个复杂对象的构建过程与表示分离,它使用相同的构建步骤作用于不同的子对象以构建出不同表现形式的"复杂对象". 实例: 从订单的角度构建一个快餐点餐系统 class Burger(): """

python-工厂方法模式

简单工厂模式的不足: 在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类.简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,加入必要的处理逻辑,这违背了"开闭原则".在简单工厂模式中,所有的产品都是由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题. 说明: 工厂方法模式: 定

ZJNU 2212 - Turn-based game

Mr.Lee每隔1/x s攻击一次,cpu每隔1/y s攻击一次 因为时间与答案无关,最后只看boss受到了多少次攻击 所以可以在每个人的频率上同时乘以xy 即Mr.Lee每隔y s攻击一次,cpu每隔x s攻击一次 这样看虽然时间延长但是结果不变 就可以二分查找出打败boss用时,最后再根据时间判断谁给予的最后一击 二分出用时t,则t%x==0表示cpu给予最后一击 t%y==0表示Mr.Lee给予最后一击 1 #include<stdio.h> 2 int main(){ 3 long l

GDI+ 画渐变色环

在onpaint() 函数中加入如下代码,本次利用DrawArc来实现. #define PI 3.1415926 int angle=360; int x=(rect.Width()-300)/2; int y=190; int width=300; int hight=300; int wide=34; graphics.SetSmoothingMode(SmoothingModeAntiAlias);//抗锯齿 for(float i = 0.0; i < PI; i += (float)

vs2008中使用gdi+的设置

vs2008中使用gdi+ 1.新建一个mfc工程 2.在stdafx.h文件中加入以下几行语句:#include <gdiplus.h>                //#pragma comment(lib, "gdiplus.lib") //在工程属性中添加亦可using namespace Gdiplus;            //使用GDI+的命名空间, 若不用的话每次使用Gdiplus时均加上命名空间亦可 3.修改App类在App类(以下例子中为CTestA

win32用GDI+加载png图片作为背景图

#include <windows.h> #include <gdiplus.h> /* GDI+ startup token */ ULONG_PTR gdiplusStartupToken; /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); // UpdateLayeredWindow Defination typedef BOOL(*UP

win32学习之 --------GDI使用 代码记录

LRESULT QMainFrame::onPaint(WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hDC = ::BeginPaint(m_hWnd, &ps); RECT rcClient; GetClientRect(&rcClient); assert(hDC); { /**画字体 DrawText(hDC,_T("test"), _tcslen(_T("test")),&r