这是我的“滴答”功能:
- (void) tick: (ccTime) dt
{
NSLog(@"%d",ticker);
if(fbut.Adown == YES && ticker > 4)//fbut is a button
{
elayer = [[effectsLayer alloc] init]; // each effectlayer draws a //projectile that moves forward 'x' ticks
elayer.e_playpos = glayer.playerpos; // player position
[self addChild:elayer z:2];
[mutable addObject: elayer];
[elayer release];
if(mutable.count > 20) // when there are 20 projectiles drawn, start //destroying the last one.
{
NSLog(@"mutable: %d", mutable.count);
[mutable removeLastObject];
}
ticker=0;
}
ticker++;
// . . .
这是正在运行的程序的样子
http://screencast.com/t/LpNHL2kJIVpu
貌似20多。。
不过有趣的是,该数组稳定地保持在 20 个对象上。因此,如果对象被“删除”(通过 [mutable removeLastObject];)它们是如何出现在屏幕上的?
这是下一个泡菜...
现在我将初始化更改为保留(寻找 ***** 的)
- (void) tick: (ccTime) dt
{
NSLog(@"%d",ticker);
if(fbut.Adown == YES && ticker > 4)//fbut is a button
{
elayer = [[effectsLayer alloc] retain]; // *********each effectlayer draws //a projectile that moves forward 'x' ticks
elayer.e_playpos = glayer.playerpos; // player position
[self addChild:elayer z:2];
[mutable addObject: elayer];
[elayer release];
if(mutable.count > 20) // when there are 20 projectiles drawn, start //destroying the last one.
{
NSLog(@"mutable: %d", mutable.count);
[mutable removeLastObject];
}
ticker=0;
}
ticker++;
// . . .
现在没有绘制效果层,但 NSArray 仍然包含 21 - 20 个对象。所有这些对象都未初始化。所以我将 init 添加到末尾: elayer = [[[effectsLayer alloc] retain] init];
现在我有和以前一样的效果。
所以我尝试自动释放..同样的效果,很多很多 pew pew pew 的,超过 20 个。
我的目标是一次只允许抽取 20 个,一旦抽取了 20 个,它们就会被释放。现在,没有释放,程序运行正常,直到大约 4 分钟,当有大约 2000 个 e 层并且 fps 大约为 5..
为什么轮船 pew pew 不对?
(顺便说一句,我使用 cocos2d 框架)这是一个由我拥有版权的项目,alex earley 2009。