Beispiel #1
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();
}
Beispiel #2
0
const bool CCEngine::updateJobsThread()
{	
    // Run callbacks
	if( jobsThreadCallbacks.length > 0 )
    {
        CCJobsThreadLock();
        CCLambdaCallback *callback = jobsThreadCallbacks.pop();
        CCJobsThreadUnlock();
        callback->run();
        delete callback;
        return true;
    }
    return false;
}
Beispiel #3
0
bool CCEngine::updateJobsThread(const bool multicore)
{
    // If we have more than one CPU we can process more jobs
    if( multicore || textureManager == NULL || !textureManager->isReady() )
    {
        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;

        bool updated = false;
        while( jobsThreadCallbacks.length > 0 )
        {
            CCJobsThreadLock();
            CCLambdaCallback *callback = jobsThreadCallbacks.pop();
            CCJobsThreadUnlock();
            callback->safeRun();
            delete callback;
            updated = true;

            jobsProcessed++;
            if( textureManager != NULL && textureManager->isReady() )
            {
				currentTime = CCEngine::GetSystemTime();
				if( currentTime > finishTime )
				{
					//DEBUGLOG( "Max jobsThreadCallbacks processed in time %i, %i\n", jobsProcessed, engineThreadCallbacks.length );
					break;
				}
            }
        }
        return updated;
    }
    
    // One job per call on single cores
	if( jobsThreadCallbacks.length > 0 )
    {
        CCJobsThreadLock();
        CCLambdaCallback *callback = jobsThreadCallbacks.pop();
        CCJobsThreadUnlock();
        callback->safeRun();
        delete callback;
        return true;
    }
    return false;
}
Beispiel #4
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;
}
Beispiel #5
0
bool CCEngine::updateJobsThread()
{
    // Run callbacks
    CCJobsThreadLock();

	static bool RUNNING_JOB = false;
	if( jobsThreadCallbacks.length > 0 && !RUNNING_JOB )
    {
		RUNNING_JOB = true;

        CCLambdaCallback *callback = jobsThreadCallbacks.pop();
        CCJobsThreadUnlock();

		auto currentThread = Concurrency::task_continuation_context::use_current();
		Concurrency::create_task([this, callback] {
			
			// Runs on a random thread
			if( callback->isActive() )
			{
				callback->safeRunOnly();
			}

		}).then([this, callback]() {
			
			// Finishes on current thread
			if( callback->isActive() )
			{
				callback->safeFinishOnly();
			}
			delete callback;

			RUNNING_JOB = false;

		}, currentThread ); // schedule this continuation to run in the current context.
    }

	CCJobsThreadUnlock();
    return false;
}
Beispiel #6
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();
}
Beispiel #7
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
}
Beispiel #8
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
}
Beispiel #9
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
}