การวาดมาสก์มีอิทธิพลต่อประสิทธิภาพ

นี่คือโค้ดที่ฉันใช้สำหรับวาดมาสก์สำหรับ UIView ปัญหาคือว่าหากฉันมี UIViews พร้อมมาสก์มากกว่า 5 รายการบนหน้าจอ มันจะส่งผลต่อประสิทธิภาพเมื่อลากและวาง UIViews: ฉันจะปรับปรุงโค้ดด้านล่างได้อย่างไร:

+ (UIBezierPath *)roundedPathAtCenter:(CGPoint)center size:(CGSize)size corner:(CGFloat)corner
{
    NSInteger width = size.width;
    NSInteger height = size.height;

    UIBezierPath *path = [UIBezierPath bezierPath];

    // upper left corner
    [path moveToPoint: CGPointMake(center.x - width / 2.0f + corner / 2.0f, center.y - height / 2.0f + corner / 2.0f)];

    // path to top center
    [path addQuadCurveToPoint: CGPointMake(center.x, center.y - height / 2.0f) controlPoint: CGPointMake(center.x - width / 2.0f + corner, center.y - height / 2.0f)];

    // path to upper right
    [path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0f - corner / 2.0f, center.y - height / 2.0f + corner / 2.0f) controlPoint: CGPointMake(center.x + width / 2.0f - corner, center.y - height / 2.0f)];

    // path to mid right
    [path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0f, center.y) controlPoint: CGPointMake(center.x + width / 2.0f, center.y - height / 2.0 + corner)];

    // path to lower right
    [path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0 - corner / 2.0f, center.y + height / 2.0f - corner / 2.0f) controlPoint: CGPointMake(center.x + width / 2.0f, center.y + height / 2.0f - corner)];

    // path to center bottom
    [path addQuadCurveToPoint: CGPointMake(center.x, center.y + height / 2.0f) controlPoint: CGPointMake(center.x + width / 2.0 - corner, center.y + height / 2.0)];

    // path to lower left
    [path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0f + corner / 2.0f, center.y + height / 2.0f - corner / 2.0f) controlPoint: CGPointMake(center.x - width / 2.0f + corner, center.y + height / 2.0f)];

    // path to mid left
    [path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0f, center.y) controlPoint: CGPointMake(center.x - width / 2.0f, center.y + height / 2.0 - corner)];

    // path to top left

    [path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0f + corner / 2.0f, center.y - height / 2.0f + corner / 2.0f) controlPoint: CGPointMake(center.x - width / 2.0f, center.y - height / 2.0f + corner)];

    [path closePath];

    return path;
}

โดยไม่ต้องเพิ่มมาสก์สำหรับ UIViews มันจะทำงานเร็วมาก


person Serhii    schedule 21.03.2016    source แหล่งที่มา


คำตอบ (2)


มีเทคนิคด่วนสองวิธีในการปรับปรุงประสิทธิภาพในสถานการณ์เหล่านี้:

  1. ก่อนที่คุณจะเริ่มลาก UIView คุณสามารถตั้งค่า shouldRasterize ของ layer ของ view เป็น true ได้ และเมื่อคุณวางเสร็จแล้ว ให้คืนค่า shouldRasterize เป็น false บางครั้ง (โดยเฉพาะอย่างยิ่งหากรูปภาพที่ลากอาจมีการเปลี่ยนแปลง) สิ่งนี้มีผลกระทบเชิงลบ แต่คุณสามารถลองได้ง่ายและคุณสามารถดูได้ว่าจะช่วยปรับปรุงประสิทธิภาพหรือไม่

  2. อีกวิธีหนึ่งคือการสร้างสแน็ปช็อตด้วยตนเอง (เช่น เรนเดอร์มุมมองด้วยการคลิปเป็น UIImage) และแทนที่มุมมองด้วย UIImageView จากนั้นลากสิ่งนั้น จากนั้นเมื่อคุณปล่อยมัน ให้แทนที่ด้วยมุมมองดั้งเดิม (หากคุณ ต้องการมัน บางครั้งสแนปช็อตก็เป็นสิ่งที่คุณต้องการ)

