Autor Wątek: SFML pożera procesor  (Przeczytany 3044 razy)

Offline zz3

  • Użytkownik

# Maj 16, 2011, 00:35:52
Witam. Nie jestem do końca pewien, czy to odpowiedni dział, ale problem dotyczy biblioteki graficznej, więc...
Ale zacznijmy od początku. No więc szukałem jakiejś alternatywy dla Allegro i natknąłem się na SFML. Po krótkiej lekturze informacji na jej temat, zabrałem się do pisania pierwszego programu. Kompilacja przebiegła sprawnie, pozostało już tylko odpalić program. I tutaj byłem bardzo zdziwiony. O ile bez włączonego programu w SFML zużycie procesora wynosiło około 40% na każdy rdzeń, to po włączeniu pierwszy rdzeń jest wykorzystywany w stu procentach, a drugi w osiemdziesięciu. Moje pytanie brzmi więc, czy jest to normalne dla tej biblioteki, czy może po prostu ja mam coś nie tak.

Kod:
#include <SFML/Window.hpp>

int main()
{
sf::Window Okno(sf::VideoMode(800, 600, 32), "Hello!");

while(Okno.IsOpened())
{
sf::Event Zdarzenie;

while(Okno.GetEvent(Zdarzenie))
{
if(Zdarzenie.Type == sf::Event::Closed)
{
Okno.Close();
}
}

Okno.Display();
}

return EXIT_SUCCESS;
}

Wersja GCC: 4.5.2
Wersja SFML: 1.6
System: Ubuntu 11.04

Offline Mr. Spam

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

Offline Lerhes

  • Użytkownik

# Maj 16, 2011, 01:42:28
Kod tak napisałeś, że całe zasoby procesora są wykorzystywane do wykonywania twojego programu -> dlatego otrzymujesz takie wyniki. Poszukaj na tym forum takich tematów bo było ich dużo (jak ten efekt ograniczać).
Szybkim tipsem będzie, po utworzeniu okna dodanie:
Okno.UseVerticalSync(true);Co to jest i co właściwie robi -> dokumentacja.
Lerhes

Offline zz3

  • Użytkownik

# Maj 16, 2011, 10:06:17
Niestety, niewiele to zmieniło. Jedynym efektem jest to, że pierwszy rdzeń wykorzystywany jest w 70%, a drugi w 100%. Szukałem też tutaj na forum tematów związanych z SFML, jednak nie znalazłem niczego, co dotyczyłoby mojego problemu. Przeszukiwanie dokumentacji w celu znalezienia informacji o UseVerticalSync() też niestety zakończyło się fiaskiem.

Offline Esidar

  • Użytkownik

# Maj 16, 2011, 12:47:17
Lerhes ci już napisał w czym jest problem.
while(Okno.IsOpened())
{
}
Ten kod zajmuje 100% czasu bo przez cały czas wykonuje pętlę, ani razu się nie "zatrzymując". Jedyny sposób to użyć np. sleep() (czy co tam jest w linuxie) żeby przekazać CPU na jakiś czas do systemu.

Offline zz3

  • Użytkownik

# Maj 16, 2011, 16:30:00
Dzięki, sf::Sleep(0.033); załatwia sprawę.

Offline WiecznyWem

  • Użytkownik
    • Blog

# Maj 16, 2011, 17:16:29
Można też tak, a możesz też poprostu ograniczyć liczbę FPSów: SetFramerateLimit -> http://www.sfml-dev.org/documentation/1.6/classsf_1_1Window.php#a5544031f1d2965c00532fb5660763f33

Offline bananu7

  • Użytkownik
    • komiks RFMN

# Maj 21, 2011, 12:55:18
Ekhem, nie uważasz, że 33ms to trochę dużo? Przy 60 fps (nadal najczęstsze odświeżanie) klatka ma 0,01(6)s. Ja u siebie ustawiam coś około milisekundy...

Offline Xirdus

  • Redaktor

# Maj 23, 2011, 16:34:32
Ja u siebie ustawiam coś około milisekundy...
To jest przesada w drugą stronę. Z dwojga złego IMO lepiej dać za duży sleep niż za mały.

Offline Liosan

  • Redaktor

# Maj 23, 2011, 16:35:37
Dlaczego? Sleep(0) tez swoje znaczy - "oddaj procesor innym programom".

Liosan

Offline DamianDev

  • Użytkownik

# Wrzesień 28, 2011, 22:49:20
#include <SFML/Window.hpp>

int main()
{
sf::Window Okno(sf::VideoMode(800, 600, 32), "Hello!");
sf::Event Zdarzenie;

while(Okno.IsOpened())
{
while(Okno.GetEvent(Zdarzenie))
{
if(Zdarzenie.Type == sf::Event::Closed)
{
Okno.Close();
}
}
                Okno.Clear(sf::Color(0,0,0));

Okno.Display();
}

return 0;
}

Tak powinno byc dobrze.

Offline Oti

  • Użytkownik

# Wrzesień 28, 2011, 22:59:06
@up

Bo co to niby zmienia?

Offline Xirdus

  • Redaktor

# Wrzesień 30, 2011, 17:45:27
Dobra, starczy. Spam usunięty. Lock.
« Ostatnia zmiana: Wrzesień 30, 2011, 17:52:03 wysłana przez Xirdus »