เพื่อชี้แจงจุดประสงค์ของคำถามนี้: ฉันรู้วิธีสร้างมุมมองที่ซับซ้อนทั้งในมุมมองย่อยและการใช้ drawRect ฉันพยายามเข้าใจอย่างถ่องแท้ว่าเหตุใดจึงต้องใช้อย่างใดอย่างหนึ่ง
ฉันเข้าใจเช่นกันว่ามันไม่สมเหตุสมผลที่จะปรับให้เหมาะสมล่วงหน้าและทำบางสิ่งที่ยากกว่าก่อนที่จะทำการทำโปรไฟล์ พิจารณาว่าฉันพอใจกับทั้งสองวิธีและตอนนี้ต้องการความเข้าใจที่ลึกซึ้งยิ่งขึ้น
ความสับสนมากมายของฉันมาจากการเรียนรู้วิธีทำให้ประสิทธิภาพการเลื่อนดูตารางอย่างราบรื่นและรวดเร็ว แน่นอนแหล่งที่มาดั้งเดิมของวิธีนี้มาจากผู้เขียนที่อยู่เบื้องหลังตัวสั่นด้วยความตื่นเต้นสำหรับ iPhone (tweetie เดิม) โดยพื้นฐานแล้วจะบอกว่าเพื่อให้การเลื่อนตารางเนยเป็นไปอย่างราบรื่นความลับคือไม่ต้องใช้การดูย่อย แต่แทนที่จะวาดทั้งหมดใน uiview ที่กำหนดเอง โดยพื้นฐานแล้วดูเหมือนว่าการใช้การดูย่อยจำนวนมากจะทำให้การเรนเดอร์ช้าลงเพราะพวกเขามีค่าใช้จ่ายจำนวนมาก
เพื่อความเป็นธรรมนี้ถูกเขียนขึ้นเมื่อ 3GS เป็นแบรนด์ที่ค่อนข้างใหม่ spankin และ iDevices ได้รับเร็วขึ้นมากตั้งแต่นั้นมา ยังคงใช้วิธีนี้เป็นประจำ แนะนำในinterwebsและที่อื่น ๆ สำหรับตารางที่มีประสิทธิภาพสูง ในความเป็นจริงมันเป็นวิธีการที่แนะนำไว้ในตารางที่แอปเปิ้ลโค้ดตัวอย่างได้รับการแนะนำในวิดีโอ WWDC หลายคน ( ถอนเงินปฏิบัติสำหรับ iOS นักพัฒนา ) และ iOS หลายโปรแกรมหนังสือ
มีเครื่องมือที่ดูยอดเยี่ยมในการออกแบบกราฟิกและสร้างรหัส Core Graphics สำหรับพวกเขา
ดังนั้นในตอนแรกฉันจึงเชื่อว่า "มีเหตุผลที่ทำให้ Core Graphics มีอยู่มันเร็วมาก"
แต่ทันทีที่ฉันคิดว่าฉันได้รับแนวคิด "โปรดปรานกราฟิกหลักเมื่อเป็นไปได้" ฉันเริ่มเห็นว่า drawRect มักจะรับผิดชอบต่อการตอบสนองที่ไม่ดีในแอปหนึ่งคือหน่วยความจำที่ชาญฉลาดและมีราคาแพงมาก โดยพื้นฐานแล้วฉันควร " หลีกเลี่ยงการเอาชนะ drawRect " ( ประสิทธิภาพของแอพ iOS WWDC 2012 : กราฟิกและภาพเคลื่อนไหว )
ดังนั้นฉันเดาว่าทุกอย่างมันซับซ้อน บางทีคุณสามารถช่วยตัวเองและผู้อื่นให้เข้าใจว่าเหตุใดจึงเป็นเพราะการใช้ drawRect
ฉันเห็นสถานการณ์ที่ชัดเจนในการใช้ Core Graphics:
- คุณมีข้อมูลแบบไดนามิก (ตัวอย่างแผนภูมิหุ้นของ Apple)
- คุณมีองค์ประกอบ UI ที่ยืดหยุ่นที่ไม่สามารถดำเนินการได้ด้วยภาพที่ปรับขนาดได้ง่าย
- คุณกำลังสร้างกราฟิกแบบไดนามิกซึ่งเมื่อใช้การแสดงผลหลายแห่ง
ฉันเห็นสถานการณ์เพื่อหลีกเลี่ยง Core Graphics:
- คุณสมบัติของมุมมองของคุณจะต้องมีการเคลื่อนไหวแยกต่างหาก
- คุณมีลำดับชั้นการดูค่อนข้างเล็กดังนั้นการรับรู้ถึงความพยายามพิเศษในการใช้ CG จึงไม่คุ้มค่าที่จะได้รับ
- คุณต้องการอัปเดตชิ้นส่วนของมุมมองโดยไม่ต้องเขียนใหม่ทั้งหมด
- โครงร่างของการชมย่อยของคุณจำเป็นต้องอัปเดตเมื่อขนาดมุมมองพาเรนต์เปลี่ยนไป
มอบความรู้ของคุณ ในสถานการณ์ใดบ้างที่คุณเข้าถึงสำหรับ drawRect / Core Graphics (ที่สามารถทำได้ด้วยการดูย่อย) ปัจจัยอะไรที่ทำให้คุณตัดสินใจเช่นนั้น? วิธีการ / ทำไมการวาดภาพในมุมมองที่กำหนดเองหนึ่งแนะนำสำหรับการเลื่อนเซลล์ตารางอย่างราบรื่น buttery แต่ Apple แนะนำให้ drawRect กับเหตุผลด้านประสิทธิภาพโดยทั่วไป? ภาพพื้นหลังแบบไหนที่เกี่ยวกับ (เมื่อคุณสร้างด้วย CG กับการใช้ภาพ png ที่ปรับขนาดได้)
อาจไม่จำเป็นต้องมีความเข้าใจอย่างลึกซึ้งในเรื่องนี้เพื่อสร้างแอพที่คุ้มค่า แต่ฉันไม่ชอบเลือกระหว่างเทคนิคต่าง ๆ โดยไม่สามารถอธิบายได้ว่าทำไม สมองของฉันโกรธฉัน
อัปเดตคำถาม
ขอบคุณสำหรับข้อมูลที่ทุกคน บางคำถามที่ชัดเจนที่นี่:
- หากคุณกำลังวาดสิ่งที่มีกราฟิกหลัก แต่สามารถทำสิ่งเดียวกันกับ UIImageViews และ png ที่แสดงผลล่วงหน้าคุณควรไปเส้นทางนั้นเสมอหรือไม่
- คำถามที่คล้ายกัน: โดยเฉพาะอย่างยิ่งกับเครื่องมือ badass เช่นนี้คุณควรพิจารณาการวาดองค์ประกอบอินเทอร์เฟซในกราฟิกหลักเมื่อใด (อาจเป็นได้เมื่อการแสดงองค์ประกอบของคุณเป็นตัวแปรเช่นปุ่มที่มีการเปลี่ยนแปลงสี 20 แบบกรณีอื่น ๆ ?)
- ด้วยความเข้าใจของฉันในคำตอบของฉันด้านล่างประสิทธิภาพการทำงานแบบเดียวกันสำหรับเซลล์ตารางอาจได้รับจากการจับภาพบิตแมปสแน็ปช็อตของเซลล์ของคุณอย่างมีประสิทธิภาพหลังจาก UIView ที่ซับซ้อนของคุณทำการเรนเดอร์เอง เห็นได้ชัดว่าบางชิ้นจะต้องมีการออกกำลังกาย แค่ความคิดที่น่าสนใจที่ฉันมี