2011-12-15 2 views
1

В настоящее время я рефакторинг кода и одна из вещей, которые я хочу улучшить, это мой код менеджера сущностей. Точнее, функция обновления, где сущности обновляются. Мой движок - это 2D-мозаичный движок, который я использую для игры в iphone. Идея, которая у меня была, заключалась в том, чтобы обновление объекта было разделено на несколько задач, потому что я готов переходить к компонентам на основе компонентов, когда у меня есть время. Это физическая задача, задача обнаружения столкновения, задача AI и т. Д.Мнение организатора цикла

В течение длительного времени я использовал простую функцию update() для моего обновления сущности, вызванного менеджером сущности в цикле. Теперь я столкнулся с другим путем, чтобы сделать это (в конце концов, это то же самое), но дает мне некоторые преимущества, такие как, например, различные тики для различных задач (физика может работать с разной частотой обновления, чем столкновения и т. Д.)

Адрес источника. Я был бы очень рад, если бы кто-нибудь мог комментировать, давать мнения или улучшать его. К сожалению ти является ObjC, но я думаю, что это довольно легко понять:

//Run the update process o nall entities. 
for(int i=0; i< numGameObjects;++i) 
{ 
    GameObject* go=_entities[i]; 

    //If this game object was marked to be delted don't do any process with it. 
    //It will be released when update loop is finished. 
    if(! [go isToBeDeleted]) 
    { 
     //Player does its physics (Movement, etc...) 
     //We save old position to let the onMapCollision know 
     //The previous position before physics were applied. 
     CGPoint oldPos=[go position]; 
     [go doPhysics]; 

     if([go collisionEnabled]) 
     { 
      //Check collisions against map 
      CollisionMask collisionMask=[go collisionMask]; 
      if(collisionMask & MapEntity) 
      { 
       bool collision=[self checkEntityVsMapCollision:go]; 
       if(collision==true) 
        [go onMapCollision:oldPos]; 
      } 

      //Check collisions against other entities (just the ones that have not been checked previously) 
      for(int j=i+1; j < numGameObjects; ++j) 
      { 
       GameObject* otherGO= _entities[j]; 
       EntityType type=[go type]; 
       if((collisionMask & type) && [go collidesWith:otherGO]) 
       { 
        [go onEntityCollision:otherGO]; 
        [otherGO onEntityCollision:go]; 
       } 
      } 
     } 

     //Execute AI for this game object 
     [go doLogic]; 
    } 
} 

Там могут быть некоторые sintactical ошибки в коде, но я просто хотел показать идею. Извините за длинный вопрос, но я думал, что должен объяснить все как можно яснее.

Заранее спасибо.

ответ

1

Таким образом, это выглядит как тонкая петля. Я не вижу причин, чтобы изменить его, если у вас нет проблем. Но поскольку вы разместили здесь, я собираюсь предположить, что у вас проблемы с производительностью.

Этот блок:

//Check collisions against map 
CollisionMask collisionMask=[player collisionMask]; 
if(collisionMask & MapEntity) 
{ 
    bool collision=[self checkEntityVsMapCollision:_player]; 
    if(collision==true) 
     [_player onMapCollision:oldPos]; 
} 

Может быть, я что-то отсутствует, это делает вас OldPos, но это имеет ничего общего с индивидуальным объектом игры? Может ли [self checkEntityVsMapCollision] просто вызываться один раз перед циклом?

Вы также можете кэшировать, если объект перемещен. Если что-то не двигалось, не нужно делать проверку на столкновение. Каждый другой объект по-прежнему будет проверять, попадает ли он (поэтому ваш внутренний цикл должен начинаться с 0), но затем вы сохраняете полную проверку столкновения для не движущихся объектов.

В целом это выглядит как хороший код, у вас уже есть физика и логика, поэтому вы можете обновить логику в отдельном цикле, который называется реже, как вы упомянули в сообщении.

+0

Спасибо за комментарии. Действительно поучительный. – Notbad

+0

Извините за то, что я не совсем прочитал ваш ответ вчера, я был в спешке. Я исправил код для части _player. Он должен был читать «идти» не «_player». OldPos var - это просто, чтобы карта столкновения вызывала предыдущую позицию игрового объекта. – Notbad

+0

Ahh gotca, я подумал, что это может быть опечатка. Как общий цикл обновления, я бы сказал, что это выглядит довольно хорошо. Если вам нужно оптимизировать его, приведите сведения о том, какие проверки столкновений вам нужно делать, если вы можете избежать неприятностей, делая это реже и тому подобное. – TurqMage