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 ;) #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 ); ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 100, 0.57, 5, makecol( 200, 200, 200 ) ); ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 160, 0.36, 10, makecol( 100, 60, 0 ) ); ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 220, 0.26, 10, makecol( 0, 100, 0 ) ); ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 280, 0.205, 6, makecol( 120, 70, 0 ) ); ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 340, 0.168, 20, makecol( 125, 75, 0 ) ); ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 400, 0.1427, 11, makecol( 125, 75, 50 ) ); ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 460, 0.1245, 10, makecol( 50, 60, 150 ) ); ISf_Engine->ISf_GFX->AddObject( 512 - 22, 384 - 22 - 520, 0.1105, 10, makecol( 100, 100, 145 ) ); 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" ); blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h ); ISf_Engine->KeyCheck(); } }
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 |