เมื่อใดจึงจำเป็นหรือดีกว่าที่จะใช้SurfaceView
a View
?
เมื่อใดจึงจำเป็นหรือดีกว่าที่จะใช้SurfaceView
a View
?
คำตอบ:
มุมมองทั้งหมดจะถูกวาดบนเธรด GUI เดียวกันซึ่งใช้สำหรับการโต้ตอบกับผู้ใช้ทั้งหมด
ดังนั้นหากคุณต้องการที่จะปรับปรุง GUI SurfaceView
อย่างรวดเร็วหรือถ้าการแสดงผลต้องใช้เวลามากเกินไปและส่งผลกระทบต่อประสบการณ์การใช้งานแล้วใช้
บางสิ่งที่ฉันสังเกตเห็น:
สำหรับข้อมูลเพิ่มเติม (และตัวอย่างการใช้งานที่ยอดเยี่ยม) ดูที่โครงการ LunarLander ในส่วนตัวอย่างของ SDK
อัปเดตเมื่อ 05/09/2014
ตกลง. เรามีเอกสารอย่างเป็นทางการแล้ว มันพูดทั้งหมดที่ฉันได้กล่าวถึงในทางที่ดีขึ้น
อ่านรายละเอียดเพิ่มเติมได้ที่นี่
ใช่ความแตกต่างที่สำคัญคือ SurfaceView สามารถอัปเดตได้ในเธรดพื้นหลัง อย่างไรก็ตามมีมากกว่าที่คุณอาจสนใจ
surfaceView มีการมอบบัฟเฟอร์พื้นผิวขณะที่มุมมองทั้งหมดแชร์หนึ่งบัฟเฟอร์พื้นผิวที่จัดสรรโดย ViewRoot อีกนัยหนึ่งคือ surfaceView ใช้ทรัพยากรเพิ่มขึ้น
surfaceView ไม่สามารถใช้ฮาร์ดแวร์เร่งความเร็ว (ตั้งแต่ JB4.2) ในขณะที่การดำเนินงาน 95% ในมุมมองปกติจะเร่งความเร็ว HW โดยใช้ openGL ES
ควรทำงานมากขึ้นเพื่อสร้างพื้นผิวที่กำหนดเองของคุณ คุณต้องฟัง listCreated / Destroy กิจกรรมสร้างเธรดการแสดงผลที่สำคัญยิ่งกว่าการซิงโครไนซ์เธรดการแสดงผลและเธรดหลัก อย่างไรก็ตามในการปรับแต่งมุมมองสิ่งที่คุณต้องทำคือการแทนที่onDraw
วิธี
view.invalidate
ในเธรด UI หรือview.postInvalid
ในเธรดอื่นเพื่อระบุถึงเฟรมเวิร์กที่มุมมองควรถูกอัพเดต อย่างไรก็ตามมุมมองจะไม่อัปเดตทันที แต่รอจนกว่าเหตุการณ์ VSYNC ถัดไปจะมาถึง วิธีง่าย ๆ ในการทำความเข้าใจกับ VSYNC คือการพิจารณาว่ามันเป็นตัวจับเวลาที่เปิดไฟทุก ๆ 16ms สำหรับหน้าจอ 60fps ใน Android อัปเดตมุมมองปกติทั้งหมด (และแสดงจริง แต่ฉันจะไม่พูดวันนี้) ซิงโครไนซ์กับ VSYNC เพื่อให้ราบรื่นยิ่งขึ้น ตอนนี้กลับไปที่ surfaceView คุณสามารถแสดงผลได้ตลอดเวลาตามที่คุณต้องการ อย่างไรก็ตามฉันแทบจะไม่สามารถบอกได้ว่ามันเป็นข้อได้เปรียบหรือไม่เนื่องจากหน้าจอยังซิงโครไนซ์กับ VSYNC ตามที่ระบุไว้ก่อนหน้านี้ความแตกต่างที่สำคัญคือSurfaceView
สามารถวาดบนพื้นหลัง theads แต่Views
ไม่สามารถ
SurfaceViews
ใช้ทรัพยากรมากขึ้นเพื่อว่าคุณจะไม่ต้องการใช้มันนอกจากคุณจะต้อง
A SurfaceView
คือมุมมองที่กำหนดเองใน Android ที่สามารถใช้วาดภายใน
ความแตกต่างที่สำคัญระหว่าง a View
และ a SurfaceView
คือมุมมองถูกวาดใน
UI Thread
ซึ่งใช้สำหรับการโต้ตอบกับผู้ใช้ทั้งหมด
หากคุณต้องการอัปเดต UI อย่างรวดเร็วเพียงพอและแสดงข้อมูลจำนวนมาก SurfaceView เป็นตัวเลือกที่ดีกว่า
แต่มีบางส่วนทางเทคนิค insides SurfaceView
:
1. พวกเขาไม่ใช่ฮาร์ดแวร์เร่งความเร็ว
2. มุมมองปกติจะแสดงผลเมื่อคุณเรียกใช้เมธอดinvalidate
หรือpostInvalidate()
แต่ไม่ได้หมายความว่ามุมมองจะได้รับการอัปเดตทันที (A VSYNC
จะถูกส่งไปและระบบปฏิบัติการจะตัดสินใจเมื่อได้รับการอัปเดตSurfaceView
สามารถอัปเดตได้ทันที
3. SurfaceView มี จัดสรรsurface buffer
ดังนั้นจึงมีราคาแพงกว่า
หนึ่งในความแตกต่างที่สำคัญระหว่างพื้นผิวและมุมมองคือการรีเฟรชหน้าจอสำหรับมุมมองปกติเราต้องเรียกวิธีการทำให้เป็นโมฆะจากเธรดเดียวกันที่กำหนดมุมมองไว้ แต่แม้ว่าเราจะเรียกว่าโมฆะการรีเฟรชจะไม่เกิดขึ้นทันที มันเกิดขึ้นหลังจากการมาถึงของสัญญาณ VSYNC ครั้งต่อไปเท่านั้น สัญญาณ VSYNC เป็นสัญญาณที่สร้างเคอร์เนลซึ่งเกิดขึ้นทุก ๆ 16.6 มิลลิวินาทีหรือที่รู้จักกันว่า 60 เฟรมต่อวินาที ดังนั้นหากเราต้องการควบคุมการรีเฟรชหน้าจอมากขึ้น (เช่นภาพเคลื่อนไหวที่เคลื่อนไหวเร็วมาก) เราไม่ควรใช้คลาสมุมมองปกติ
ในทางกลับกันในกรณีของ surfaceview เราสามารถรีเฟรชหน้าจอได้เร็วเท่าที่เราต้องการและเราสามารถทำได้จากเธรดพื้นหลัง การรีเฟรชภาพพื้นผิวดังนั้นจริงๆแล้วไม่ได้ขึ้นอยู่กับ VSYNC และนี่เป็นประโยชน์อย่างมากถ้าเราต้องการทำแอนิเมชันความเร็วสูง ฉันมีวิดีโอฝึกอบรมและตัวอย่างแอพพลิเคชั่นซึ่งอธิบายสิ่งเหล่านี้ได้ดี โปรดดูวิดีโอการฝึกอบรมต่อไปนี้
เหตุใดจึงใช้ SurfaceView ไม่ใช่คลาสมุมมองคลาสสิก ...
เหตุผลหลักประการหนึ่งคือ SurfaceView สามารถแสดงหน้าจอได้อย่างรวดเร็ว
กล่าวง่ายๆคือ SV มีความสามารถในการจัดการเวลาและแสดงภาพเคลื่อนไหวได้มากขึ้น
เพื่อให้เข้าใจได้ดีขึ้นว่า SurfaceView คืออะไรเราจะต้องทำการเปรียบเทียบกับคลาส View
ความแตกต่างคืออะไร ... ตรวจสอบคำอธิบายง่ายๆนี้ในวิดีโอ
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
ด้วยมุมมองเรามีปัญหาหนึ่งที่สำคัญ .... ระยะเวลาในการแสดงภาพเคลื่อนไหว
โดยปกติแล้ว onDraw () จะถูกเรียกจากระบบ Android รันไทม์
ดังนั้นเมื่อระบบรันไทม์ของ Android เรียกใช้ onDraw () ดังนั้นแอปพลิเคชันไม่สามารถควบคุมได้
เวลาในการแสดงผลและนี่เป็นสิ่งสำคัญสำหรับการเคลื่อนไหว เรามีช่องว่างของเวลา
ระหว่างแอพพลิเคชั่น (เกมของเรา) และระบบรันไทม์ของ Android
SV สามารถเรียกใช้ onDraw () โดยเธรดเฉพาะ
ดังนั้น: แอปพลิเคชันจะควบคุมเวลา ดังนั้นเราสามารถแสดงภาพบิตแมปถัดไปของภาพเคลื่อนไหวได้