2013-10-04 3 views
1

Я хочу запрограммировать небольшую игру на C#. На данный момент есть только квадраты, но я расскажу позже.Рисунок на C# (Offscreen)

Таким образом, на заднем плане происходит много вещей, таких как обнаружение столкновения, движение пули, движение игрока, фокусировка на «камере» на игроке (и вражеский ИИ в будущем). Для выполнения всех этих задач у меня есть таймер с интервалом в 10 миллисекунд. С каждым тиком физика «слушается», и экран будет перерисован.

Теперь проблема: экран мерцает, ... не так уж плохо, но я думаю, что будет еще хуже, когда я добавлю больше вещей. Я попытался нарисовать изображение на экране и нарисовать его потом, как целое изображение на экране. Но мне нужно создать несколько объектов Bitmap и Graphics, и примерно через 30 секунд программа будет использовать как 2 ГБ ОЗУ.

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 (здесь вы можете увидеть свое текущее оружие и боеприпасы).

+1

и вопрос) – user1956570

+0

Вы могли бы попытаться сделать рисунок асинхронной в физике часть?. Таким образом, вы можете контролировать частоту кадров чертежа независимо от фактического игрового режима. Частота кадров кадров, скажем, 40 кадров в секунду, должна быть достаточной. –

+0

Не используйте CreateGraphics, это только временный чертеж. Используйте рисунок для панелей или форм для рисования. – LarsTech

ответ

1

Создайте два растровых объекта и их графические объекты один раз и сохраните их. Вызовите метод Draw, передающий графические объекты. Таким образом, вы избежите ждать, пока GC будет мусором, собирать объекты растрового изображения со скоростью 30 кадров в секунду.