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]; を介して) 「削除」されている場合、どうして画面に表示されるのでしょうか?

次のお漬物はこちら…

ここで、init を保持に変更します (***** を探します)。

- (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] keep] init];

今、私は以前と同じ効果があります。

だから私はautoreleaseを試してみます..同じ効果、たくさんのピューピューピュー、20をはるかに超える.

私の目標は、一度に 20 個だけを描画できるようにすることです。20 個が描画されると、割り当てが解除されます。現在、割り当てを解除せずに、約 2000 個の e レイヤーがあり、fps が約 5 である場合、プログラムは約 4 分まで正常に実行されます。

なぜ船はピウピウしないのですか?

(ところで、私は cocos2d フレームワークを使用しています) これは、2009 年の alex earley が著作権を所有するプロジェクトです。

4

1 に答える 1

7

まず、[[effectsLayer alloc] retain]ひどいです。絶対にしないでください。これまで。初期化されていない割り当て済みオブジェクトは絶対に使用しないでください。さらに、これはオブジェクトを少なくとも2回保持します。これは、+ allocを呼び出すと保持されたオブジェクトが返され、再度保持してから配列に追加するためです(3回目は保持されます)が、リリースされるだけです。 2回(アレイと単一のリリースから削除された場合)。

問題はこの行にあると思います:[self addChild:elayer z:2]; このメソッドは何をしますか?実際にelayerを画面に描くのは担当ですか?もしそうなら、それはおそらくelayerも保持していることを意味します。これは、可変配列から物事をポップするときに「removeChild」呼び出しを行っていないように見えるため、割り当てが解除されていないことを意味します。

つまり、配列に何かがなくなったからといって、それが画面にも表示されていないというわけではありません。

于 2009-09-03T17:32:12.570 に答える