3

CoreGraphicsで作成したグラフがあります。

このグラフは水平方向にスクロールでき、スクロールしながら描画されます。

問題は、3G / 3GSではスクロールの速度とパフォーマンスは良好ですが、iPhone4では予想よりも遅いことです。

これはiPhone4の高解像度に関連する問題だと思います。それは正しいですか?

iPhone 4のパフォーマンスを向上させるにはどうすればよいですか?フレームワークはiPhone4の解像度で描画するための自動変換ですか、それとも私の仕事ですか?

どうもありがとうございます。

4

2 に答える 2

6

CoreGraphics 処理に関しては、iPhone 4 の方がはるかに遅くなる可能性があります。

あなたの場合の考えられるアイデアの1つ。ユーザーがスクロールしているときは、フル解像度で描画するのではなく、CoreGraphics 関連のものを半分の解像度のコンテキストで描画します。次に、そのコンテキストをビットマップとして取得し、最大解像度まで拡大します。これは iPhone4 のみであり、ユーザーがスクロールしている間のみ、より高い解像度の品質が失われます。

これは、さまざまなデバイス間でテストするために作成したコードです。

ビューをフルスクリーンで表示したときの私の結果。

  • 3G、9FPS
  • 3GS、16FPS
  • i4、5 FPS (残念)

CoreGraphicsTestView.h

#import <UIKit/UIKit.h>
@interface CoreGraphicsTestView : UIView 
{
    int displayCounter;
    float displayInterval;
    char fps[50];
}
@end

CoreGraphicsTestView.m

#import "CoreGraphicsTestView.h"
#define RNDN(s, e) ((((CGFloat)rand() / (CGFloat)INT_MAX) * ((e)-(s)) + (s)))
#define RNDX(s, e, r) (RNDN((s), (e)) * (r).size.width)
#define RNDY(s, e, r) (RNDN((s), (e)) * (r).size.height)
#define RNDR(r) (CGRectMake(RNDX(0,0.50,(r)),RNDY(0,0.50,(r)),RNDX(0.50,1.0,(r)),RNDY(0.50,1.0,(r))))
@implementation CoreGraphicsTestView
- (id)initWithFrame:(CGRect)frame 
{
    if ((self = [super initWithFrame:frame])) 
    {
        self.backgroundColor = [UIColor blackColor];
        srand(time(NULL));
        fps[0] = '\0';
    }
    return self;
}
- (void)updateDisplayCounter:(CGContextRef)c rect:(CGRect)rect
{
    displayCounter++;
    float now = (float)clock() / (float)CLOCKS_PER_SEC;
    if (now - displayInterval > 1)
    {
        sprintf(fps, "%0.0f", displayCounter / (now - displayInterval));
        printf("%s\n", fps);
        displayInterval = now;
        displayCounter = 0;
    }
    CGContextTranslateCTM(c, 5, 40);
    CGContextScaleCTM(c, 1.0, -1.0); 
    CGContextSetFillColorWithColor(c, [UIColor whiteColor].CGColor);
    CGContextSelectFont(c, "Arial", 18, kCGEncodingMacRoman);
    CGContextShowTextAtPoint(c, 0, 0, fps, strlen(fps));
}
- (void)setRandomColor:(CGContextRef)c
{
    CGFloat components[4] = {1,RNDN(0, 1),RNDN(0, 1),RNDN(0, 1)};
    CGContextSetFillColor(c, components);
}
- (void)drawRect:(CGRect)rect
{
    CGContextRef c = UIGraphicsGetCurrentContext(); 
    for (int i=0;i<5;i++)
    {
        [self setRandomColor:c];
        CGContextFillRect(c, RNDR(rect));
        [self setRandomColor:c];
        CGContextFillEllipseInRect(c, RNDR(rect));
    }
    [self updateDisplayCounter:c rect:rect];
    [self performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:0.0];
}
@end
于 2010-09-08T17:19:16.117 に答える
0

「遅い」という体験、もっと正確に表現できますか?スクロールのフレームレートが、滑らかに見えなかったり、途切れたりするところまで低下したと仮定します。

もしそうなら、そしてそれが解決策であると確信しているなら、私が見ることができる2つの一般的な方法があります.

  • たとえば、半分の間隔で更新し、半分を幅の広いスライスとしてレンダリングします。Cocoa Touch がそれを容易にしない場合は、現在のレンダリング メソッドから時間間隔でコールバックをトリガーできます。
  • 表示可能領域のさらに外側に隠されているグラフの一部が、スクロールして表示されるときにレンダリングされるように、「さらに事前に」レンダリングします。

ビューの「描画」プロパティ、不透明などはパフォーマンスに影響を与えるため、すでに見ていると思います。

于 2010-09-03T08:22:11.123 に答える