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

[C++, Allegro] wydajność aplikacji, fps

Ostatnio zmodyfikowano 2010-10-22 16:32
Autor Wiadomość
ison
Temat założony przez niniejszego użytkownika
[C++, Allegro] wydajność aplikacji, fps
» 2010-10-20 15:17:48
witam,
zwracam się do Was jako do doświadczonych programistów i potrzebuję pomocy. Jeśli znajdzie się osoba, która byłaby tak miła i przeanalizowała poniższy kod byłbym niezmiernie wdzięczny :)
moim problem jest nagły spadek FPS, mniej więcej co sekundę, FPS na moment spada chociaż i tak ograniczam go do niewielu (inną sprawą jest że program zżera 70% procka). Szczerze mówiąc nie mam pojęcia co może być przyczyną ale mam nadzieję że ktoś z Was mi pomoże. Kod pisałem w wolnym czasie i nie jest może przejrzysty ale obrazuje mój problem. Jest to swoisty symulator układu słonecznego ;)

C/C++
#include <allegro.h>
#include <winalleg.h>
#include <windows.h>
#include <vector>
#include <cmath>

#define IDLE true
#define TIMER_LOGIC ++fpscounter;

BITMAP * bufor = NULL;

volatile int fps, fpscounter;
void fps_proc() {
    fps = fpscounter;
    fpscounter = 0;
}
END_OF_FUNCTION( fps_proc )
LOCK_VARIABLE( fps )
LOCK_FUNCTION( fps_proc )

volatile int close_button_pressed = FALSE;
void close_button_handler( void ) {
    close_button_pressed = TRUE;
}
END_OF_FUNCTION( close_button_handler )
LOCK_FUNCTION( close_button_handler )

class ISf_CameraViewST
{
public:
    int x, y;
    ISf_CameraViewST()
        : x( 0 )
        , y( 0 )
    { }
    ~ISf_CameraViewST() { }
};

class ISf_ObjectST
{
public:
    double x, y, vel_inc, vel;
    int size, color;
    bool idle;
public:
    ISf_ObjectST() { }
    ISf_ObjectST( double new_x, double new_y, double new_vel_inc, int new_size, int new_color, bool new_idle = false )
        : x( new_x )
        , y( new_y )
        , vel_inc( new_vel_inc )
        , vel( 90.00 )
        , size( new_size )
        , color( new_color )
        , idle( new_idle )
    { }
    ~ISf_ObjectST() { }
    void Logic() {
        if( !idle ) {
            vel += vel_inc;
            x += sin( vel * M_PI / 180 );
            y -= cos( vel * M_PI / 180 );
            if( vel > 360 ) vel -= 360;
           
        }
    }
    void Display( BITMAP * ObjectBuffer, ISf_CameraViewST * ObjectCamera ) {
        circlefill( ObjectBuffer,( int ) x - ObjectCamera->x,( int ) y - ObjectCamera->y, size, color );
    }
};

class ISf_GFXST
{
public:
    std::vector < ISf_ObjectST > ISf_Object;
    ISf_GFXST() {
    }
    ~ISf_GFXST() {
    }
    void AddObject( int new_x, int new_y, double new_vel_inc, int new_size, int new_color, bool new_idle = false ) {
        if( new_idle ) ISf_Object.push_back( ISf_ObjectST( new_x, new_y, new_vel_inc, new_size, new_color, IDLE ) );
        else ISf_Object.push_back( ISf_ObjectST( new_x, new_y, new_vel_inc, new_size, new_color ) );
       
    }
    void LogicAllObjects() {
        for( unsigned int i = 0; i < ISf_Object.size(); ++i )
             ISf_Object[ i ].Logic();
       
    }
    void DisplayAllObjects( BITMAP * ObjectBuffer, ISf_CameraViewST * ObjectCamera ) {
        for( unsigned int i = 0; i < ISf_Object.size(); ++i )
             ISf_Object[ i ].Display( ObjectBuffer, ObjectCamera );
       
    }
};

class ISf_TimerST
{
private:
   
public:
    ISf_TimerST() { }
    ~ISf_TimerST() { }
    void Init( int FPS_C ) {
        install_int_ex( fps_proc, BPS_TO_TIMER( FPS_C ) );
        fps = fpscounter = 0;
    }
};

class ISf_EngineST
{
private:
   
public:
    ISf_GFXST * ISf_GFX;
    ISf_TimerST * ISf_Timer;
    ISf_CameraViewST * ISf_CameraView;
    ISf_EngineST() {
        ISf_GFX = new ISf_GFXST;
        ISf_Timer = new ISf_TimerST;
        ISf_CameraView = new ISf_CameraViewST;
    }
    ~ISf_EngineST() {
        delete ISf_GFX;
        delete ISf_Timer;
        delete ISf_CameraView;
    }
    void EnableCloseButton() {
        set_close_button_callback( close_button_handler );
    }
    void KeyCheck() {
        if( key[ KEY_RIGHT ] ) ISf_CameraView->x++;
       
        if( key[ KEY_LEFT ] ) ISf_CameraView->x--;
       
        if( key[ KEY_UP ] ) ISf_CameraView->y--;
       
        if( key[ KEY_DOWN ] ) ISf_CameraView->y++;
       
    }
    bool CheckForExit() {
        if( key[ KEY_ESC ] ) return true;
       
        if( close_button_pressed ) return true;
       
        return false;
    }
    bool AllegroInit();
};
ISf_EngineST * ISf_Engine;

