bool CCLazyCallback::isCallbackActive(void *pendingCallback, const long pendingID) { CCNativeThreadLock(); for( int i=0; i<activeCallbacks.length; ++i ) { void *activeCallback = activeCallbacks.list[i]; if( activeCallback == pendingCallback ) { // Perhaps the same pointer will be added later on // which will lead to an incorrect call? // Let's cross check with the callback's timestamp if( ((CCLazyCallback*)activeCallback)->lazyID == pendingID ) { CCNativeThreadUnlock(); return true; } #ifdef DEBUGON else { //DEBUGLOG( "Detected that the callback has been deleted and the memory has been replaced by another callback\n" ); } #else break; #endif } } CCNativeThreadUnlock(); return false; }
void CCEngine::updateLoop() { #if defined PROFILEON CCProfiler profile( "CCEngine::updateGame()" ); #endif // Remove any redundant scenes for( int i=0; i<scenes.length; ++i ) { CCSceneBase *scene = scenes.list[i]; if( scene->shouldDelete() ) { removeScene( scene ); i--; } } CCNativeThreadLock(); for( int i=0; i<cameras.length; ++i ) { CCCameraBase *camera = cameras.list[i]; camera->updateControls(); } controls->update( time ); CCNativeThreadUnlock(); // Allow scene to handle the controls first for( int i=0; i<scenes.length; ++i ) { if( scenes.list[i]->updateControls( time ) ) { // If we're not releasing our touch if( controls->getScreenTouches()[0].usingTouch != NULL ) { break; } } } // Run through our controllers first for( int i=0; i<updaters.length; ++i ) { // Delete on finish update CCUpdater *updater = updaters.list[i]; if( updater->update( time.delta ) == false ) { updaters.remove( updater ); DELETE_OBJECT( updater ); } } // Update scene logic for( int i=0; i<scenes.length; ++i ) { CCSceneBase *scene = scenes.list[i]; scene->update( time ); } }
bool CCEngine::updateNativeThread() { // Run callbacks if( nativeThreadCallbacks.length > 0 ) { CCNativeThreadLock(); for( int i=0; i<nativeThreadCallbacks.length; ++i ) { nativeThreadCallbacks.list[i]->safeRun(); delete nativeThreadCallbacks.list[i]; } nativeThreadCallbacks.length = 0; CCNativeThreadUnlock(); } return false; }
CCLazyCallback::~CCLazyCallback() { CCNativeThreadLock(); activeCallbacks.remove( this ); #ifdef DEBUGON for( int i=0; i<activeCallbacks.length; ++i ) { if( activeCallbacks.list[i] == this ) { ASSERT( false ); break; } } #endif CCNativeThreadUnlock(); }
CCLazyCallback::CCLazyCallback() { CCNativeThreadLock(); #ifdef DEBUGON for( int i=0; i<activeCallbacks.length; ++i ) { if( activeCallbacks.list[i] == this ) { ASSERT( false ); break; } } #endif lazyPointer = this; lazyID = activeID++; activeCallbacks.add( lazyPointer ); CCNativeThreadUnlock(); }
bool CCEngine::updateNativeThread() { // Run callbacks if( nativeThreadCallbacks.length > 0 ) { int jobsProcessed = 0; const double startTime = CCEngine::GetSystemTime(); const double finishTime = startTime + 0.002f; // Spend a max of 2ms on this task double currentTime = startTime; while( nativeThreadCallbacks.length > 0 ) { CCNativeThreadLock(); CCLambdaCallback *callback = nativeThreadCallbacks.pop(); if( callback != NULL ) { callback->safeRun(); } CCNativeThreadUnlock(); if( callback != NULL ) { delete callback; } jobsProcessed++; if( textureManager != NULL && textureManager->isReady() ) { currentTime = CCEngine::GetSystemTime(); if( currentTime > finishTime ) { //DEBUGLOG( "Max nativeThreadCallbacks processed in time %i, %i\n", jobsProcessed, engineThreadCallbacks.length ); break; } } } } return false; }
void CCEngine::nativeToEngineThread(CCLambdaCallback *lambdaCallback) { CCNativeThreadLock(); nextEngineUpdate( lambdaCallback, 0 ); CCNativeThreadUnlock(); }
void CCEngine::engineToNativeThread(CCLambdaCallback *lambdaCallback) { CCNativeThreadLock(); nativeThreadCallbacks.add( lambdaCallback ); CCNativeThreadUnlock(); }
void CCEngine::updateEngineThread() { // Update our system time updateTime(); time.lifetime += time.real; #if LOG_FPS static uint loggedUpdates = 0; static float loggedDelta = 0.0f; loggedUpdates++; loggedDelta += time.real; if( loggedDelta > 1.0f ) { #if !defined WP8 && !defined WIN8 const float averageFPS = 1.0f / ( loggedDelta / loggedUpdates ); DEBUGLOG( "Average FPS: %f \n", averageFPS ); #endif loggedUpdates = 0; loggedDelta = 0.0f; } #endif if( backButtonPressed ) { backButtonPressed = false; handleBackButton(); } // Run callbacks if( engineThreadCallbacks.length > 0 ) { CCNativeThreadLock(); CCJobsThreadLock(); while( engineThreadCallbacks.length > 0 ) { CCLambdaCallback *callback = engineThreadCallbacks.pop(); if( callback != NULL ) { callback->safeRun(); delete callback; } } CCNativeThreadUnlock(); CCJobsThreadUnlock(); } finishJobs(); updateLoop(); if( paused == false && pauseRendering == false ) { CCAppManager::UpdateOrientation( time.delta ); renderLoop(); } #if defined DEBUGON && TARGET_IPHONE_SIMULATOR // 66 frames a second in debug //usleep( 15000 ); usleep( 0 ); #endif }
void CCEngine::nativeToEngineThread(CCLambdaCallback *lambdaCallback, const bool pushToFront) { CCNativeThreadLock(); nextEngineUpdate( lambdaCallback, pushToFront ? 0 : -1 ); CCNativeThreadUnlock(); }
void CCEngine::updateEngineThread() { // Update our system time updateTime(); time.lifetime += time.real; #if LOG_FPS static uint loggedUpdates = 0; static float loggedDelta = 0.0f; loggedUpdates++; loggedDelta += time.real; if( loggedDelta > 1.0f ) { #if !defined WP8 && !defined WIN8 const float averageFPS = 1.0f / ( loggedDelta / loggedUpdates ); DEBUGLOG( "Average FPS: %f \n", averageFPS ); #endif loggedUpdates = 0; loggedDelta = 0.0f; } #endif if( backButtonActionPending ) { backButtonActionPending = false; handleBackButton(); } // Run callbacks if( engineThreadCallbacks.length > 0 ) { int jobsProcessed = 0; const double startTime = CCEngine::GetSystemTime(); const double finishTime = startTime + 0.002f; // Spend a max of 2ms on this task double currentTime = startTime; while( engineThreadCallbacks.length > 0 ) { CCNativeThreadLock(); CCJobsThreadLock(); CCLambdaCallback *callback = engineThreadCallbacks.pop(); if( callback != NULL ) { callback->safeRun(); } CCNativeThreadUnlock(); CCJobsThreadUnlock(); if( callback != NULL ) { delete callback; } jobsProcessed++; if( textureManager != NULL && textureManager->isReady() ) { currentTime = CCEngine::GetSystemTime(); if( currentTime > finishTime ) { DEBUGLOG( "Max engineThreadCallbacks processed in time %i, %i\n", jobsProcessed, engineThreadCallbacks.length ); break; } } } } finishJobs(); updateLoop(); if( paused == false ) { CCAppManager::UpdateOrientation( time.delta ); } renderLoop(); #if defined DEBUGON && TARGET_IPHONE_SIMULATOR // 66 frames a second in debug //usleep( 15000 ); usleep( 0 ); #endif }
void CCEngine::updateEngineThread() { // Update our system time if( updateTime() == false ) { #ifdef ANDROID // FIXME: Android needs to always redraw the scene // We currently never return false, so perhaps remove this.. renderer->clear(); renderLoop(); #endif return; } time.lifetime += time.real; #if LOG_FPS static uint loggedUpdates = 0; static float loggedDelta = 0.0f; loggedUpdates++; loggedDelta += time.real; if( loggedDelta > 1.0f ) { const float averageFPS = 1.0f / ( loggedDelta / loggedUpdates ); DEBUGLOG( "Average FPS: %f \n", averageFPS ); loggedUpdates = 0; loggedDelta = 0.0f; } #endif // Run callbacks if( engineThreadCallbacks.length > 0 ) { CCNativeThreadLock(); CCJobsThreadLock(); CCLambdaCallback *callback = engineThreadCallbacks.pop(); CCNativeThreadUnlock(); CCJobsThreadUnlock(); callback->run(); delete callback; // for( int i=0; i<engineThreadCallbacks.length; ++i ) // { // engineThreadCallbacks.list[i]->run(); // delete engineThreadCallbacks.list[i]; // } // engineThreadCallbacks.length = 0; } finishJobs(); updateLoop(); CCViewManager::UpdateOrientation( time.delta ); renderer->clear(); renderLoop(); renderer->resolve(); #if defined DEBUGON && TARGET_IPHONE_SIMULATOR // 66 frames a second in debug //usleep( 15000 ); usleep( 0 ); #endif }