Problem z optymalizacją ramu..

0

Witam mam problem z optymalizacją programu w borland C++: Robi on 2 screenshoty po czym porownoje ze soba za pomoca scanline po czym podaje wynik w ilu % zmienia sie ekran (wykrywa czy odtwarzany jest film)

int GetDifference (int z )
{
  Graphics::TBitmap *Bmp1 = new Graphics::TBitmap;
  Graphics::TBitmap *Bmp2 = new Graphics::TBitmap;
  TCanvas &PulpitCanvas = *new TCanvas();
 TCanvas &Pulpit2Canvas = *new TCanvas();



 PulpitCanvas.Handle = GetDC(0);
 Bmp1->Width = Screen->Width;
 Bmp1->Height = Screen->Height;
 Bmp1->Canvas->CopyRect(Rect(0, 0, Bmp1->Width, Bmp1->Height), &PulpitCanvas, Rect(0, 0, Bmp1->Width, Bmp1->Height));


             //screenshot1

  ::Sleep(1000);

  Pulpit2Canvas.Handle = GetDC(0);
   Bmp2->Width = Screen->Width;
  Bmp2->Height = Screen->Height;
 Bmp2->Canvas->CopyRect(Rect(0, 0, Bmp2->Width, Bmp2->Height), &Pulpit2Canvas, Rect(0, 0, Bmp2->Width, Bmp2->Height));
              //screenshot2


//W tym momencie pojawia się problem nie wiem jak uwolnic tcanvas


    //TRGBTriple* Pixel1, *Pixel2;
        TRGBTriple *Pixel1, *Pixel2;
    int x, y ,df, perc;

 Bmp1->PixelFormat=pf24bit;
 Bmp2->PixelFormat=pf24bit;


    for(y=0; y<Bmp1->Height; ++y)
    {
        Pixel1 =(TRGBTriple*)Bmp1->ScanLine[y];
        Pixel2 = (TRGBTriple*)Bmp2->ScanLine[y];

        for( x=0; x<Bmp1->Width; ++x)
        {
        ++df;  //zliczanie wszystkich pixeli

            if( (Pixel1->rgbtRed!=Pixel2->rgbtRed) ||
                (Pixel1->rgbtGreen!=Pixel2->rgbtGreen)||
                (Pixel1->rgbtBlue!=Pixel2->rgbtBlue) )  {

                     ++z;
                   //zliczanie zmienionych pixeli
              }



        ++Pixel1;
       ++Pixel2;
        }
    }

           perc=z*100/df;
           //obliczanie wyniku w %

    DeleteObject(Bmp1);
    DeleteObject(Bmp2);




    Pixel1 = NULL;
      Pixel2 = NULL;
        return(perc);
}
0

Nie napisałeś z czym masz problem.

co do optymalizacji to:
wrzuć te zmienne jako pola klasy:
Graphics::TBitmap *Bmp1,*Bmp2;

w konstruktorze utworz je:
Bmp1 = new Graphics::TBitmap;
Bmp2 = new Graphics::TBitmap;

w destuktorze zwolnij miejsce
delete Bmp1;
delete Bmp2;

spójrz na te dwie linijki...
TCanvas &PulpitCanvas = *new TCanvas();
TCanvas &Pulpit2Canvas = *new TCanvas();
teraz spójrz na nie jeszcze raz... wtf? kto Cię takiego zapisu nauczył?

Tak swoją drogą to wydaje mi się, że jak odtwarzasz film to piksele w miejscu gdzie wyświetla się film mają wszystkie identyczny kolor, a film wyświetlany jest w taki sposób, że standardowym sposobem nie jesteś w stanie odczytać tych pikseli...

0

Nie powiem ,że jestem doświadczonym programista a c++ ucze się sam z internetu .

 TCanvas &Pulpit2Canvas = *new TCanvas();
 

Ten zapis znalazłem gdzieś gotową funkcję robiącą screenshoty także nie wiem właściwie co jest źle zapisane a problem mam taki ,że gdy wywołam tą funckję np w timer1 to zaczyna się od 1000 kb ramu i za każdym razem gdy jest wywołana przyrasta całe 5000 kb to dla mnie nie dopuszczalne

DeleteObject(Bmp1);
DeleteObject(Bmp2);

nie wiem czy zauważyłeś ,że usuwam Bmp1 i Bmp2 nie wiem tylko jak pozbyc sie zmiennych tcanvas. Czy może inaczej trzeba to zrobic ? Jeżeli chodzi o działanie programu nie mam zastrzeżeń przy odtwarzaniu filmu pokazuje wynik 30-100 % więc wszystko działa jak trzeba tylko ram zżera . Z góry dziękuje za pomoc pozdrawiam .

0

Lektura na dzis dynamiczna alokacja pamieci(na stercie) i jej zwalnianie.

0

Udało się :) lekturka pomogła robote robilo DeleteObject zamiast delete oraz wcześniej miałem problem z usunięciem zmiennej TCanvas bo pisałem delete PulpitCanvas zamiast &PulpitCanvas

0

Jakbyś był zainteresowany trochę zoptymalizowaną wersją z GUI: diff.rar

0
krwq napisał(a)

Jakbyś był zainteresowany trochę zoptymalizowaną wersją z GUI: diff.rar

Nie jest to do końca to o co mi chodziło ale z pewnością poduczy optymalizacji wielkie dzięki :)

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