Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Prosty program, za duże wymagania. POMOCY!

Ostatnio zmodyfikowano 2011-03-04 19:38
Autor Wiadomość
piotrwalkusz1
Temat założony przez niniejszego użytkownika
Prosty program, za duże wymagania. POMOCY!
» 2011-03-03 20:48:22
Witam!
Mam bardzo poważny problem. Programuje w SDL i stworzyłem prosty program wyświetlający dwóch ludzików. Jak naciśnie się LEFT to do przodu idzie jeden ludziki, a jak A to drugi ludzik. Tylko, że ten program się zacina, a po paru sekundach zawiesza i nic nie można robić. Zobaczyłem w Menadżerze Zadań Windows i wykorzystywał po kilku sekundach
ponad 1 000 000 K procesora i spada do 60 K. Dla porównania przeglądarka Chrome wykorzystuje max. 30 K. Nie wiem czemu ten program ma aż takie wymagania( bo zżera połowę procesora ). Czy moglibyście dać mi radę jak usprawnić mój program? Nie wiem czy to ma coś z tym wspólnego, ale za każdym razem wczytuję biały plik do zmiennej typu SDL_Sureface "tlo" i na nią wklejam te 2 ludziki. Później znowu ją wczytuję i tak dalej. Proszę o odpowiedź. Jak będzie potrzebny kod programu to mogę podać.
P-28819
szyx_yankez
» 2011-03-03 21:01:27
Odciąrz procesor poprzez:
C/C++
#include <windows.h>
Sleep( 10 ); //w pętli głównej[/code]
P-28820
malan
» 2011-03-03 21:17:21
(...)za każdym razem wczytuję biały plik do zmiennej typu SDL_Sureface "tlo" i na nią wklejam te 2 ludziki. Później znowu ją wczytuję i tak dalej.
Jeżeli to wygląda tak jak sobie wyobrażam, to jesteś gigant :D. Zapodaj kod.
P-28821
piotrwalkusz1
Temat założony przez niniejszego użytkownika
» 2011-03-03 21:32:41
Funkcja Sleep() pomogła. Lecz mam problem z Plikiem Stron (pamięć RAM). Za każdym razem jak wczytuję plik do powierzchni Sureface zwiększa się pamięć RAM. Oto kod (bez pliku ludek.h i ludek.cpp) :

C/C++
#include <SDL.h>
#include <windows.h>
#include "ludek.h"
SDL_Surface * ekran = NULL;
SDL_Surface * tlo;
SDL_Event zdarzenie;
bool wyjscie = false;
int main( int argc, char * args[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 800, 400, 32, SDL_SWSURFACE | SDL_DOUBLEBUF );
    SDL_WM_SetCaption( "Neonia 3000E", NULL );
    tlo = SDL_LoadBMP( "tlo.bmp" );
    ludek gracz1( 5, 1 ); // tworzenie egzemplarzy klasy ludek
    ludek gracz2( 205, 2 );
    while( !wyjscie )
    {
        while( SDL_PollEvent( & zdarzenie ) )
        {
            if( zdarzenie.type == SDL_QUIT )
            {
                wyjscie = true;
            }
            if( zdarzenie.type == SDL_KEYDOWN )
            {
                switch( zdarzenie.key.keysym.sym )
                {
                case SDLK_RIGHT:
                    gracz1.przesun(); // dodaje do 1 do zmiennej x
                    break;
                case SDLK_LEFT:
                    gracz2.przesun();
                    break;
                }
            }
        }
        Sleep( 50 );
        tlo = SDL_LoadBMP( "tlo.bmp" );
        gracz1.narysuj( tlo ); //wkleja ludka na powierzchnię podaną w argumencie
        gracz2.narysuj( tlo );
        SDL_BlitSurface( tlo, NULL, ekran, NULL );
        SDL_Flip( ekran );
    }
    SDL_FreeSurface( tlo );
    SDL_Quit();
    return 0;
}
P-28823
WiecznyWem
» 2011-03-03 22:04:15
Wczytuj obrazek raz, a nie z każdym obiegiem pętli.
P-28824
malan
» 2011-03-03 22:10:58
@piotrwalkusz1: Miszczem jesteś :D.
P-28825
piotrwalkusz1
Temat założony przez niniejszego użytkownika
» 2011-03-04 17:42:38
Na swoją obronę dodam, że na początku w czytałem plik do powierzchni tlo2. Później zrobiłem :

tlo=tlo2;

Lecz z dziwnych przyczyn rezultat nie był taki jak oczekiwałem. Po zmianie program wygląda tak :

#include <SDL.h>
#include <windows.h>
#include "ludek.h"
SDL_Surface *ekran=NULL;
SDL_Surface *tlo=NULL;
SDL_Surface *tlo2=NULL;
SDL_Event zdarzenie;
bool wyjscie = false;
int main(int argc, char *args[])
{
    ...
    tlo2=SDL_LoadBMP("tlo.bmp");
    ludek gracz1(5, 1); // konstruktor : 1) argument poz.y, 2) nr ludka
    ludek gracz2(205, 2);
    while(!wyjscie)
    {
        while(SDL_PollEvent(& zdarzenie))
        {
            ...                  
        }
        Sleep(50);
        tlo=tlo2; // ta instrukcja NIE DZIAŁA
        gracz1.narysuj(tlo);
        gracz2.narysuj(tlo);
        SDL_BlitSurface(tlo, NULL, ekran, NULL);
        SDL_Flip(ekran);
    }
    ...
}

Wcześniej był ten kod więc dla oszczędności miejsca trochę go skróciłem. Powierzchnia tlo powinna być co obieg pętli czysta(biała) lecz, gdy ludki idą do przodu za nimi pojawia się charakterystyczna smuga, więc powierzchnia nie jest czyszczona. Dlaczego?



P-28844
ison
» 2011-03-04 19:11:26
Ponieważ pod tlo2 podstawiasz wskaźnik tlo, oba wskaźniki wskazują wtedy na ten sam obiekt -> modyfikując tlo2 (a dokładniej to na co wskazuje wskaźnik tlo2) modyfikujesz również tlo (a dokładniej to na co wskazuje wskaźnik tlo)

tlo=tlo2; // ta instrukcja NIE DZIAŁA
działa, tylko robi nie to czego oczekujesz :)
P-28850
« 1 » 2
  Strona 1 z 2 Następna strona