C#更新方法

时间:2014-06-03 15:19:49

标签: c# graphics system.drawing

我想使用System.drawing制作一个小游戏,但在尝试创建一个(XNA或其他类似的游戏引擎)更新方法时被卡住了,这种方法每秒被调用很多次。

首先,我尝试使用System.Timers进行自己的更新,但即使我检查了我的表单的Paint事件是否已完成绘图,屏幕也开始闪烁。

现在我一直在寻找一个允许我这样做的图书馆,但没有运气。例如,XNA不允许我使用像System.drawing那样的绘图,而其他类似的图像只接受“不可调整大小的图形”。

我的问题是:我可以自己创建一个有效的Update方法吗?是否有可以做我想做的图书馆?

2 个答案:

答案 0 :(得分:4)

  

我可以自己创建一个有效的Update方法吗?

在C#中 - 没有任何明智的方法。问题是,无论你做什么都会在CPU上运行,这对于每个定义都是低效的。

您的问题是您没有使用缓冲区。不要更新实时窗口 - 更新另一个位图,然后在窗口上渲染该位图。查找" Double Buffering"在谷歌。

http://msdn.microsoft.com/en-us/library/3t7htc9c(v=vs.110).aspx

有一些解释

标题是:

如何:通过双缓冲实现表单和控件减少图形闪烁

答案 1 :(得分:1)

我是这样做的。绘制到位图,这是你的后备。然后将图片框的图像设置为后备缓冲区位图。是的,使用图片框似乎比表单更好地处理闪烁。将图片框大小模式设置为StretchImage,图像将填充图片框。

public partial class Form1 : Form
{
    Bitmap _backbuffer;
    public Form1()
    {
        InitializeComponent();
        _backbuffer = new Bitmap(600, 400);
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        using (Graphics g = Graphics.FromImage(_backbuffer))
        {
            //clear the backbuffer
            g.Clear(Color.White);
            //draw stuff for the next frame
            g.DrawEllipse(Pens.Black, new Rectangle(50, 50, 100, 100));
        }
        //draw the backbuffer to the screen
        pictureBox1.Image = _backbuffer;
    }
}