ios – 优化:什么是sidetable_release()和sidetable_retain()?

ios – 优化:什么是sidetable_release()和sidetable_retain()?,第1张

概述在我的OpenGL循环中,Instruments在我的粒子处理循环中显示总共14%的处理器时间转到objc_object :: sidetable_release(bool)和objc_object:sidetable_retain().这很重要,因为循环使用iPhone 5上100%的CPU. 我想知道是否有办法减少这种情况.我不知道是什么导致它,我在很多方法中都没有看到这些.我认为它们与快速枚 在我的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);    }}
解决方法 我会尝试在这里进行精神调试 –

1)您已启用ARC

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

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

我会尝试在枚举之前将一些/所有这些引用分配给本地(在堆栈上)变量,并且在循环内部仅使用本地引用.这样做还有一些好处,即可以从循环中删除一些访问时间.

如果您知道这些引用将在100%的时间内通过整个枚举保持强引用,那么您可以在本地变量上使用__unsafe_unretained说明符,这将(大多数)阻止在此方法中发生任何ARC诡计.

总结

以上是内存溢出为你收集整理的ios – 优化:什么是sidetable_release()和sidetable_retain()?全部内容,希望文章能够帮你解决ios – 优化:什么是sidetable_release()和sidetable_retain()?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1109544.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存