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ść
pekfos
» 2014-09-07 21:27:05
Mało.
P-116724
informatykos
Temat założony przez niniejszego użytkownika
» 2014-09-07 21:49:57
Tutaj jest jeszcze klasa do rysowania mapy. Z tego co patrzyłem to właśnie engine i TileMap są istotne bo gdy wyrzucimy
target.draw(m_vertices, states); - z jednej z funkcji TileMap lub
oknoAplikacji.draw( map ); - Enginu. To zaczyna wtedy postać chodzić gładko.


C/C++
#pragma once
#include <SFML\Graphics.hpp>
#include <string>
#include <vector>



class TileMap
    : public sf::Drawable
     , public sf::Transformable
{
public:
   
    bool load( const std::string & tileset, sf::Vector2u tileSize, const int * tiles, unsigned int width, unsigned int height )
    {
        // wczytanie atlasu tekstur
        if( !m_tileset.loadFromFile( tileset ) )
             return false;
       
        // zmiana rozmiaru tablicy, tak aby pasowała do wielkości mapy
        m_vertices.setPrimitiveType( sf::Quads );
        m_vertices.resize( width * height * 4 );
       
        // zapełnianie vertex array, po jednym na kafel
        for( unsigned int i = 0; i < width; ++i )
        for( unsigned int j = 0; j < height; ++j )
        {
            // pobranie obecnego numeru kafla
            int tileNumber = tiles[ i + j * width ];
           
            // znalezienie jego pozycji na tileset
            int tu = tileNumber %( m_tileset.getSize().x / tileSize.x );
            int tv = tileNumber /( m_tileset.getSize().x / tileSize.x );
           
            // pobranie wskaźnika do bieżącego kafla czworokąta
            sf::Vertex * quad = & m_vertices[( i + j * width ) * 4 ];
           
            // ustawienie 4 rogów
            quad[ 0 ].position = sf::Vector2f( i * tileSize.x, j * tileSize.y );
            quad[ 1 ].position = sf::Vector2f(( i + 1 ) * tileSize.x, j * tileSize.y );
            quad[ 2 ].position = sf::Vector2f(( i + 1 ) * tileSize.x,( j + 1 ) * tileSize.y );
            quad[ 3 ].position = sf::Vector2f( i * tileSize.x,( j + 1 ) * tileSize.y );
           
            // ustawienie 4 współrzędnych tekstury
            quad[ 0 ].texCoords = sf::Vector2f( tu * tileSize.x, tv * tileSize.y );
            quad[ 1 ].texCoords = sf::Vector2f(( tu + 1 ) * tileSize.x, tv * tileSize.y );
            quad[ 2 ].texCoords = sf::Vector2f(( tu + 1 ) * tileSize.x,( tv + 1 ) * tileSize.y );
            quad[ 3 ].texCoords = sf::Vector2f( tu * tileSize.x,( tv + 1 ) * tileSize.y );
        }
       
        return true;
    }
   
private:
   
    virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const
    {
        // ustawienie przekształceń
        states.transform *= getTransform();
       
        // ustawienie tekstury
        states.texture = & m_tileset;
       
        // narysowanie
        target.draw( m_vertices, states );
    }
   
    sf::VertexArray m_vertices;
    sf::Texture m_tileset;
};
P-116727
pekfos
» 2014-09-07 22:05:47
C/C++
if( zegar.getElapsedTime() > sf::seconds( 0.1 ) )
{
    player.update();
    zegar.restart();
}
Na pewno powinien być tu ten warunek? Próbuj też wywalić wywołanie setFramerateLimit().
P-116729
informatykos
Temat założony przez niniejszego użytkownika
» 2014-09-07 22:09:17
Nawet jak wyrzucę ten warunek i setFramerateLimit() to dalej tnie. A właśnie, SFML powinien obsłużyć na spokojnie tyle kafelków prawda?
P-116731
pekfos
» 2014-09-07 22:12:29
A właśnie, SFML powinien obsłużyć na spokojnie tyle kafelków prawda?
Powinien. Co rozumiesz przez 'tnie'? Mało fps? Jakiś konkretny element nie działa płynnie?
P-116733
informatykos
Temat założony przez niniejszego użytkownika
» 2014-09-07 22:20:32
hm.. to jest właśnie chyba za mało FPS'ów. Kiedy ruszam postacią na mapie zapełnionej kafelkami to postać nie porusza się płynnie. Kiedy ruszam nią w bok i kamera (View) rusza się wraz z postacią to widać że gdy jest np 3/4 kafli jeszcze na scenie to te kafle też nie "uciekają" na bok płynnie jak i postać. Kiedy na scenie zostaje 1/4 kafelków (3/4 jest już poza widokiem ekranu) to postać porusza się już płynnie, tak samo jak kafelki.
P-116735
pekfos
» 2014-09-07 22:30:03
Pokaż kod klasy Player.
P-116738
informatykos
Temat założony przez niniejszego użytkownika
» 2014-09-07 22:45:58
Plik nagłówkowy:

C/C++
#pragma once
#include <SFML\Graphics.hpp>
#include <vector>

class Player
    : public sf::Drawable
     , public sf::Transformable
{
   
public:
    sf::Sprite sprite;
    sf::Texture texture;
   
    Player( void );
   
    enum Status {
        IDZ,
        STOJ
    };
   
   
    Status getStatus();
   
   
    int x;
    int y;
    float pos_x;
    float pos_y;
    int zycie;
    int sila;
   
   
    void idz( float a, float b );
   
   
    void update();
   
    void stop();
   
   
protected:
    int klatka_animacji;
   
   
private:
    virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const
    {
        //rysowanie obiektow, które składają się na narysowanie naszej postaci
        target.draw( sprite );
    }
   
    Status status;
   
    sf::Clock anim_clock;
   
    float speed;
    size_t frame;
   
};


Plik cpp:

C/C++
#include "Player.h"
#include <Windows.h>
#include "Engine.h"
#include <math.h>
#include <iostream>

#define M_PI 3.14159265358979323846

Player::Player( void )
{
    //Wczytanie tekstury do sprajta i ustawienie sprajta
    texture.loadFromFile( "player.png" );
   
    pos_x = 0;
    pos_y = 500;
   
    sprite.setTexture( texture );
    sprite.setPosition( sf::Vector2f( pos_x, pos_y ) );
   
   
    sprite.setTextureRect( sf::IntRect( 0, 0, 64, 64 ) );
   
    status = STOJ;
   
    frame = 0;
    speed = 1.5;
}

void Player::idz( float a, float b )
{
    status = IDZ;
    sprite.move( a, b );
   
    pos_x += a;
    pos_y += b;
}

void Player::update()
{
    if( anim_clock.getElapsedTime() > sf::seconds( 0.09f ) )
    {
        if( status == STOJ ) return;
       
        if( frame < 7 /*liczba klatek animacji*/ )
             frame++;
        else
             frame = 0; //zapetlanie animacji
       
        sprite.setTextureRect( sf::IntRect( frame * 64, 0, 64, 64 ) );
        //x, y, szerokosc, wysokosc
       
        anim_clock.restart();
    }
}

void Player::stop()
{
    status = STOJ;
    frame = 0;
}


P-116742
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona