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

[SFML 2.1] Spadek wydajności przy dużej liczbie kafelków

Ostatnio zmodyfikowano 2014-09-09 16:48
Autor Wiadomość
informatykos
Temat założony przez niniejszego użytkownika
[SFML 2.1] Spadek wydajności przy dużej liczbie kafelków
» 2014-09-06 17:02:13
Cześć, ostatnio zrobiłem mapę kafelkową i mam problem, chodzi o to że gdy na mapie jest dużo kafli np. 300 to postać zaczyna powoli chodzić. Problem występuje nawet gdy poza widoczną częścią ekranu nie ma innych kafli, tylko w widocznej części jest ich sporo. Wykorzystuję wielkość kafli 40x40 i ich liczba w pionie to 18 a w poziomie 32. Jestem pewny że jest spowodowane to rysowaniem ich w głównej pętli programu. Wygląda to tak:

for(int i=0;i<level.height;i++)
  for(int j=0;j<level.width;j++)
   if(level.poziom[j].type != Level::NONE)
     oknoAplikacji.draw(sprite[j]);

czyli jest co chwilę od nowa rysowana mapa. Ale tutaj mam pytanie: jak zrobić żebym nie musiał rysować jej co chwile od nowa? Lub czy da się rozwiązać mój problem w inny sposób. Problem spadku wydajności występuje zarówno w trybie Debug jak i Release.
P-116680
pekfos
» 2014-09-06 17:14:26
Map kafelkowych w SFML nie implementuje się na sprajtach, lecz na vertexach. Ale raczej nie tylko to tu powoduje spadek wydajności, za duży trochę..
P-116681
informatykos
Temat założony przez niniejszego użytkownika
» 2014-09-06 17:38:15
Hmm, spróbuje więc zrobić to na vertexach, bo jak dam w głównej pętli drugi raz te 2 pętle rysujące mapę to spadek wydajności jest podwójny(albo i większy) ;) czyli to chodzi na pewno o te 2 pętle rysujące :P Ale jakby ktoś jeszcze miał inne pomysły to jestem otwarty na rozwiązania :D
P-116682
ison
» 2014-09-07 11:09:48
bo jak dam w głównej pętli drugi raz te 2 pętle rysujące mapę to spadek wydajności jest podwójny(albo i większy) ;)
Co rozumiesz przez podwójny spadek wydajności? Dwukrotnie mniejszy FPS czy dwukrotnie dłuższy czas wykonania? Pamiętaj, że im większy FPS tym szybciej będzie spadać po narysowaniu czegokolwiek.

Cześć, ostatnio zrobiłem mapę kafelkową i mam problem, chodzi o to że gdy na mapie jest dużo kafli np. 300 to postać zaczyna powoli chodzić.
Korzystasz z delty albo fixed time step?
P-116697
informatykos
Temat założony przez niniejszego użytkownika
» 2014-09-07 13:18:29
Działa!! Delta zadziałała, dzięki wielkie ison! :) Postać teraz chodzi zawsze z taką samą prędkością :) Jeszcze przy dużym kawałku wczytywania mapy są takie lekkie hm..ścięcia przy poruszaniu kamery, ale tak jak mówił pekfos zrobiłem to na sprajtach a teraz spróbuje na vertexach. Dzięki Wam za pomoc, temat zamykam :)
P-116700
informatykos
Temat założony przez niniejszego użytkownika
» 2014-09-07 19:07:42
ehh.. niestety, zrobiłem na Vertexach i dalej to samo :/ Jeżeli mam scenę wypełnioną kaflami( Wielkość kafla 40x40 i ich liczba w pionie to 18 a w poziomie 32) to postać idąc przycina zauważalnie. Mam teraz zrobioną deltę więc jak wyjdzie za ekran a kamera dzięki View razem z postacią to postać zaczyna gładko chodzić po mapie, a gdy wejdzie w scenę gdzie zaczynają się kafle to zaczyna ścinać. Im więcej kafli widać tym bardziej ścina. Próbowałem też ograniczać fpsy getFrameRatem - to nie o to chodzi :/ Już człowiek popada w desperację jak siedzi nad tym x godzin...
P-116712
pekfos
» 2014-09-07 20:30:25
Nie ma kodu - nie ma problemu.
P-116716
informatykos
Temat założony przez niniejszego użytkownika
» 2014-09-07 21:21:39
Ok tutaj jest kod ;)



C/C++
void Engine::runEngine( sf::RenderWindow & oknoAplikacji )
{
    int p1, p2;
    bool menu = false;
    bool pom;
    sf::View view;
    view.reset( sf::FloatRect( 100, 100, 1280, 720 ) );
    view.setCenter( 640, 360 );
    int i = 0;
   
    Player player;
    sf::Clock zegar;
   
    sf::Clock clock;
    sf::Time time;
    float delta_t = 0.0f;
    oknoAplikacji.setFramerateLimit( 60 );
   
    const int lvl[] =
    {
        0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 1, 0, 0, 2, 0, 3, 3, 3, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 1, 1, 0, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 1, 0, 0, 2, 0, 3, 3, 3, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 1, 1, 0, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    };
   
    // stworzenie mapy
    TileMap map;
    map.load( "tiles.png", sf::Vector2u( 40, 40 ), lvl, 32, 18 );
   
   
   
   
    while( !menu )
    {
       
       
       
        p1 = player.pos_x;
        p2 = player.pos_y;
        pom = false;
        sf::Event zdarzenie;
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) )
        {
            player.idz( 0, - 150 * delta_t );
           
        }
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) )
        {
            player.idz( 150 * delta_t, 0 );
            if( player.pos_x > 640 )
                 view.setCenter( player.pos_x, 360 );
           
        }
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) )
        {
            player.idz( 0, 150 * delta_t );
        }
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) )
        {
            player.idz( - 150 * delta_t, 0 );
            if( player.pos_x > 640 )
                 view.setCenter( player.pos_x, 360 );
           
        }
       
       
       
       
        while( oknoAplikacji.pollEvent( zdarzenie ) ) // <-petla główna eventów
        {
           
            if( zdarzenie.type == sf::Event::Closed )
                 oknoAplikacji.close();
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 menu = true;
           
            if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle )
                 oknoAplikacji.close();
           
           
            if( zdarzenie.type == sf::Event::KeyReleased )
            {
                player.stop();
            }
        }
       
        if( zegar.getElapsedTime() > sf::seconds( 0.1 ) )
        {
            player.update();
            zegar.restart();
        }
       
       
        /*for(int i=0;i<level.height;i++)
        {
        for(int j=0;j<level.width;j++)
        {
        if(Collision::PixelPerfectTest( player.sprite, sprite[i][j] )==true)
        {
        player.idz(p1-player.pos_x,p2-player.pos_y);
       
        player.stop();
        }
        }
        }*/
       
        oknoAplikacji.setView( view );
       
       
        //rysowanie poziomu
       
        oknoAplikacji.clear( sf::Color::White );
       
        oknoAplikacji.draw( map );
        oknoAplikacji.draw( player ); //Rysowanie sprajta(przypisanego do obiektu player) na ekranie
        oknoAplikacji.display();
        time = clock.getElapsedTime();
        delta_t = time.asSeconds();
        clock.restart();
       
       
    }
}
P-116721
« 1 » 2 3
  Strona 1 z 3 Następna strona