1

我想用 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();
    }

注意:我不是直接在表格上绘制,而是在面板中绘制。它们被称为地图(这是正在进行的动作)和武器扇区(在这里你可以看到你当前的武器和弹药)。

4

2 回答 2

1

一次创建两个位图对象及其图形对象并存储它们。调用传递图形对象的 Draw 方法。这样,您将避免等待 GC 以最低 30 fps 的速率对位图对象进行垃圾收集。

于 2013-10-04T13:14:14.927 回答
0

确保对表单使用双缓冲:

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

http://msdn.microsoft.com/en-us/library/system.windows.forms.controlstyles.aspx

于 2013-10-04T13:25:10.377 回答