У меня проблема с оптимизацией LTO во FlasCC.
При компиляции с -O1 результирующий swf работает просто отлично.
Но с параметром -O4 он сначала работает нормально, но затем внезапно зависает при вызове определенной виртуальной функции на время более 15 секунд, а затем Flash останавливает его.
Я добавил printfs, чтобы отследить точную точку зависания, используя Flash-логи.
Он зависает в printf («Program_Step: vis init»), никогда не входя в реальную реализацию Initialize (). Указатель объявлен как IGameVisualizer * m_pVisualizer;
Код:
virtual void Program_Step( IProgramStep & step )
{
if ( !m_init )
{
if ( m_initCounter > 0 )
{
printf( "\n Program_Step : Later... %d skips left", m_initCounter );
--m_initCounter;
return;
}
printf( "\n Program_Step : Init" );
m_init = true;
m_pVisualizer = Create_SlotsVisualizer_V1();
printf( "\n Program_Step : m_pLogic" );
m_pLogic = Create_SlotsLogic_Test();
if ( m_pVisualizer )
{
printf( "\n Program_Step : vis init" );
m_pVisualizer->Initialize();
}
if ( m_pLogic )
{
printf( "\n Program_Step : logic init" );
m_pLogic->Initialize( *this );
}
printf( "\n Program_Step : after inits" );
}
int dt = step.GetTimeDeltaMsec();
ProcessControls( dt );
if ( m_pLogic )
m_pLogic->Process( dt, *this );
if ( m_pVisualizer )
m_pVisualizer->Process( dt );
}
Хорошо, я определил причины:
1) printf () не показывал реальное место даже после fflush ()
2) одна из библиотек была скомпилирована с -O1, но часть ее кода класса находится в общедоступном встроенном методе и была скомпилирована с -O4 как часть другой библиотеки => очевидно, эти две несовместимы, что вызвало бесконечный цикл в парсинг двоичного потока …
Других решений пока нет …