التخزين المؤقت إلى CGLayer أبطأ من إعادة الرسم على iPhone
-
14-09-2020 - |
سؤال
أنا بصدد إنشاء برنامج رسم بسيط لجهاز 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:
مع حدود المنطقة التي تغيرت على الطبقة، مما يؤدي إلى تحديثها.إذا حاولت تحديث الشاشة بأكملها، فسيكون الأمر بطيئًا.
هل تستخدم الأدوات لمعرفة الأجزاء البطيئة؟أوصي باستخدامه للتعرف على الأجزاء التي تبطئك.