bool ISf_EngineST::AllegroInit() {
    allegro_init();
    int depth = desktop_color_depth();
    if( depth == 0 ) depth = 32;
   
    set_color_depth( depth );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 1024, 768, 0, 0 );
    clear_to_color( screen, makecol( 0, 0, 0 ) );
    install_keyboard();
    install_mouse();
    install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" );
    set_volume( 255, 255 );
    srand( time( 0 ) );
    bufor = create_bitmap( 1024, 768 );
    return true;
}

void MainLoop()
{
    ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22, 0, 44, makecol( 130, 130, 0 ), IDLE ); //SLONCE
    ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 100, 0.57, 5, makecol( 200, 200, 200 ) ); //MERKURY
    ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 160, 0.36, 10, makecol( 100, 60, 0 ) ); //WENUS
    ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 220, 0.26, 10, makecol( 0, 100, 0 ) ); //ZIEMIA
    ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 280, 0.205, 6, makecol( 120, 70, 0 ) ); //MARS
    ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 340, 0.168, 20, makecol( 125, 75, 0 ) ); //JOWISZ
    ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 400, 0.1427, 11, makecol( 125, 75, 50 ) ); //SATURN
    ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 460, 0.1245, 10, makecol( 50, 60, 150 ) ); //URAN
    ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 520, 0.1105, 10, makecol( 100, 100, 145 ) ); //PLUTON
    while( !ISf_Engine->CheckForExit() ) {
        TIMER_LOGIC
        clear_to_color( bufor, makecol( 0, 0, 0 ) );
        ISf_Engine->ISf_GFX->LogicAllObjects();
        ISf_Engine->ISf_GFX->DisplayAllObjects( bufor, ISf_Engine->ISf_CameraView );
        textprintf_ex( bufor, font, 1024 - 300, 768 - 20, makecol( 255, 255, 255 ), - 1, "Up, Down, Left, Right - camera move" );
        //rectfill(bufor,mouse_x-1,mouse_y-1,mouse_x+1,mouse_y+1,makecol(255,255,255));
        blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h );
        ISf_Engine->KeyCheck();
        //ISf_Engine->ISf_CameraView->x=ISf_Engine->ISf_GFX->ISf_Object[1].x-1024/2;
        //ISf_Engine->ISf_CameraView->y=ISf_Engine->ISf_GFX->ISf_Object[1].y-768/2;
    }
}

int main()
{
    ISf_Engine = new ISf_EngineST;
    if( !ISf_Engine->AllegroInit() )
         exit( 1 );
   
    ISf_Engine->EnableCloseButton();
    ISf_Engine->ISf_Timer->Init( 30 );
   
    MainLoop();
    allegro_exit();
    return 0;
}
END_OF_MAIN()

będę wdzięczny za jakąkolwiek pomoc
P-23055
SeaMonster131
» 2010-10-20 16:32:57
Z tego kodu mało rozumiem, kilka linijek tylko, ale mam radę - jeżeli nikt z "tutejszych" nie będzie wiedział jak rozwiązać Twój problem, możesz napisać na forum gamedev.pl
Jest większe prawdopodobieństwo że [Twój problem] zostanie rozwiązany..(więcej ludzi wchodzi tam np) ;)

Pozdrawiam :)
P-23058
madmike44
» 2010-10-20 16:38:48
Czegoś mi tutaj brakuje.....hmm.. Już wiem - kod powinien mieć KOMENTARZE :P
P-23059
pekfos
» 2010-10-20 17:16:59
procka zżera tyle bo nie ma tu żadnego rest. jakbyś dał czekanie to zużycie byłoby mniejsze. przynajmniej u mnie tak jest:)
P-23063
ison
Temat założony przez niniejszego użytkownika
» 2010-10-20 17:20:25
@madmike44 po co komu komentarze w zaledwie 200 linijkowym kodzie?
@pekfos mógłbyś podać przykład dokładnego timer'a (tak aby wyciągał te +50 FPS) z rest'em aby nie zżerał procka?
P-23065
pekfos
» 2010-10-20 17:23:53
rest( 5 );

w moim programie symulującym ciecz było 40 000 cząsteczek i wyciągało 70 FPS.
po skasowaniu resta FPS wzrosło do 160

//edit:
C/C++
int rest_t = 5;

//.. to: do kodu aktualizującego fps
if( fps < 50 ) rest_t--;

if( fps > 50 ) rest_t++;
//:rest:
rest( rest_t );
;
P-23066
ison
Temat założony przez niniejszego użytkownika
» 2010-10-20 17:25:49
szczerze mówiąc na pierwszy rzut oka nie wydaje mi się ten pomysł zbyt dobry ;P
ale i tak dzięki, głównie chodzi mi o pierwszy problem, zżeranie procka nie jest jeszcze aż tak uporczywe

//edit rzeczywiście obciążenie procka spada, lecz mi jest potrzebna płynna animacja, a takowej wyżej wymienionym sposobem raczej nie dostanę ;/
P-23067
pekfos
» 2010-10-20 17:33:59
buforuj trygonometrię.
C/C++
double tab_sin[ 360 ];
double tab_cos[ 360 ];

void laduj_sin_cos()
{
    for( int i = 0; i < 360; i++ )
    {
        tab_sin[ i ] = sin(( M_PI *( i ) ) / 180 );
        tab_cos[ i ] = cos(( M_PI *( i ) ) / 180 );
    }
}

kod easykodera:)
P-23068
« 1 » 2 3 4
  Strona 1 z 4 Następna strona