Beispiel #1
0
void Scene::update(float deltaTime)
{
    frameNumber++;
#if VERBOSE_PERFORMANCE_TIME
    timeval startTime;
    if(frameNumber <= 3)
        gettimeofday(&startTime, NULL);
#endif
    currentTime += deltaTime;
#if VERBOSE_GENERAL_INFO
    CCLOG("Begin scene update");
#endif
    for(Pausable* obj : updateList)
    {
        //CCLOG("Updating object of type: %s", typeid(*obj).name());
        obj->update(deltaTime);
    }
#if VERBOSE_GENERAL_INFO
    CCLOG("scene update: second part");
#endif
    SceneSwitcher::sharedSwitcher()->trySceneSwitch(deltaTime);
    if(updatablesToRemove.size() > 0)
    {
        //CCLOG("Removing %d updatables", updatablesToRemove->count());
        //Manual release for updateList Ref*
        for(Pausable* obj : updatablesToRemove)
        {
            if(isKindOfClass(obj, Ref))
            {
                dynamic_cast<Ref*>(obj)->release();
            }
        }
        
        updateList.erase(std::remove_if(updateList.begin(),
                                        updateList.end(),
                                        [&](Pausable* obj)
                                        {
                                            return std::find(updatablesToRemove.begin(), updatablesToRemove.end(), obj) != updatablesToRemove.end();
                                        }),
                         updateList.end());
        updatablesToRemove.clear();
    }
    if(updatablesToAdd.size() > 0)
    {
        //CCLOG("Removing %d updatables", updatablesToAdd->count());
        //Manual retain for updateList Ref*
        for(Pausable* obj : updatablesToAdd)
        {
            updateList.push_back(obj);
        }
        updatablesToAdd.clear();
    }
    if(receiversToRemove.size() > 0)
    {
        //CCLOG("Removing %d updatables", updatablesToRemove->count());
        for(GenericRecognizer* recognizer : receiversToRemove)
        {
            touchReceiversList.eraseObject(recognizer);
        }
        receiversToRemove.clear();
    }
    if(receiversToAdd.size() > 0)
    {
        //CCLOG("Removing %d updatables", updatablesToAdd->count());
        for(GenericRecognizer* newReceiver : receiversToAdd)
        {
            newReceiver->setLinker(linker);
        }
        touchReceiversList.pushBack(receiversToAdd);
        receiversToAdd.clear();
    }
    SynchronousReleaser::sharedReleaser()->emptyReleasePool();
#if VERBOSE_GENERAL_INFO
    CCLOG("end scene update");
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    if(frameNumber == 3)
    { //The first 2 frames are left for scene creation and defered label/image loading
        runGarbageCollector();
    }
#endif
#if VERBOSE_PERFORMANCE_TIME
    timeval endTime;
    if(frameNumber <= 3)
    {
        gettimeofday(&endTime, NULL);
        CCLOG("Frame %d of scene %s loaded in %f ms", frameNumber, formatSceneToString(sceneName), getTimeDifferenceMS(startTime, endTime));
    }
#endif
}
void EventResponder::planSceneSwitch(EventCustom* event)
{
    ValueMap infos = ((Value*)event->getUserData())->asValueMap();
    SceneName scene = (SceneName)infos["Scene"].asInt();
    AnalyticsWrapper::logPageView(formatSceneToString(scene));
}