最近在研究GDI+
在移动一张贴图的时候发现.drawimage()很卡..
后来用了双缓冲,感觉好多了,但还是觉得有点慢..
请问怎么使用bitblt把一张图绘到另外一张图中..弄了好久都找不到可以参考的C#源码...压力大
P.s. 源代码在此,如果有可以改进的地方希望指出,谢谢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;namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
SetStyle(ControlStyles.OptimizedDoubleBuffer, true); //默认启动双缓冲
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
haha = new Bitmap(panel1.Width, panel1.Height);
g = Graphics.FromImage(haha); pang = panel1.CreateGraphics();
}
Graphics g;
int x = 0;
Image haha;
Graphics pang;//panel1
private void timer1_Tick(object sender, EventArgs e)
{
x += 3;
timer1.Interval = 1;
Invalidate();
Draw();
} private void Draw()
{
using (Graphics g = Graphics.FromImage(haha))
{
g.Clear(Color.White);
g.DrawImage(Properties.Resources._2, -x, 100);
g.DrawImage(Properties.Resources._2, x, 100);
g.DrawImage(Properties.Resources._2, x, 0);
g.DrawImage(Properties.Resources._2, -x, -x);
g.Dispose();
}
}
protected override void OnPaint(PaintEventArgs e)
{
Draw();
pang.DrawImage(haha, Point.Empty);
}
}
}
在移动一张贴图的时候发现.drawimage()很卡..
后来用了双缓冲,感觉好多了,但还是觉得有点慢..
请问怎么使用bitblt把一张图绘到另外一张图中..弄了好久都找不到可以参考的C#源码...压力大
P.s. 源代码在此,如果有可以改进的地方希望指出,谢谢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;namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
SetStyle(ControlStyles.OptimizedDoubleBuffer, true); //默认启动双缓冲
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
haha = new Bitmap(panel1.Width, panel1.Height);
g = Graphics.FromImage(haha); pang = panel1.CreateGraphics();
}
Graphics g;
int x = 0;
Image haha;
Graphics pang;//panel1
private void timer1_Tick(object sender, EventArgs e)
{
x += 3;
timer1.Interval = 1;
Invalidate();
Draw();
} private void Draw()
{
using (Graphics g = Graphics.FromImage(haha))
{
g.Clear(Color.White);
g.DrawImage(Properties.Resources._2, -x, 100);
g.DrawImage(Properties.Resources._2, x, 100);
g.DrawImage(Properties.Resources._2, x, 0);
g.DrawImage(Properties.Resources._2, -x, -x);
g.Dispose();
}
}
protected override void OnPaint(PaintEventArgs e)
{
Draw();
pang.DrawImage(haha, Point.Empty);
}
}
}
OnPaint中就写一句: m_MemoryDC.Render(e.Graphics);
另外,没必要整一个Image出来配合,直接画MemoryDC就可以了.窗口声明:
protected BufferedGraphics m_MemoryDC = null;
protected BufferedGraphicsContext m_Context = BufferedGraphicsManager.Current;窗口构造函数中:
this.m_MemoryDC = m_Context.Allocate(this.CreateGraphics(), this.ClientRectangle);
额...但是如果依然用drawimage的方法画图的话,还是具有掉帧....请问bitblt咋弄呢?
这个timer到30ms以下刷新的时间都一样了,1ms刷新跟30ms刷新没啥区别,不然你自己试试吧
Clip方法还是没有搞懂...只是我觉得想到的这么多种方法中bitblt比较接近了,想去尝试一下..
Graphics g1 = Graphics.FromImage(Properties.Resources._2);
Image MyImage = new Bitmap(1024,768, g1);
Graphics g2 = this.CreateGraphics();
IntPtr dc1 = g1.GetHdc();
IntPtr dc2 = g2.GetHdc();
BitBlt(dc2, 0, 0, MyImage.Width, MyImage.Height, dc1, 0, 0, 13369376);
g1.ReleaseHdc(dc1);
g2.ReleaseHdc(dc2);
我做截图速度太慢了。。怎么加速啊