2012-01-17 15 views
0

NSTimerを使用して5つのコンテキストを更新し、0.03秒ごとに5つのビューに貼り付けています。これはシミュレータでうまく動作し、素晴らしいフレームレートで動作しましたが、iPodにデプロイしたときに不安定になりました。私はその率を.1に下げて少し改善を見た。これらのコンテキストを再描画する効率的な方法はありますか?ビューを再描画するときのデバイスのパフォーマンスが悪い

一部コード:

- (void)addViews{ 
[self.superview addSubview:mag]; 
[self.superview addSubview:vc]; 
[self.superview addSubview:na]; 
[self.superview addSubview:wave]; 
[self.superview addSubview:mon]; 

[self.superview addSubview:selector]; 

looper = [NSTimer timerWithTimeInterval:0.03 
           target:self 
           selector:@selector(setNeeds) 
           userInfo:nil 
           repeats:YES]; 

[[NSRunLoop mainRunLoop] addTimer:looper forMode:NSRunLoopCommonModes]; 
} 

-(void)setNeeds{ 
[mag setNeedsDisplay]; 
[vc setNeedsDisplay]; 
[na setNeedsDisplay]; 
[wave setNeedsDisplay]; 
[mon setNeedsDisplay]; 
} 

これは、各ビューに適用されるコンテキスト調整です。本質的に虫眼鏡です。

- (void)drawRect:(CGRect)rect { 
CGPoint magnifiedPoint = [viewToMagnify convertPoint:coordPoint fromView:self.superview]; 

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(context,(self.frame.size.width*0.5),(self.frame.size.height*0.5)); 
CGContextScaleCTM(context, 1.3, 1.3); 
CGContextTranslateCTM(context,-1*(magnifiedPoint.x),-1*(magnifiedPoint.y)); 
[self.viewToMagnify.layer renderInContext:context]; 
} 
+0

おそらく、あなたのコードを見ることなく、確かめるのは難しいですが、精緻化するのに気をつけますか? –

+0

ええ、それは間違いなくビューにコンテキストを再描画する際の問題です。私はあまりにも多くのビューにあまりにも速くそれをやっているだけです。私はより効率的な方法を知りたがっています。 – MyNameIsKo

+2

明らかな質問:なぜタイマーですか?あなたが構築したこのポーリングメカニズムの代わりに、あなたが引っ掛けることができるいくつかのイベント(マジックガラスを動かすためのタッチ/ドラッグ、基礎となるデータの変更など)はありませんか? –

答えて

1

Core Graphics描画は、OpenGLを使用してハードウェアアクセラレーションが行われていないため、比較的低速です。最も重要なこと以外は、Core GraphicsはiOSのリアルタイムアニメーションには遅すぎます。

コアアニメーションは、OpenGLハードウェアアクセラレーションを使用するため、はるかに高速です。できるだけコアアニメーションを使って効果を出そうとしています。すべてのUIViewはCALayerによってサポートされているので、view.transformプロパティに直接適用する変換は非常に高速になります。また、view.layer.maskプロパティを設定することによって、イメージを使用してビューを動的にマスクすることもできます。

おそらく、ビュー自体(または同じ内容のビューのコピー)を拡大して円にマスクすることによって、拡大効果をシミュレートすることができます。そうすれば、renderInContextを呼び出す必要も、CGContextの描画を行う必要もなくなり、全体が適切なフレームレートで実行されるはずです。

+0

これは非常に健全な助言であり、私の問題に対する答えかもしれません。私の問題は、コンテキストを使わずに拡大したいマスタービューのコピーを取得することです。 – MyNameIsKo

+0

おそらく、最初にそのビューを生成するためのコードがアプリにあります。同じ方法をもう一度実行してそのコピーを取得することはできませんか?または、サブビューをループし、同じプロパティを持つ同じタイプの新しいビューを生成するだけで、サブビューを別のビューに深くコピーできますか? –

+0

また、renderInContextを使用してイメージビューにイメージのコピーを取得し、ビュートランスフォーム技術を使用してそのイメージビューを拡大します。そうすることで、画像をコピーするときのパフォーマンスが、パンやズームをしている間に各フレームではなく1回だけ発生し、目立たなくなります。 –

関連する問題