gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:52:13 29 4
gpt4 key购买 nike

在我的 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()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19749140/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com