Cocos2d x cocos2dx中的低FPS问题

Cocos2d x cocos2dx中的低FPS问题,cocos2d-x,Cocos2d X,我已经完成了下面的函数,它在更新中包含26个if-else块。因此,它反映了FPS的微小下降 我已经使用动态铸造检查了26个对象。根据形状,我检查了逻辑 这是代码 void WagonNode::update(float dt) { int found = 0; for (int32 i = 0; i < kMaxContactPoints100 && found < contactPointCount100_; i++) { ContactPoint100*

我已经完成了下面的函数,它在更新中包含26个if-else块。因此,它反映了FPS的微小下降

我已经使用动态铸造检查了26个对象。根据形状,我检查了逻辑

这是代码

void WagonNode::update(float dt)
{
int found = 0;
for (int32 i = 0; i < kMaxContactPoints100 && found < contactPointCount100_; i++)
{
    ContactPoint100* point = contactPoints100_ + i;
    b2Fixture *otherFix = point->otherFixture;
    if( otherFix )
    {

        found++;
        b2Body *otherBody =  otherFix->GetBody();
        BodyNode *otherNode = (BodyNode*) otherBody->GetUserData();

        if (dynamic_cast<ShapeA*>(otherNode) != NULL)
        {
            tagWord(CCString::create("A"));

        }
        else if (dynamic_cast<ShapeB*>(otherNode) != NULL)
        {
             tagWord(CCString::create("B"));

        }
        else if (dynamic_cast<ShapeC*>(otherNode) != NULL)
        {
            tagWord(CCString::create("C"));
        }
        else if (dynamic_cast<ShapeD*>(otherNode) != NULL)
        {
            tagWord(CCString::create("D"));
        }
        else if (dynamic_cast<ShapeE*>(otherNode) != NULL)
        {
             tagWord(CCString::create("E"));

        }
        else if (dynamic_cast<ShapeF*>(otherNode) != NULL)
        {
            tagWord(CCString::create("F"));
        }
        else if (dynamic_cast<ShapeG*>(otherNode) != NULL)
        {
             tagWord(CCString::create("G"));
        }
        else if (dynamic_cast<ShapeH*>(otherNode) != NULL)
        {

            tagWord(CCString::create("H"));

        }
        else if (dynamic_cast<ShapeI*>(otherNode) != NULL)
        {
            tagWord(CCString::create("I"));

        }
        else if (dynamic_cast<ShapeJ*>(otherNode) != NULL)
        {
             tagWord(CCString::create("J"));

        }
        else if (dynamic_cast<ShapeK*>(otherNode) != NULL)
        {
             tagWord(CCString::create("K"));

        }
        else if (dynamic_cast<ShapeL*>(otherNode) != NULL)
        {
             tagWord(CCString::create("L"));

        }
        else if (dynamic_cast<ShapeM*>(otherNode) != NULL)
        {
            tagWord(CCString::create("M"));

        }

      etc...


    }
}
void WagonNode::更新(float dt)
{
int=0;
对于(int32 i=0;iotherFixture;
如果(其他修复)
{
发现++;
b2Body*otherBody=otherFix->GetBody();
BodyNode*otherNode=(BodyNode*)otherBody->GetUserData();
if(动态_转换(其他节点)!=NULL)
{
标记词(CCString::create(“A”);
}
else if(动态_转换(其他节点)!=NULL)
{
标语(CCString::create(“B”);
}
else if(动态_转换(其他节点)!=NULL)
{
标记词(CCString::create(“C”);
}
else if(动态_转换(其他节点)!=NULL)
{
标记词(CCString::create(“D”);
}
else if(动态_转换(其他节点)!=NULL)
{
标记词(CCString::create(“E”);
}
else if(动态_转换(其他节点)!=NULL)
{
标记词(CCString::create(“F”);
}
else if(动态_转换(其他节点)!=NULL)
{
标记词(CCString::create(“G”);
}
else if(动态_转换(其他节点)!=NULL)
{
标记词(CCString::create(“H”);
}
else if(动态_转换(其他节点)!=NULL)
{
标记词(CCString::create(“I”);
}
else if(动态_转换(其他节点)!=NULL)
{
标记词(CCString::create(“J”);
}
else if(动态_转换(其他节点)!=NULL)
{
标记词(CCString::create(“K”);
}
else if(动态_转换(其他节点)!=NULL)
{
标记词(CCString::create(“L”);
}
else if(动态_转换(其他节点)!=NULL)
{
标记词(CCString::create(“M”);
}
等
}
}
}

如果上面的编码有任何变化,它将对我帮助很大


有人能帮我处理或稳定FPS吗?

动态播放速度慢,可能是这里的问题。在这种情况下,您可以尝试使用typeid解析动态类型:

例如:

    if (typeid (*othernode) == typeid (ShapeA)) 
    {
      tagWord(CCString::create("A"));
    } elseif
    ...

另一件事是,您在那里可能会创建很多字符串,您可能需要检查这是否会导致性能问题。使用探查器找出实际的瓶颈。

不要在模拟器上使用FPS作为任何指示。在设备上测量。另外,对于obj-c中的这种情况(不确定您是否可以在您的上下文中使用),我会在每个Shape*中携带一个属性,比如“keyForTagWord”,一个字符串,然后使用它。以时间换取空间。对于类工厂也很有用。你分析过应用程序并指出fps下降的原因就在于这个方法吗?如果不是,那么试图优化它将是毫无意义的。但我确实看到了一个问题:动态_cast很慢。与动态强制转换不同的是,在形状本身中对该信息进行编码,这样您就可以访问节点中的“type”变量。例如,您可以使用CCNode的内置“tag”属性或userData。谢谢您的建议。但不需要在othernode之前插入指针(*)。