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;
}
Exemple #2
0
CCEngine::~CCEngine()
{
    // Run remaining callbacks
    while( nativeThreadCallbacks.length > 0 || engineThreadCallbacks.length > 0 )
    {
        while( nativeThreadCallbacks.length > 0 )
        {
        	CCLambdaCallback *callback = nativeThreadCallbacks.list[0];
        	nativeThreadCallbacks.remove( callback );
        	callback->safeRun();
            delete callback;
        }

        while( engineThreadCallbacks.length > 0 )
        {
        	CCLambdaCallback *callback = engineThreadCallbacks.list[0];
        	engineThreadCallbacks.remove( callback );
        	callback->safeRun();
            delete callback;
        }
    }

    delete urlManager;
	delete textureManager;
	delete controls;
	delete renderer;

	gEngine = NULL;

    CCNativeThreadUnlock();
}
Exemple #3
0
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 );
	}
}
Exemple #4
0
CCEngine::~CCEngine()
{		
	scenes.deleteObjectsAndList( true );
	cameras.deleteObjectsAndList();
	
    delete urlManager;
	delete textureManager;
	delete controls;
	delete renderer;

	gEngine = NULL;
	
    CCNativeThreadUnlock();
}
Exemple #5
0
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();
}
Exemple #8
0
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;
}
Exemple #9
0
CCEngine::~CCEngine()
{
    onWebViewLoaded.deleteObjects();
    onWebJSLoaded.deleteObjects();
    onWebJSEvalResult.deleteObjects();
    onKeyboardUpdate.deleteObjects();
    onPause.deleteObjects();
    onResume.deleteObjects();

    // Run remaining callbacks
    while( nativeThreadCallbacks.length > 0 || engineThreadCallbacks.length > 0 )
    {
        while( nativeThreadCallbacks.length > 0 )
        {
        	CCLambdaCallback *callback = nativeThreadCallbacks.list[0];
        	nativeThreadCallbacks.remove( callback );
        	callback->safeRun();
            delete callback;
        }

        while( engineThreadCallbacks.length > 0 )
        {
        	CCLambdaCallback *callback = engineThreadCallbacks.list[0];
        	engineThreadCallbacks.remove( callback );
        	callback->safeRun();
            delete callback;
        }
    }

    delete cameraRecorder;
    delete urlManager;
	delete textureManager;
	delete controls;
	delete renderer;

	gEngine = NULL;

    CCNativeThreadUnlock();
}
Exemple #10
0
void CCEngine::nativeToEngineThread(CCLambdaCallback *lambdaCallback)
{
    CCNativeThreadLock();
    nextEngineUpdate( lambdaCallback, 0 );
    CCNativeThreadUnlock();
}
Exemple #11
0
void CCEngine::engineToNativeThread(CCLambdaCallback *lambdaCallback)
{
    CCNativeThreadLock();
    nativeThreadCallbacks.add( lambdaCallback );
    CCNativeThreadUnlock();
}
Exemple #12
0
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
}
Exemple #13
0
void CCEngine::nativeToEngineThread(CCLambdaCallback *lambdaCallback, const bool pushToFront)
{
    CCNativeThreadLock();
    nextEngineUpdate( lambdaCallback, pushToFront ? 0 : -1 );
    CCNativeThreadUnlock();
}
Exemple #14
0
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
}
Exemple #15
0
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
}