ฉันอาจแนะนำให้ดูวิดีโอ WWDC 2012 ประสิทธิภาพของแอป iOS: กราฟิกและภาพเคลื่อนไหว ซึ่งแสดงให้เห็น เทคนิคบางอย่างในการวินิจฉัยและแก้ไขปัญหาประสิทธิภาพกราฟิก วิดีโออาจมีอายุไม่กี่ปี แต่เทคนิคต่างๆ ยังคงใช้งานได้เป็นส่วนใหญ่ วิดีโอการเพิ่มประสิทธิภาพกราฟิก 2D และภาพเคลื่อนไหวอาจให้ข้อมูลเชิงลึกบางอย่างด้วย (แม้ว่าฉันจะ คิดว่าวิดีโออื่นน่าจะเกี่ยวข้องมากกว่าที่นี่)

อย่างไรก็ตาม มีเคล็ดลับอื่นๆ มากมายเพื่อปรับปรุงประสิทธิภาพ (เช่น เมื่อลากมุมมอง ให้ใช้การคาดเดา หากมุมมองที่ถูกลากมีความโปร่งใสมาก อาจสร้างสแนปชอตที่ทึบแสงเพื่อลาก เป็นต้น) แต่บางที ลองปฏิบัติตามข้างต้นก่อน และดูว่าจะช่วยลดปัญหาด้านประสิทธิภาพได้หรือไม่ นอกจากนี้ ตรวจสอบให้แน่ใจว่าคุณทดสอบสิ่งนี้บนอุปกรณ์เป้าหมาย และไม่ต้องอาศัยการทดสอบในเครื่องจำลอง เนื่องจากลักษณะการทำงานมักจะแตกต่างกันมาก

person Rob    schedule 21.03.2016

แอนิเมชันของมุมมองที่มาสก์นั้นช้าโดยธรรมชาติ เนื่องจากแผนผังการเรนเดอร์จะต้องได้รับการคำนวณใหม่ในทุกเฟรม ดังที่คุณพูดอย่างถูกต้อง ไม่จำเป็นต้องใช้มุมมองดังกล่าวมากมายในการทำให้เคลื่อนไหวพร้อมกันเพื่อให้สิ่งนี้ชัดเจน (โดยทั่วไปจะเป็นการพูดติดอ่าง) WWDC ของ Apple ได้ทุ่มเทวิดีโอที่ยอดเยี่ยมมากมายให้กับเรื่องนี้ ซึ่งโดยทั่วไปแล้วจะอยู่ในบริบทของการเลื่อน (เช่น มุมมองตาราง) ฉันขอแนะนำให้ดูวิดีโอเหล่านั้นซึ่งแนะนำวิธีแก้ไขปัญหาด้วย

โดยพื้นฐานแล้ว วิธีแก้ปัญหาที่ดีที่สุดน่าจะเป็นอย่าทำอย่างนั้น ลองใช้วิธีอื่นๆ เช่น การวาดมุมมองของคุณเพื่อให้มุมมองดึงตัวเองออกมาเป็นรูปร่างที่ถูกต้อง (โดยที่ด้านนอกเป็นเพียงความโปร่งใส) นั่นทำให้ระบบการวาดมีความตึงเครียดน้อยกว่ามาก เนื่องจากไม่มีมาสก์ในการประกอบ ตัวอย่างเช่น หากต้องการสร้างมุมมองเป็นวงกลม ให้ใช้มุมมองรูปภาพที่มีรูปภาพเป็นวงกลม และแน่นอนว่ามุมมองแบบทึบจะดีกว่าถ้าเป็นไปได้

person matt    schedule 21.03.2016
comment
อย่างไรก็ตาม คุณจะพบว่าการใช้เทมเพลต Core Animation ของเครื่องมือมีประโยชน์มากในการหาปริมาณและระบุสาเหตุที่นี่ - person matt; 21.03.2016