Witam,
Niestety, ale ciągle zmagam się z problemem out of memory podczas rysowania animacji na panelu. Zminimalizowałem liczbę tworzonych nowych obiektów w często wykonywanej instrukcji Tick i nie wiem jak bardziej mogę oskubać ten kod. Możliwe, że po prostu trzeba zrobić to inną metodą.
private void toolStripButton3_Click(object sender, EventArgs e)
{
TickZegara = 0;
Zegar = new Timer();
Zegar.Interval = (10); // jedna sekunda = 1000
Zegar.Tick += new EventHandler(zegar_Tick);
Zegar.Start();
}
void zegar_Tick(object sender, EventArgs e)
{
Image CloneTlo = tlo2.Clone(CloneObszar, Cloneformat);
Graphics gLokalne = Graphics.FromImage(CloneTlo);
for (int i = 0; i < Obiekty_Static.LiczbaPracownikow; i++) //po wszystkich pracownikach
{
if (KrokAnimacji[i] < Tablice.TablicaPracownicy[i].wspKolejnychKrokowDoAnimacji.Count)
{
Point lokalizacja = Tablice.TablicaPracownicy[i].wspKolejnychKrokowDoAnimacji[TickZegara];
Rysuj(gLokalne,lokalizacja, i);
KrokAnimacji[i] += szybkosc;
}
this.PanelRysunku.BackgroundImage = CloneTlo;
}
TickZegara += szybkosc;
gLokalne.Dispose();
CloneTlo = null;
}
private void Rysuj(Graphics gLokalne, Point Lokalizacja, int nrpickera)
{
gLokalne.FillRectangle(KolorPickera, Lokalizacja.X , Lokalizacja.Y , promienPickera,promienPickera);
gLokalne.DrawRectangle(LiniaPickera, Lokalizacja.X , Lokalizacja.Y, promienPickera,promienPickera);
String TekstPickera = (nrpickera + 1).ToString();
gLokalne.DrawString(TekstPickera, CzcionkaTekstPickera, drawBrushTekstPickera, Lokalizacja.X, Lokalizacja.Y );
}
Nowe obiekty tworzone są tylko raz w oddzielnej metodzie:
private void ParametryRysowaniaAnimacjiSymulacji()
{
CzcionkaTekstPickera = new Font("Arial", 6);
drawBrushTekstPickera = new SolidBrush(Color.Black);
drawFormatTekstPickera = new StringFormat();
drawFormatTekstPickera.FormatFlags = StringFormatFlags.DirectionRightToLeft;
drawFormatTekstPickera.Alignment = StringAlignment.Center;
KolorPickera = new SolidBrush(Color.Transparent);
LiniaPickera = new Pen(Color.Blue);
LiniaPickera.Width = 1;
promienPickera = 10;
tlo2 = new Bitmap(Obiekty_Static.MiejscaPobran);
CloneObszar = new Rectangle(0, 0, Obiekty_Static.MiejscaPobran.Width, Obiekty_Static.MiejscaPobran.Height);
Cloneformat = Obiekty_Static.MiejscaPobran.PixelFormat;
}
Nie umiem sobie z tym poradzić bo nie wiem jak bardziej moge ten kod oczyścić. Kopiowany obrazek CloneTlo wyrzuca błąd
podczas Dispose(); Co innego może tu jeszcze pożerać pamięć. Bo błąd jak widoczne jest w wcześniejszych postach wyrzucany jest
przez Graphics....