在 C# 中绘图(屏幕外)
本文关键字:屏幕 绘图 | 更新日期: 2023-09-27 18:33:51
我想用C#编程一个小游戏。目前只涉及正方形,但我稍后会详细介绍。
所以后台有很多事情发生,比如碰撞检测、子弹移动、玩家移动、用"摄像头"聚焦在玩家身上(以及未来的敌人 AI(。为了执行所有这些任务,我有一个间隔为 10 毫秒的计时器。随着每次滴答,物理"发生",屏幕将被重新绘制。
现在来解决问题:屏幕闪烁,...没那么糟糕,但我认为当我添加更多东西时情况会更糟。我尝试在屏幕外绘制图像,然后将其作为整个图像绘制到屏幕上。但是我需要创建几个位图和图形对象,大约 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();
}
注意:我不直接在窗体上绘制,而是在面板中绘制。它们被称为地图(这是正在进行的行动(和武器部门(在这里你可以看到你当前的武器和弹药(。
创建两个位图对象及其图形对象一次并存储它们。调用传递图形对象的 Draw 方法。这样,您将避免等待 GC 以最小 30 fps 的速率对位图对象进行垃圾回收。
请确保对表单使用双缓冲:
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
http://msdn.microsoft.com/en-us/library/system.windows.forms.controlstyles.aspx