【问题标题】:Optimization: what are sidetable_release() and sidetable_retain()?优化:sidetable_release() 和 sidetable_retain() 是什么?
【发布时间】:2013-11-13 23:23:42
【问题描述】:

在我的 OpenGL 循环中,Instruments 显示我的粒子处理循环中总共 14% 的处理器时间用于 objc_object::sidetable_release(bool)objc_object:sidetable_retain()。这很重要,因为循环在 iPhone 5 上使用了 100% 的 CPU。

我想知道是否有办法减少这种情况。我不知道是什么原因造成的,而且我在很多方法中都没有看到这些。我认为它们与快速枚举对象数组有关。

这是有问题的方法的样子:

-(void) updateWithTime:(ccTime)dt sceneHeightAboveHorizon:(CGFloat)yMax{
    _elapsed = (_elapsed+dt) ;

    float farTotalWidth = EQ_SCENE_WIDTH + 2*EQ_SIZE_FAR;
    float farHalfWidth = farTotalWidth/2.0;

    for (MyParticleData *data in self.farParticleData){

        //Calculate position
        float newX = data.pos.x + data.xVelocity * dt;
        if (newX > 1)
            newX -= 1;

        float newY = data.y0 + EQ_A_FAR*sin(EQ_F_FAR*_elapsed+data.phasePosition);

        data.pos = cc3v(newX,newY,0);
        //Apply new position to sprites
        data.sprite.position = cc3v(newX*farTotalWidth-farHalfWidth, newY*yMax, 0);
        data.reflectedSprite.position = cc3v(data.sprite.position.x,-data.sprite.position.y,0);

        //Calculate color
        float f = MIN(14, MAX(data.pos.x*14.0, 0));
        ccColor4F newColor = cycBlendColors(self.settings.eqColumnColors[(int)f], self.settings.eqColumnColors[(int)f+1], f-(int)f);
        float colorAmp = MAX(0, (sin(data.frequencyColor*_elapsed+data.phaseColor)+1)/2.0);
        newColor = cycScaleColor(newColor,colorAmp);
        colorAmp *= colorAmp;//the alpha (white component) should be squared twice
        newColor.a *= colorAmp*colorAmp;

        //Apply new color to sprites
        data.sprite.color4F = newColor;
        data.reflectedSprite.color4F = cycScaleColor(newColor, self.settings.eqReflectionBrightness);

    }
}

【问题讨论】:

    标签: ios objective-c optimization instruments


    【解决方案1】:

    我会在这里尝试进行心理调试 -

    1) 您已启用 ARC

    2) 表达式中的一些中间变量(例如 data.sprite、self.settings)是 Objective-C 对象

    3) 这些中间对象中的一个或多个是弱或原子的(或者它们本身正在访问弱或原子属性),这两者在访问时都需要额外的保留/释放处理。 - IIRC 原子属性不会涉及边桌 rigamarole,只是正常的自动释放,但不能保证。

    我会尝试在枚举之前将部分/所有这些引用分配给本地(在堆栈上)变量,并在循环内部专门使用本地引用。这还有一个额外的好处,那就是从你的循环中减少一些访问器时间。

    如果您知道这些引用将在整个枚举中 100% 保持强引用,那么您可以在局部变量上使用 __unsafe_unretained 说明符,这将(主要)防止在此方法中发生任何 ARC 恶作剧。

    【讨论】:

    • 对我来说最简单的解决方案就是将整个方法移到一个类别中并使用 -fno-objc-arc 禁用 ARC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2020-09-14
    • 2017-07-27
    • 2012-12-05
    • 2020-07-24
    • 2012-09-20
    相关资源
    最近更新 更多