Autor Wątek: SDL i wydajność  (Przeczytany 4097 razy)

Offline bartekm

  • Użytkownik
    • Wordpress Blog

# Kwiecień 09, 2010, 10:35:44
Hej, zacząłem programować sobie w SDL-u i mam problem z wydajnością. Piszę sobie silnik, na którym będę robił gry przygodowe 2D typu point&click, kto grał w serię Monkey Island wie o co chodzi. Mam taki problem, że to co napisałem koszmarnie wolno mi chodzi, tzn zarzyna mi procka mimo, że ma dwa rdzenie. Domyślam się, że wszystko chodzi na sofcie, tzn. że do rysowania zmuszany jest procek, a nie karta grafiki. Teoretycznie rozwiązało by sprawę połączenie tego z OpenGL, ale wolałbym pozostać pod samym SDL z tego względu, że pod SDL łatwo się zarządza "powierzchniami" (ang. surfaces) i łatwo można animować obiekt. W OGL trzeba się bawić w jakieś loadery tekstur i w ogóle jest to wszystko bardziej zamotane. I teraz dwa pytania:
1. Czy jeśli połączył bym SDL z OpenGL, czy dalej mógłbym korzystać z SDL-owskich powierzchni, żeby wyświetlać coś na ekranie, czy muszę to zrobić tak jak to się robi pod OpenGL?
2. Czy da się poprawić wydajność np w taki sposób, żeby rysowanie przejęła karta grafiki, ale nie trzeba było korzystać z OGL-a?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline voytech

  • Użytkownik

# Kwiecień 09, 2010, 10:47:13
1. to bardzo zły pomysł, pozatym SDL bez OGLa korzystał z DirectDraw, który już dawno jest nierozwijany. Świat poszedł w 3D nawet gdy robi 2D.
2. wszystko zależy od sterownika i systemu, ale gdy będziesz używał OGLa i próbował starych sposobów z SDL (DirectX) to gwarantowane że te dwa systemy się pogryzą ;)

2D w GL jest bardzo łatwe. Wystarczy ustawić vieport na całe okno i ustawić kamere przy pomocy np. gluOrtho2D i już można rysować powierzchnie przy pomocy quadów z nałożoną teksturą, którą wcześniej ładuje się przy pomocy glTexImage2D. Proste jak drut

Offline bies

  • Użytkownik

# Kwiecień 09, 2010, 10:51:02
Możesz też spróbować glSDL ([1]) ale to rozwiązanie nie jest już rozwijane a sam autor nazywa je hackiem.

[1] http://olofson.net/mixed.html

Offline DrUiD

  • Użytkownik
    • HaCra Team

# Kwiecień 09, 2010, 10:57:38
upewnij sie ze wszystkie zaladowane surface'y masz w tym samym formacie co ekran/okno.. najlepiej dla pewnosci wywoluj po zaladowaniu SDL_DisplayFormat().. do tego ustaw flagi na nich na SDL_HWSURFACE|SDL_HWACCEL

zapewniam Cie ze bedzie poginac bardzo szybko.. no chyba ze masz milion sprite'ow pelnoekranowych.. w takim razie odsylam do HGE

pozdro
« Ostatnia zmiana: Kwiecień 09, 2010, 12:09:40 wysłana przez DrUiD »

Offline voytech

  • Użytkownik

# Kwiecień 09, 2010, 10:58:52
http://forum.warsztat.gd/index.php/topic,10294.msg135727.html#msg135727 tutaj kiedyś komuś tłumaczyłem jak ustawić parametry kamery i widoku oraz jak narysować kwadracik na ekranie. Może się przydać. Z innych tutoriali powinieneś obczaić jak w SDL ustawić parametry OGL i jak załadować tekstury.

Offline bartekm

  • Użytkownik
    • Wordpress Blog

# Kwiecień 09, 2010, 11:38:09
Dzięki za szybką odpowiedź. DrUiD próbowałem twojego sposobu, ale jest to samo. Chyba będę zmuszony przerzucić się na OGL jako render i  SDL do obsługi  I/O. Voytech dzięki za link na pewno skorzystam.

Offline Groshu

  • Użytkownik

# Kwiecień 09, 2010, 11:56:27
Musisz mieć paskudnie niewydajny kod :p U mnie programy z użyciem SDL'a śmigały pod P3 800MHz ;D

Offline DrUiD

  • Użytkownik
    • HaCra Team

