Animacja - przemieszczanie na panelu - out of memory

0

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....

0

Błąd oczywiście wyrzuca Drawings... :)

Kudłacz napisał(a)

Błąd oczywiście wyrzuca Drawings... :)

http://4programmers.net/Forum/C_i_.NET/189407-animacja_-_przemieszczanie_na_panelu_-_out_of_memory?start=0

1 użytkowników online, w tym zalogowanych: 0, gości: 1