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

[SFML] Wyświetlanie kwadratów - spadek wydajności

Ostatnio zmodyfikowano 2012-01-24 12:32
Autor Wiadomość
Raval
Temat założony przez niniejszego użytkownika
[SFML] Wyświetlanie kwadratów - spadek wydajności
» 2012-01-20 19:42:56
Witam

Chcę wyświetlić 6400 kwadratów o 3 różnych kolorach, kiedy program wyświetla te 6400 jego wydajność sprawia że ilość fps jest równa 7, gdy zmniejszę ilość kwadratów do 1600 ilość fps wynosi 23. Moje pytanie jest następujące czy można to jakoś przyśpieszyć. Do wyświetlania kwadratów używam sprajtów. Poniżej wklejam fragment kodu odpowiadający za rysowanie kwadratów.

C/C++
void sys::rysuj( void )
{
    sf::Image pole;
    pole.Create( rozmiarKratki, rozmiarKratki, sf::Color( 255, 255, 255 ) );
    sf::Sprite kratka;
    kratka.SetImage( pole );
   
    for( int i = 1; i < rozmiar + 1; i++ )
    {
        for( int j = 1; j < rozmiar + 1; j++ )
        {
            if( TAB[ i ][ j ] == 0 )
                 kratka.SetColor( sf::Color( 255, 255, 255 ) );
           
            if( TAB[ i ][ j ] > 0 )
                 kratka.SetColor( sf::Color( 255, 0, 0 ) );
           
            if( TAB[ i ][ j ] < 0 )
                 kratka.SetColor( sf::Color( 0, 255, 0 ) );
           
           
            if( zaznaKratki( i, j ) == true )
            {
                const sf::Input & mysz = okno.GetInput();
               
                if( mysz.IsMouseButtonDown( sf::Mouse::Left ) )
                     TAB[ i ][ j ] = dlZarazenia;
               
            }
            kratka.SetPosition( ST + j * rozmiarKratki, ST + i * rozmiarKratki );
            okno.Draw( kratka );
           
        }
    }
}
P-48960
SeaMonster131
» 2012-01-20 20:15:44
Hm.. nie wiem jak to tam w SFML jest, ale może prymitywy szybsze byłyby? I ja bym wywalił deklarowanie zmiennych w pętli (bo zapewne ta funkcja w pętli jest) ;)
P-48967
akwes
» 2012-01-20 22:02:39

6400 kwadratów

Jeżeli jakiegoś nie widać to nie ma sensu go rysować na przykład. Kwestia znalezienia na tyle optymalnego algorytmu sprawdzania, aby wykonał się szybciej niż wyświetlanie kwadratów, które by były wyświetlone gdyby nie sprawdzanie.

Jeżeli to duże kwadraty, to oszczędność może być konkretna, jeżeli robisz system cząstek to powodzenia :P
P-48981
DejaVu
» 2012-01-20 22:15:44
C/C++
pole.Create( rozmiarKratki, rozmiarKratki, sf::Color( 255, 255, 255 ) );
sf::Sprite kratka;
kratka.SetImage( pole );
1. Czemu co rysowanie tworzysz kratkę?
2. Nie rysuj tych sprajtów co leżą poza ekranem
P-48983
Raval
Temat założony przez niniejszego użytkownika
» 2012-01-21 01:07:23
Wszystkie sprajty(kwadraty) leża na ekranie, ich wielkość przy rozmiarze 80x80 to 5x5 pikseli. Jest to symulacja rozwoju choroby więc muszę wszystkie kratki wyrysować. Mógł bym nie czyścić ekranu po każdym zbudowaniu klatki i nadpisywać te kratki które się zmieniają, ale wtedy regulacja parametrów choroby znajdująca się zaraz obok planszy by była niedokładna. Jutro spróbuję to zrobić za pomocą prymitywów oraz innych wskazówek podanych wyżej i zobaczymy jaki to przyniesie efekt.

Pozdrawiam
P-49000
akwes
» 2012-01-21 01:36:12

muszę wszystkie kratki wyrysować

Jeżeli nie są widoczne to nie ma potrzeby.

Rysowanie nie ma wpływu na to co obliczasz. To że czegoś nie narysujesz nie znaczy że musisz to pominąć w obliczeniach. Jak wykomentujesz wszystkie linie które rysują to i tak obliczenia będą zachodzić. Kwestia sterowania rysowaniem.
P-49001
Raval
Temat założony przez niniejszego użytkownika
» 2012-01-24 12:32:39
Witam

Po kilku kolejnych nieudanych próbach powracam z problemem. Próbowałem korzystać z prymitywów, bez powodzenia. Postanowiłem napisać malutki programik który obrazuje mój problem. Wyświetla on pole 50x50 białych kwadratów na czarnym tle. Przy czym wyświetlenie takiej ilości sprajtów owocuje fps na poziomie 8 klatek. Ktoś może mi wskazać gdzie popełniam błąd lub ewentualnie wytłumaczy dlaczego to działa tak wolno?

C/C++
#include <SFML/Graphics.hpp>

int main()
{
    int i = 1, j = 1;
    sf::Image obraz;
    obraz.Create( 10, 10, sf::Color( 255, 255, 255 ) );
    sf::Sprite sprite;
    sprite.SetImage( obraz );
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 1100, 1000, 32 ), "Kurs SFML - http://cpp0x.pl" );
    while( oknoAplikacji.IsOpened() )
    {
        sf::Event zdarzenie;
        while( oknoAplikacji.GetEvent( zdarzenie ) )
        {
            if( zdarzenie.Type == sf::Event::Closed )
                 oknoAplikacji.Close();
           
            if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Escape )
                 oknoAplikacji.Close();
           
            if( zdarzenie.Type == sf::Event::MouseButtonPressed && zdarzenie.MouseButton.Button == sf::Mouse::Middle )
                 oknoAplikacji.Close();
           
        }
        oknoAplikacji.Clear( sf::Color( 0, 0, 0 ) );
        while( i < 50 )
        //for (int i=1;i<50;i++)
        {
            while( j < 50 )
            //for (int j=1;j<50;j++)
            {
                sprite.SetPosition( 15 * i, 15 * j );
                oknoAplikacji.Draw( sprite );
                j++;
            }
            j = 1;
            i++;
        }
        oknoAplikacji.Display();
        i = 1;
        j = 1;
    }
    return 0;
}
P-49280
« 1 »
  Strona 1 z 1