1

たくさん描くiPadアプリケーションを作ろうとしていますが、実際にはステージ上にたくさんの線があります(10.000+)

この単純なforloopを使用すると、40〜60秒後にiPadがクラッシュします(結果は表示されません)

for ( int i = 0; i < 10000; i++ )
    {
        int r_x = rand() % 750;
        int r_y = rand() % 1000;
        CGPoint pointpoint = CGPointMake(r_x, r_y);
        UIColor *st = [[GetColor alloc] getPixelColorAtLocation:pointpoint];
        DrawLine *drawview = [[DrawLine alloc]initWithFrame:CGRectMake(r_x, r_y, 20, 20) selectedcolor:st];
        [self.view addSubview:drawview];
        [drawview release];
        [DrawLine release];
        [GetColor release];
    }

これは私の「DrawLine」クラスです。

- (id)initWithFrame:(CGRect)frame selectedcolor:colors{
    if ((self = [super initWithFrame:frame])) {
        selectedcolor_t = colors;
        self.backgroundColor = [UIColor clearColor];
    } 
    return self;
}

- (void)drawRect:(CGRect)frame{
    CGContextRef c = UIGraphicsGetCurrentContext();
    float* colors = CGColorGetComponents(selectedcolor_t.CGColor);
    CGContextSetStrokeColor(c, colors);
    CGContextBeginPath(c);
    CGContextMoveToPoint(c, 0.0f, 0.0f);
    CGContextAddLineToPoint(c, 20.0f, 20.0f);
    CGContextStrokePath(c);

}

どうすればこの問題を解決できますか?iOSをクラッシュさせずに、これだけのサブビューを描画するにはどうすればよいですか?

本当にありがとう!!:)

4

2 に答える 2

9

あなたがそこで何をしているのかを再考してください:

  1. ループの4行目で、あなたallocはのインスタンスですGetColor—これを二度と使用することはありません。自問してみてください:それはデザインの観点から意味がありますか?
  2. その同じ行で、Cocoaの命名規則に違反しない場合は、リリースされないUIColorを作成します...
  3. 次に、8行目でのクラスオブジェクトを解放しますDrawLine次の行とGetColor-classの場合も同様です)。これはひどく、ひどく間違っています!

iOS Dev-Centerのメモリ管理プログラミングガイドにアクセスして、最初の2つのセクションを(もう一度)読んでください。

それに加えて、デザインを再評価します。

  • GetColorインスタンスを作成するために、実際にはクラスである必要がありますか?このコンテキストでは、色の補間のための単純なヘルパー関数の方が理にかなっているのではないでしょうか。
  • それがクラスである必要がある場合は、ループの外側にそのインスタンスを1つだけ作成し、色を繰り返しクエリするだけではどうでしょうか。
  • 単一の直線、単色、単色の線を描画するために、UIViewのサブクラスが本当に必要ですか?線を更新する必要がない場合は、(Richardとnacho4dが提案したように)すべてを1つのオブジェクトに描画する必要があります(たとえば、カスタムUIViewまたはdrawLayer:inContext:メソッドを実装するCALayerのデリゲートによって)。後でこれらの行を更新する必要がある場合は、単にCALayerを(乱用)使用できます...

後者の場合、問題は次のようになります。

  1. ランダムな座標を計算します。
  2. あなたの色を計算します。
  3. a)その色をbackgroundColorとして、 b)幅20 * sqrt(2)、 c)その線の幅にしたい高さ、不透明なCALayerを作成します。 d)その原点としてのあなたのポイントと e)45のa。




    rotation
  4. そのレイヤーをサブレイヤーとしてのレイヤーに追加しself.viewます。

乾杯
ダニエル

于 2011-01-04T18:02:13.900 に答える
2

線が静的である場合(後で移動しない、アニメーション化しないなど)、1000個のCALayerを作成せずに、1つのビューですべての線を1つのdrawRectに描画することもできます。これが1000のCALayersを描画するよりも速いかどうかはわかりませんが(CoreAnimationはハードウェアアクセラレーションであり、CoreGraphicsはそうではないため)、すべての線が1つのビットマップでフラット化されるため、確かに軽量です。(これはあなたの見解の文脈です)

drawRect内でforループを移動するだけです:そしてdanyowdeのアドバイスに従ってください(1つのカラーオブジェクトまたはヘルパー関数が必要ですが、反復ごとにカラーを作成する必要はありません)

頑張ってください、それが役立つことを願っています;)

于 2011-01-04T19:00:30.910 に答える