سؤال

لدي مخطط مرسوم مع CoreGraphics.

يمكن تمرير هذا الرسم البياني أفقياً ويتم رسمه أثناء تمريره.

المشكلة هي أنه في 3G/3GS ، فإن سرعة وأداء التمرير جيدة ولكن على iPhone 4 أبطأ من المتوقع.

أفترض أن هذه مشكلة تتعلق بالدقة الأعلى لجهاز iPhone 4. هل هذا صحيح؟

كيف يمكنني زيادة الأداء على iPhone 4؟ هل التحويل التلقائي للإطار للاستخلاص على دقة iPhone 4 أم أنه عملي؟

شكراً جزيلاً.

هل كانت مفيدة؟

المحلول

يمكن أن يكون iPhone 4 كثيراً أبطأ عندما يتعلق الأمر بمعالجة CoreGraphics.

فكرة واحدة محتملة لحالتك. عندما يقوم المستخدم بالتمرير ، بدلاً من رسم الدقة الكاملة ، ارسم الأشياء المتعلقة بالأشياء المتعلقة بـ CoreGraphics سياق نصف دقة. ثم خذ هذا السياق باعتباره صورة نقطية وقم بتوسيع نطاقه إلى الدقة الكاملة. سيكون هذا لـ iPhone4 فقط وستفقد جودة الدقة العليا اللطيفة ، ولكن لا يكون المستخدم إلا أثناء التمرير.

إليك بعض التعليمات البرمجية التي كتبتها للاختبار بين الأجهزة المختلفة.

نتائجي عند عرض العرض على شاشة ملء الشاشة.

  • 3G ، 9 إطارًا في الثانية
  • 3GS ، 16 إطارًا في الثانية
  • i4 ، 5 إطارًا في الثانية (بومر)

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

نصائح أخرى

تجربة "أنها أبطأ" ، هل يمكنك وصفها بدقة أكبر؟ سأفترض أن معدل الإطار للتمرير قد تم إنزاله إلى حيث لا يبدو ناعمًا أو حتى متكافئين.

إذا كان الأمر كذلك ، وإذا كنت متأكدًا من أن القرار هو سبب هذا ، فهناك طريقتان عامتان يمكنني رؤيتهما.

  • تحديث على سبيل المثال نصف الفاصل الزمني ، مما يجعل نصف شرائح واسعة. إذا لم يسهل Touch Cocoa Touch ذلك ، فيمكنك تشغيل رد اتصال في فترة زمنية محددة من طريقة التقديم التي لديك الآن.
  • قم بإعداد "مزيد من المقدمة" بحيث يتم تقديم جزء من الرسم البياني المختبئ خارج المنطقة القابلة للعرض عند تمريره.

أفترض أنك قد نظرت بالفعل إلى خصائص "الرسم" الخاصة بالمنظر ، غير شفاف ، وما إلى ذلك لأنها تؤثر على الأداء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top