Исходный код
if ( g_nIdleState == 0 )
{ <em>// Initialize the splash screen right away</em>if ( g_CurrentOptions.get_splash_screen() )
fgSplashInit();
g_nIdleState++;
}
elseif ( g_nIdleState == 1 )
g_nIdleState++;
elseif ( g_nIdleState == 2 )
g_nIdleState++;
elseif ( g_nIdleState == 3 )
{
if( !fgInitSubsystems())
{
FG_LOG(__FILE__, __LINE__, FG_DK_GENERAL, FG_FALSE, "Subsystem initializations failed ..." );
exit(-1);
}
g_nIdleState++;
}
elseif ( g_nIdleState == 4 )
{
fgInitVisuals(); <em>// setup OpenGL view parameters</em>
g_nIdleState++;
}
elseif ( g_nIdleState == 5 )
g_nIdleState++;
elseif ( g_nIdleState == 6 )
{
mark_time( &g_tsFrame );
mark_time(&g_tsTime);
g_nIdleState = 1000;
}
if ( g_nIdleState == 1000 )
fgMainLoop();
elseif ( g_CurrentOptions.get_splash_screen() == 1 )
fgSplashUpdate(0.0);
Что не так в исходном коде
Сразу бросается в глаза адская лесенка из вложенных операторов if
— else
, которая в некий момент почему-то неожиданно прерывается.
Когда проходит шок от лесенки, можно рассмотреть в исходном коде смешивание знаний о том, что делать на каждом шаге процесса старта приложения, и как переходить от одного шага к другому.
Также стоит избавляться от магических литералов, заменяя их на константы или на худой конец, на макросы.
Вариант рефакторинга исходного кода
#define STEP_SPLASH_SCREEN 0
#define STEP_SOMETHING_1 1
#define STEP_SOMETHING_2 2
#define STEP_SUBSYSTEMS 3
#define STEP_VISUALS 4
#define STEP_SOMETHING_5 5
#define STEP_MARK_TIME 6
#define STEP_MAIN_LOOP 1000
#define STEP_FIRST_INIT STEP_SPLASH_SCREEN
#define STEP_LAST_INIT STEP_MARK_TIME
void DoBootstrapStep( int step ) {
switch ( step ) {
case STEP_SPLASH_SCREEN:
if ( g_CurrentOptions.get_splash_screen() )
fgSplashInit();
break;
case STEP_SOMETHING_1:
break;
case STEP_SOMETHING_2:
break;
case STEP_SUBSYSTEMS:
if ( !fgInitSubsystems() ) {
FG_LOG(__FILE__, __LINE__, FG_DK_GENERAL, FG_FALSE, "Subsystem initializations failed ..." );
exit(-1);
}
break;
case STEP_VISUALS:
fgInitVisuals(); <em>// setup OpenGL view parameters</em>break;
case STEP_SOMETHING_5:
break;
case STEP_MARK_TIME:
mark_time( &g_tsFrame );
mark_time( &g_tsTime );
break;
case STEP_MAIN_LOOP:
fgMainLoop();
break;
default:
if ( g_CurrentOptions.get_splash_screen() == 1 )
fgSplashUpdate(0.0);
}
}
int GetNextStep( int step ) {
if ( step == STEP_LAST_INIT )
return STEP_MAIN_LOOP;
if ( step < STEP_LAST_INIT )
return step + 1;
}
return step;
}
int main() {
int g_CurrentOptions = STEP_FIRST_INIT;
while ( true ) {
DoBootstrapStep( step );
step = GetNextStep( step );
}
}