1

这是我的“滴答”功能:

- (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。

4

1 回答 1

7

首先,[[effectsLayer alloc] retain]很可怕。永远不要那样做。曾经。切勿使用尚未初始化的已分配对象。此外,这将至少保留对象两次,因为对 +alloc 的调用返回一个保留对象,并且您再次保留它,然后将其添加到数组中(第三次保留它),但它只是被释放两次(当它从数组中删除和您的单一版本时)。

我怀疑问题出在这一行:[self addChild:elayer z:2]; 这个方法是做什么的?它是否负责将 elayer 实际绘制到屏幕上?如果是这样,那么这意味着它可能还保留 elayer,这意味着它没有被释放,因为从可变数组中弹出内容时,您似乎没有进行任何类型的“removeChild”调用。

简而言之:仅仅因为某些东西不再在您的阵列中并不意味着它也不在屏幕上。

于 2009-09-03T17:32:12.570 回答