cocos2d не работает на 60 FPS с фиксированным временем - PullRequest
1 голос
/ 08 августа 2011

Я использую 40 FPS в моем приложении iOS cocos2d с 80 объектами Box2d. Я использую фиксированный временной шаг:

-(void) update: (ccTime) dt
{
if( gameState_ != kGameStatePaused ) {
world_->Step(dt, 6, 1 );

....
}

Почему это происходит? Спасибо.

Ответы [ 2 ]

1 голос
/ 24 апреля 2017

У текущего принятого ответа есть некоторые проблемы ... когда я попробовал его и в моей игре с быстрой прокруткой я увидел дрожание для главного героя, а камера следовала за ним. Я нашел подробности (почему это неправильно) об этом коде здесь http://box2d.org/forum/viewtopic.php?t=5619

Итак, я думаю, что лучше использовать более мощное решение с интерполяцией: http://plaincode.blogspot.com/2012/05/fixed-timestep-in-cocos2d-x-with-box2d.html

1 голос
/ 23 августа 2011

Это лучший фиксированный временной шаг:

//FIX TIME STEP
///////--->>>>>>>>>>>>>
const float32 FIXED_TIMESTEP = 1.0f / 60.0f;

// Minimum remaining time to avoid box2d unstability caused by very small delta times
// if remaining time to simulate is smaller than this, the rest of time will be added to the last step,
// instead of performing one more single step with only the small delta time.
const float32 MINIMUM_TIMESTEP = 1.0f / 600.0f;  

const int32 VELOCITY_ITERATIONS = 8;
const int32 POSITION_ITERATIONS = 8;

// maximum number of steps per tick to avoid spiral of death
const int32 MAXIMUM_NUMBER_OF_STEPS = 25;
///////<<<<<<<<<<<<<<<<<<-------------------

//FIX TIME STEP----------->>>>>>>>>>>>>>>>
-(void)afterStep {

     // process collisions and result from callbacks called by the step
}


-(void)step:(ccTime)dt {
    float32 frameTime = dt;
    int stepsPerformed = 0;
    while ( (frameTime > 0.0) && (stepsPerformed < MAXIMUM_NUMBER_OF_STEPS) ){
        float32 deltaTime = std::min( frameTime, FIXED_TIMESTEP );
        frameTime -= deltaTime;
        if (frameTime < MINIMUM_TIMESTEP) {
            deltaTime += frameTime;
            frameTime = 0.0f;
        }
        world->Step(deltaTime,VELOCITY_ITERATIONS,POSITION_ITERATIONS);
        stepsPerformed++;
        [self afterStep]; // process collisions and result from callbacks called by the step
    }
    world->ClearForces ();
}
//FIX TIME STEP<<<<<<<<<<<<<<<<<------------------


-(void) tick: (ccTime) dt
{
    //It is recommended that a fixed time step is used with Box2D for stability
    //of the simulation, however, we are using a variable time step here.
    //You need to make an informed choice, the following URL is useful
    //http://gafferongames.com/game-physics/fix-your-timestep/

    // Instruct the world to perform a single step of simulation. It is
    // generally best to keep the time step and iterations fixed.
    //  world->Step(dt, velocityIterations, positionIterations);
    [self step:dt];

    //Iterate over the bodies in the physics world
    for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
    {
        if (b->GetUserData() != NULL) {

            CCSprite *myActor;
            myActor = (CCSprite*)b->GetUserData();

            myActor.position = CGPointMake( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
            myActor.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...