ความแตกต่างระหว่าง SurfaceView และมุมมอง?


คำตอบ:


210

มุมมองทั้งหมดจะถูกวาดบนเธรด GUI เดียวกันซึ่งใช้สำหรับการโต้ตอบกับผู้ใช้ทั้งหมด

ดังนั้นหากคุณต้องการที่จะปรับปรุง GUI SurfaceViewอย่างรวดเร็วหรือถ้าการแสดงผลต้องใช้เวลามากเกินไปและส่งผลกระทบต่อประสบการณ์การใช้งานแล้วใช้


2
ตรวจสอบคำตอบของ pierr ซึ่งมีรายละเอียดเพิ่มเติม
Helin Wang

4
คำตอบรายละเอียดอย่างเป็นทางการ: developer.android.com/guide/topics/graphics/2d-graphics.html
Helin Wang

มันไม่ง่ายอย่างนี้อีกแล้ว ตรวจสอบคำตอบของ pierr มีลิงก์ไปยังเอกสารรายละเอียดสถาปัตยกรรม ( source.android.com/devices/graphics/architecture.html ) และอธิบายว่าทำไมการเร่งความเร็วฮาร์ดแวร์ของการเรนเดอร์ Canvas จึงสามารถทำให้ Views ที่กำหนดเองเป็นตัวเลือกที่ดีกว่า
ทำให้โกรธ

1
เมื่อใดที่จะใช้ FrameLayout เพื่อดูสแต็กแทนที่จะเป็น SurfaceView?
IgorGanapolsky

103

บางสิ่งที่ฉันสังเกตเห็น:

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

สำหรับข้อมูลเพิ่มเติม (และตัวอย่างการใช้งานที่ยอดเยี่ยม) ดูที่โครงการ LunarLander ในส่วนตัวอย่างของ SDK


36
FYI ... SurfaceView สามารถโปร่งใสได้แล้ว: stackoverflow.com/questions/5391089/…
Steve

@Ralphleon: คุณหมายถึงอะไรโดย Surface Views ไม่โปร่งใส? มุมมองอื่นสามารถทับซ้อนกับมุมมองพื้นผิวได้หรือไม่ ตัวอย่างเช่นฉันสามารถแสดง ListView บนมุมมองพื้นผิวได้ชั่วคราวหรือไม่
Ashwin

78

อัปเดตเมื่อ 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 ตามที่ระบุไว้ก่อนหน้านี้

2
จากคำตอบของคุณฉันรู้สึกว่ามันเป็นการดีกว่าถ้าจะใช้คลาสที่ได้จาก View กว่า SurfaceView หรือฉันกำลังทำอะไรผิดพลาด? สิ่งนี้จะตรงข้ามกับบทเรียนการพัฒนาเกม 2D ส่วนใหญ่
พายุ

2
@Storm สิ่งที่ต้องคำนึงถึงคือ SurfaceView โดยการออกแบบไม่ควรบล็อก UI Thread ที่มุมมองสามารถแก้ไขได้โดย UI Thread เท่านั้น สำหรับเกมส่วนใหญ่ SurfaceViews จะทำการเรนเดอร์เล็กน้อยซึ่งจะบล็อก UI Thread ด้วยมุมมองแบบง่าย นั่นคือประโยชน์หลักจากความเข้าใจของฉันเกี่ยวกับ SurfaceView
zgc7009

คุณหมายถึงอะไรโดยสร้างกระทู้แสดงผล เราต้องสร้างมันด้วยตัวเองทุกครั้งหรือไม่
IgorGanapolsky

44

ความแตกต่างที่สำคัญคือSurfaceViewสามารถวาดบนพื้นหลัง theads แต่Viewsไม่สามารถ SurfaceViewsใช้ทรัพยากรมากขึ้นเพื่อว่าคุณจะไม่ต้องการใช้มันนอกจากคุณจะต้อง


"พวกเขาใช้ทรัพยากรมากขึ้นดังนั้นคุณจึงไม่ต้องการใช้มันเว้นแต่คุณจะต้องทำ" - ใครใช้ทรัพยากรมากขึ้น ดูหรือ SurfaceViews?
Dror

6
Surfaceview ใช้ทรัพยากรมากกว่าจำนวนการดู
Ritesh Gune

1
@ RiteshGune ราคาเท่าไหร่?
Alex Sifuentes

เราต้องทำเมื่อไหร่?
IgorGanapolsky

12

A SurfaceViewคือมุมมองที่กำหนดเองใน Android ที่สามารถใช้วาดภายใน

ความแตกต่างที่สำคัญระหว่าง a Viewและ a SurfaceViewคือมุมมองถูกวาดใน UI Threadซึ่งใช้สำหรับการโต้ตอบกับผู้ใช้ทั้งหมด

หากคุณต้องการอัปเดต UI อย่างรวดเร็วเพียงพอและแสดงข้อมูลจำนวนมาก SurfaceView เป็นตัวเลือกที่ดีกว่า

แต่มีบางส่วนทางเทคนิค insides SurfaceView:

1. พวกเขาไม่ใช่ฮาร์ดแวร์เร่งความเร็ว

2. มุมมองปกติจะแสดงผลเมื่อคุณเรียกใช้เมธอดinvalidateหรือpostInvalidate()แต่ไม่ได้หมายความว่ามุมมองจะได้รับการอัปเดตทันที (A VSYNCจะถูกส่งไปและระบบปฏิบัติการจะตัดสินใจเมื่อได้รับการอัปเดตSurfaceViewสามารถอัปเดตได้ทันที

3. SurfaceView มี จัดสรรsurface bufferดังนั้นจึงมีราคาแพงกว่า


ทำไมมันจึงเป็นสิ่งสำคัญที่มีฮาร์ดแวร์เร่ง ?
IgorGanapolsky

8

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

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

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8


0

เหตุใดจึงใช้ SurfaceView ไม่ใช่คลาสมุมมองคลาสสิก ...

เหตุผลหลักประการหนึ่งคือ SurfaceView สามารถแสดงหน้าจอได้อย่างรวดเร็ว

กล่าวง่ายๆคือ SV มีความสามารถในการจัดการเวลาและแสดงภาพเคลื่อนไหวได้มากขึ้น

เพื่อให้เข้าใจได้ดีขึ้นว่า SurfaceView คืออะไรเราจะต้องทำการเปรียบเทียบกับคลาส View

ความแตกต่างคืออะไร ... ตรวจสอบคำอธิบายง่ายๆนี้ในวิดีโอ

https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30

ด้วยมุมมองเรามีปัญหาหนึ่งที่สำคัญ .... ระยะเวลาในการแสดงภาพเคลื่อนไหว

โดยปกติแล้ว onDraw () จะถูกเรียกจากระบบ Android รันไทม์

ดังนั้นเมื่อระบบรันไทม์ของ Android เรียกใช้ onDraw () ดังนั้นแอปพลิเคชันไม่สามารถควบคุมได้

เวลาในการแสดงผลและนี่เป็นสิ่งสำคัญสำหรับการเคลื่อนไหว เรามีช่องว่างของเวลา

ระหว่างแอพพลิเคชั่น (เกมของเรา) และระบบรันไทม์ของ Android

SV สามารถเรียกใช้ onDraw () โดยเธรดเฉพาะ

ดังนั้น: แอปพลิเคชันจะควบคุมเวลา ดังนั้นเราสามารถแสดงภาพบิตแมปถัดไปของภาพเคลื่อนไหวได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.