我想使用System.drawing制作一个小游戏,但在尝试创建一个(XNA或其他类似的游戏引擎)更新方法时被卡住了,这种方法每秒被调用很多次。
首先,我尝试使用System.Timers进行自己的更新,但即使我检查了我的表单的Paint事件是否已完成绘图,屏幕也开始闪烁。
现在我一直在寻找一个允许我这样做的图书馆,但没有运气。例如,XNA不允许我使用像System.drawing那样的绘图,而其他类似的图像只接受“不可调整大小的图形”。
我的问题是:我可以自己创建一个有效的Update方法吗?是否有可以做我想做的图书馆?
答案 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;
}
}