Słaba wydajność wyświetlanej grafiki

0

Otóż piszę sobie mini grę i mam problem z wyświetlaniem. Program strasznie się przycina w przypadku 1 gdy załaduje mapę z pliku.

 public void rysujMape(Graphics g)
        {
            StreamReader sr = new StreamReader("mapflags.txt");
            
           Bitmap ne;
            for (int i = 0; i < 20; i++)
            {
                for (int j = 0; j < 20; j++)
                {
                    float fx = i;
                    float fy = j;
                   ne = new Bitmap(@"gfx/" + sr.ReadLine());       

                    if (gameMatrix[i, j] == 1)
                    {                                              
                       g.DrawImage(image2, 50+i *elementSize, 50+j*elementSize,elementSize,elementSize);
                    }
                    if (gameMatrix[i, j] == 2)
                    {
                        Bitmap ziemia = new Bitmap(titleMapY[i]);
                        Bitmap ziemiaX = new Bitmap(titleMapX[j]);
                        g.FillRectangle(Brushes.Red, 50 + j * elementSize,
                                        50 + i * elementSize, elementSize, elementSize);
                      //  g.DrawImage(ziemia, 50 + fx * elementSize, 50 + fy * elementSize, elementSize, elementSize);
                      //  g.DrawImage(ziemiaX, 50 + fx * elementSize, 50 + fy * elementSize, elementSize, elementSize);
                        ziemia = null;
                        ziemiaX = null;
                    }
                                       
                }
            }
        }

W pliku mapflags.txt znajduje się około 400 linii. W każdej linii jest tekst typu (101.jpg,102,jpg...) są to nazwy plików które mają zostać wyświetlone.
Ładnie jest wszystko narysowane lecz strasznie się tnie. Jak to inaczej uporządkować ?
A w przypadku 2 wszystko ładnie działa ale jest tylko jedna tekstura ;/

 //   Bitmap ne;
            for (int i = 0; i < 20; i++)
            {
                for (int j = 0; j < 20; j++)
                {
                    float fx = i;
                    float fy = j;
                   //ne = new Bitmap(@"gfx/" + sr.ReadLine());       

                    g.DrawImage(image1, 50 + fx * elementSize, 50 + fy * elementSize, elementSize, elementSize);
                   // g.DrawRectangle(new Pen(Brushes.Brown), 50 + j * elementSize,
                      //  50 + i * elementSize, elementSize, elementSize);
                 //  g.DrawImage(ne, 50 + i * elementSize, 50 + j * elementSize, elementSize, elementSize);
                    if (gameMatrix[i, j] == 1)
                    {
                        
                        //g.FillRectangle(Brushes.Black, 50 + j * elementSize,
                                   //  50 + i * elementSize, elementSize, elementSize);
                       g.DrawImage(image2, 50+i *elementSize, 50+j*elementSize,elementSize,elementSize);
                    }
                    if (gameMatrix[i, j] == 2)
                    {
                        Bitmap ziemia = new Bitmap(titleMapY[i]);
                        Bitmap ziemiaX = new Bitmap(titleMapX[j]);
                        g.FillRectangle(Brushes.Red, 50 + j * elementSize,
                                        50 + i * elementSize, elementSize, elementSize);
                      //  g.DrawImage(ziemia, 50 + fx * elementSize, 50 + fy * elementSize, elementSize, elementSize);
                      //  g.DrawImage(ziemiaX, 50 + fx * elementSize, 50 + fy * elementSize, elementSize, elementSize);
                        ziemia = null;
                        ziemiaX = null;
                    }
                                       
                }
            }
0

no niestety GDI i operowanie w ten sposób na bitmapach jest zbyt wolne żeby zrobić z tego dynamiczną grę
zainteresuj się obsługą DirectX (SharpDX, XNA)

0

Hmm zrobiłem żeby mapa była raz malowana.
tak:

 public void mapa()
        {
            Graphics g;
            StreamReader sr = new StreamReader("mapflags");
            Bitmap ne;
            for (int i = 0; i < 20; i++)
            {
                for (int j = 0; j < 20; j++)
                {
                    float fx = i;
                    float fy = j;
                    ne = new Bitmap(@"gfx/" + sr.ReadLine());  
                    g.DrawImage(ne, 50 + i * elementSize, 50 + j * elementSize, elementSize, elementSize);
                }
            }
        }

Lecz dostaje błąd:

Error   1   Use of unassigned local variable 'g'

a nie chce tego robić przez oczywiście dodając nowej rzeczy mapa(e.Graphics);

private void Form1_Paint(object sender, PaintEventArgs e)
{            
    rysujMape(e.Graphics);             
}

dodanie znacznika <code class="none"> - @furious programming

0

Musisz zainicjować zmienną "g".

0

dałem i lipa nie chce działać , działa to rysowanie tylko przez

 private void Form1_Paint(object sender, PaintEventArgs e)
{            
    rysujMape(e.Graphics);             
}

da rade to inaczej rozwiązać ?

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