التخزين المؤقت إلى CGLayer أبطأ من إعادة الرسم على iPhone

StackOverflow https://stackoverflow.com/questions/3229784

سؤال

أنا بصدد إنشاء برنامج رسم بسيط لجهاز iPhone.في الوقت الحالي، تضيف أحداث اللمس موقعها إلى القائمة المرتبطة بمجموعة من استدعاءات CGContextAddLineToPoint والتي يتم إعادة رسمها في كل استدعاء لdrawRect.

أواجه مشكلات في الأداء عند استخدام عدد قليل جدًا من الأسطر (على الرغم من أنها شفافة)، لذا حاولت رسم كل شيء في طبقة CGLayer.الآن، بدلاً من رسم كل سطر في كل إطار، فإنه يرسم كل سطر مرة واحدة فقط ويرسم CGLayer على الشاشة في كل إطار.

        CGContextRef backgroundContext = CGLayerGetContext(pathBuffer);
        CGContextSetLineWidth(backgroundContext, 2.0);
        CGContextSetLineCap(backgroundContext, kCGLineCapButt);
        CGContextSetStrokeColorWithColor(backgroundContext, [pathColor CGColor]);

        if([[touchPoints objectAtIndex:0] continuesToNextPoint])
        {
            CGContextMoveToPoint(backgroundContext, [[touchPoints objectAtIndex:0] point].x, [[touchPoints objectAtIndex:0] point].y);
            CGContextAddLineToPoint(backgroundContext, [[touchPoints objectAtIndex:1] point].x, [[touchPoints objectAtIndex:1] point].y);
            CGContextStrokePath(backgroundContext);
        }

        //remove it from touchpoints
        [touchPoints removeObjectAtIndex:0];
    }

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawLayerAtPoint(context, CGPointMake(0, 0), pathBuffer);

وهذا، إذا كان هناك أي شيء، أبطأ مما كنت أفعله من قبل.أفعل شيئا خاطئا؟هل من الأفضل أن أرسم إلى UIImage أو شيء من هذا القبيل؟شكرًا.

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

المحلول

ما يجب عليك فعله هو إدخال ملف CALayer في إحدى طرق العرض الخاصة بك، وقم بتحديث الطبقة، ثم الاتصال setNeedsDisplayInRect: مع حدود المنطقة التي تغيرت على الطبقة، مما يؤدي إلى تحديثها.إذا حاولت تحديث الشاشة بأكملها، فسيكون الأمر بطيئًا.

هل تستخدم الأدوات لمعرفة الأجزاء البطيئة؟أوصي باستخدامه للتعرف على الأجزاء التي تبطئك.

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