我想用C#编写一个小游戏。目前只涉及广场,但我稍后会详细介绍。
因此背景中会发生很多事情,例如碰撞检测,子弹运动,玩家移动,使用相机"玩家(以及将来的敌人AI)。为了执行所有这些任务,我有一个计时器,其间隔为10毫秒。随着每个滴答,物理"发生"并且将重新绘制屏幕。
现在问题出现了:屏幕闪烁,......不是那么糟糕,但我认为当我添加更多东西时情况会更糟。我试图在屏幕外绘制图像,然后将其作为整个图像绘制到屏幕上。但我需要创建几个Bitmap和Graphics对象,大约30秒后程序将使用2GB的RAM。
public void Draw()
{
Bitmap bmpMap = new Bitmap(Map.Width, Map.Height);
Graphics gphMap = Graphics.FromImage(bmpMap);
Bitmap bmpWeapon = new Bitmap(WeaponSector.Width, WeaponSector.Height);
Graphics gphWeapon = Graphics.FromImage(bmpWeapon);
DrawMap(gphMap);
DrawWeaponSector(gphWeapon);
Map.CreateGraphics().DrawImage(bmpMap, 0, 0);
gphMap.Dispose();
WeaponSector.CreateGraphics().DrawImage(bmpWeapon, 0, 0);
gphWeapon.Dispose();
}
注意:我不能直接在表单上绘图,但在面板中。它们被称为Map(这是正在进行的动作)和WeaponSector(在这里你可以看到你当前的武器和弹药)。
答案 0 :(得分:1)
创建两个位图对象及其图形对象并存储它们。调用Draw方法传递图形对象。这样,您将避免等待GC以最低30 fps的速率垃圾收集位图对象。
答案 1 :(得分:0)
请务必使用双缓冲格式:
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
http://msdn.microsoft.com/en-us/library/system.windows.forms.controlstyles.aspx