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ć. |
|
szyx_yankez |
» 2011-03-03 21:01:27 Odciąrz procesor poprzez:
#include <windows.h> Sleep( 10 );
|
|
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. |
|
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) :
#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 ); 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(); break; case SDLK_LEFT: gracz2.przesun(); break; } } } Sleep( 50 ); tlo = SDL_LoadBMP( "tlo.bmp" ); gracz1.narysuj( tlo ); gracz2.narysuj( tlo ); SDL_BlitSurface( tlo, NULL, ekran, NULL ); SDL_Flip( ekran ); } SDL_FreeSurface( tlo ); SDL_Quit(); return 0; } |
|
WiecznyWem |
» 2011-03-03 22:04:15 Wczytuj obrazek raz, a nie z każdym obiegiem pętli. |
|
malan |
» 2011-03-03 22:10:58 @piotrwalkusz1: Miszczem jesteś :D. |
|
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?
|
|
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 :) |
|
« 1 » 2 |