用C#绘图(离屏)

时间:2013-10-04 13:06:51

标签: c# graphics drawing

我想用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(在这里你可以看到你当前的武器和弹药)。

2 个答案:

答案 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