# Kwiecień 09, 2010, 12:11:36
tez mi sie wydaje ze to kwestia kodu.. na Celeronie 400MHz + Virge 4MB mialem z tego co pamietam 40fps przy pelno ekranowym 1024x768 odswierzaniu tiles'ami 32x32.. na Althlonie XP 1700+ + GF2 jakies 130fps

Offline bartekm

  • Użytkownik
    • Wordpress Blog

# Kwiecień 09, 2010, 12:20:43
Ok w takim razie powiedzcie mi jak u was chodzi taki przykładowy kod:
#include <SDL/SDL.h>

SDL_Event zdarzenie;
SDL_Surface *ekran;
bool quit = false;

int main(int argc, char *argv[])
{
SDL_Init(SDL_INIT_EVERYTHING);

ekran = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE | SDL_HWACCEL);
SDL_WM_SetCaption("SDL_Window" ,NULL);

while(!quit)
{
SDL_FillRect(ekran,NULL,0);

SDL_PollEvent(&zdarzenie);

if(zdarzenie.type == SDL_QUIT)
{
quit = true;
}

SDL_Flip(ekran);
}

SDL_Quit();

return 0;
}

Wszystko wydaje się w nim w porządku, a jednak zarzyna mi procka. A to tylko zwykła inicjalizacja okienka. Czy coś jest z nim nie tak?
« Ostatnia zmiana: Kwiecień 09, 2010, 12:24:42 wysłana przez beem »

Offline ZiggySawdust

  • Użytkownik

# Kwiecień 09, 2010, 12:46:36
Cytuj
Wszystko wydaje się w nim w porządku, a jednak zarzyna mi procka. A to tylko zwykła inicjalizacja okienka. Czy coś jest z nim nie tak?
Wydaje Ci się, że to "zarzyna procka", bo to nieskończona pętla z odświeżaniem ekranu, a nie tylko inicializacja okienka.
Gdybyś dodał do tego licznik fps to przekonałbyś się, że nie ma się czym martwić...

Offline bartekm

  • Użytkownik
    • Wordpress Blog

# Kwiecień 09, 2010, 13:11:12
Cytuj
Wszystko wydaje się w nim w porządku, a jednak zarzyna mi procka. A to tylko zwykła inicjalizacja okienka. Czy coś jest z nim nie tak?
Wydaje Ci się, że to "zarzyna procka", bo to nieskończona pętla z odświeżaniem ekranu, a nie tylko inicializacja okienka.
Gdybyś dodał do tego licznik fps to przekonałbyś się, że nie ma się czym martwić...

Wystarczy spojrzeć na zużycie procka przy uruchomieniu tego kodu, żeby zobaczyć, że coś jest nie tak. W zwykłej aplikacji OGL też jest pętla nieskończona, ale tak nie zużywa procesora jak SDL. W mojej aplikacji, w której jest zwykła bitmapa 24x32 poruszana za pomocą kursora, wystarczy przełączyć na wysoką rozdzielczość np. 1680x1050 i już widać, że się tnie.

Offline ZiggySawdust

  • Użytkownik

# Kwiecień 09, 2010, 13:38:31
Podejrzane... A nie mógłbyś zamieścić fragmentu kodu z "pętlą rysującą"? 

Offline bartekm

  • Użytkownik
    • Wordpress Blog

# Kwiecień 09, 2010, 13:56:44
Podejrzane... A nie mógłbyś zamieścić fragmentu kodu z "pętlą rysującą"? 

Mógłbym, ale zapewniam, że kod jest w porządku i nie jest skomplikowany. Zwyczajne zrzucanie powierzchni na ekran, wzorowałem się na tutorialu, więc powinno być ok. Ale i tak chyba przerzucę się na OGL+SDL, bo dodatkowy wymiar może się przydać w grach typu point&click, a w czysty SDL chyba 3D nie obsłuży. 

Offline rm-f

  • Użytkownik

# Kwiecień 09, 2010, 14:03:15
dodaj do pętli sdl-sleep(1);

Offline Liosan

  • Redaktor

# Kwiecień 09, 2010, 14:17:30
Kolega ma problem z niską wydajnością, nie zużyciem procka.

W mojej aplikacji, w której jest zwykła bitmapa 24x32 poruszana za pomocą kursora, wystarczy przełączyć na wysoką rozdzielczość np. 1680x1050 i już widać, że się tnie.
Chociaż może faktycznie powinieneś mierzyć FPS?

Liosan