Sự khác biệt giữa SurfaceView và View?


211

Khi nào cần thiết, hoặc tốt hơn là sử dụng SurfaceViewthay vì a View?

Câu trả lời:


210

Tất cả các khung nhìn được vẽ trên cùng một luồng GUI cũng được sử dụng cho tất cả các tương tác của người dùng.

Vì vậy, nếu bạn cần cập nhật GUI nhanh chóng hoặc nếu việc kết xuất mất quá nhiều thời gian và ảnh hưởng đến trải nghiệm người dùng thì hãy sử dụng SurfaceView.


2
Kiểm tra câu trả lời của pierr có chứa nhiều chi tiết hơn.
Helin Wang

4
Câu trả lời chi tiết chính thức: developer.android.com/guide/topics/graphics/2d-graphics.html
Helin Wang

Nó không còn đơn giản như thế này nữa. Kiểm tra câu trả lời của pierr; nó có một liên kết đến tài liệu kiến ​​trúc chi tiết ( source.android.com/devices/graphics/arch architecture.html ) và giải thích tại sao việc tăng tốc phần cứng của kết xuất Canvas có thể làm cho Chế độ xem tùy chỉnh trở thành lựa chọn tốt hơn.
fadden

1
Khi nào nên sử dụng FrameLayout để xếp chồng lượt xem, thay vì SurfaceView?
IgorGanapolsky

103

Một vài điều tôi đã lưu ý:

  • SurfaceViews chứa một cơ chế kết xuất đẹp cho phép các luồng cập nhật nội dung của bề mặt mà không cần sử dụng trình xử lý (tốt cho hoạt hình).
  • Surfaceview không thể trong suốt, chúng chỉ có thể xuất hiện phía sau các yếu tố khác trong hệ thống phân cấp chế độ xem.
  • Tôi thấy rằng chúng hoạt hình nhanh hơn nhiều so với hiển thị trên Chế độ xem.

Để biết thêm thông tin (và một ví dụ sử dụng tuyệt vời), hãy tham khảo dự án LunarLander trong phần ví dụ của SDK.


36
FYI ... Một SurfaceView bây giờ có thể trong suốt: stackoverflow.com/questions/5391089/ trên
Steve

@Ralphleon: Ý nghĩa của Surface Views không thể minh bạch? Các khung nhìn khác có thể chồng lên khung nhìn Surface không? Ví dụ: tôi có thể tạm thời hiển thị ListView trên chế độ xem Surface không?
Ashwin

78

cập nhật ngày 05/09/2014

ĐỒNG Ý. Chúng tôi có tài liệu chính thức bây giờ. Nó nói tất cả những gì tôi đã đề cập, theo một cách tốt hơn.


Đọc thêm chi tiết tại đây .

Có, sự khác biệt chính là SurfaceView có thể được cập nhật trên luồng nền. Tuy nhiên, có nhiều bạn có thể quan tâm.

  • SurfaceView đã dành bộ đệm bề mặt trong khi tất cả các khung nhìn chia sẻ một bộ đệm bề mặt được phân bổ bởi ViewRoot. Nói cách khác, SurfaceView tốn nhiều tài nguyên hơn.

  • SurfaceView không thể được tăng tốc phần cứng (kể từ JB4.2) trong khi 95% hoạt động trên Chế độ xem bình thường được tăng tốc bằng cách sử dụng openGL ES.

  • Nhiều công việc nên được thực hiện để tạo SurfaceView tùy chỉnh của bạn. Bạn cần lắng nghe sự kiện SurfaceCreated / Destroy, tạo một luồng kết xuất, quan trọng hơn là đồng bộ hóa luồng kết xuất và luồng chính. Tuy nhiên, để tùy chỉnh Chế độ xem, tất cả những gì bạn cần làm là ghi đè onDrawphương thức.

  • Thời gian để cập nhật là khác nhau. Cơ chế cập nhật chế độ xem bình thường là ràng buộc hoặc được kiểm soát bởi khung: Bạn gọi view.invalidatetrong luồng UI hoặc view.postInvalidtrong luồng khác để chỉ ra khung mà chế độ xem cần được cập nhật. Tuy nhiên, chế độ xem sẽ không được cập nhật ngay lập tức mà hãy đợi cho đến khi sự kiện VSYNC tiếp theo đến. Cách tiếp cận dễ hiểu để hiểu VSYNC là coi nó như một bộ đếm thời gian kích hoạt cứ sau 16ms cho màn hình 60fps. Trong Android, tất cả các cập nhật chế độ xem bình thường (và thực sự hiển thị nhưng tôi sẽ không nói về nó ngày hôm nay), được đồng bộ hóa với VSYNC để đạt được độ mượt tốt hơn. Bây giờ, quay lại SurfaceView, bạn có thể kết xuất nó bất cứ lúc nào bạn muốn. Tuy nhiên, tôi khó có thể biết đó có phải là một lợi thế hay không, vì màn hình cũng được đồng bộ hóa với VSYNC, như đã nêu trước đây.

2
Từ câu trả lời của bạn, tôi có cảm giác tốt hơn là sử dụng một lớp có nguồn gốc từ View so với SurfaceView. Hay tôi đang nhận được một cái gì đó sai? Điều này sẽ trái ngược với phần lớn các hướng dẫn phát triển trò chơi 2D.
Bão

2
@Storm một điều cần xem xét là SurfaceView theo thiết kế không nên chặn Chủ đề giao diện người dùng trong đó Chế độ xem chỉ có thể được sửa đổi bởi Chủ đề giao diện người dùng. Với hầu hết các trò chơi, SurfaceViews sẽ thực hiện một chút kết xuất tốt, điều này sẽ chặn UI Thread với một giao diện đơn giản. Đó là lợi ích chính, từ sự hiểu biết của tôi, về SurfaceView.
zgc7009

Bạn có ý nghĩa gì bằng cách tạo ra một chủ đề kết xuất . Chúng ta phải tạo ra điều này bằng tay mỗi lần?
IgorGanapolsky

44

Sự khác biệt chính là SurfaceViewcó thể được rút ra bởi các nền tảng nhưng Viewskhông thể. SurfaceViewssử dụng nhiều tài nguyên hơn mặc dù vậy bạn không muốn sử dụng chúng trừ khi bạn phải làm vậy.


"Tuy nhiên, họ sử dụng nhiều tài nguyên hơn nên bạn không muốn sử dụng chúng trừ khi bạn phải làm vậy." - Ai sử dụng nhiều tài nguyên hơn? Lượt xem hay SurfaceViews?
Dror

6
Surfaceview sử dụng nhiều tài nguyên hơn lượt xem
Ritesh Gune

1
@RiteshGune giá bao nhiêu?
Alex Sifuentes

Khi nào chúng ta phải ?
IgorGanapolsky

12

A SurfaceViewlà chế độ xem tùy chỉnh trong Android có thể được sử dụng để vẽ bên trong nó.

Sự khác biệt chính giữa a Viewvà a SurfaceViewlà Chế độ xem được vẽ trong UI Thread, được sử dụng cho tất cả các tương tác của người dùng.

Nếu bạn muốn cập nhật UI đủ nhanh và cung cấp một lượng thông tin tốt trong đó, SurfaceView là lựa chọn tốt hơn.

Nhưng có một vài kỹ thuật bên trong SurfaceView:

1. Chúng không được tăng tốc phần cứng.

2. quan điểm thông thường được trả lại khi bạn gọi phương pháp invalidatehay postInvalidate(), nhưng điều này không có nghĩa là quan điểm sẽ được cập nhật ngay lập tức (A VSYNCsẽ được gửi đi, và hệ điều hành sẽ quyết định khi nó được cập nhật. Các SurfaceViewthể được cập nhật ngay lập tức.

3. Một SurfaceView có một phân bổ surface buffer, vì vậy nó là tốn kém hơn


Tại sao điều quan trọng là phải tăng tốc phần cứng ?
IgorGanapolsky

8

Một trong những khác biệt chính giữa lướt web và xem là để làm mới màn hình cho chế độ xem bình thường, chúng ta phải gọi phương thức không hợp lệ từ cùng một luồng trong đó chế độ xem được xác định. Nhưng ngay cả khi chúng tôi gọi không hợp lệ, việc làm mới không xảy ra ngay lập tức. Nó chỉ xảy ra sau khi tín hiệu VSYNC đến tiếp theo. Tín hiệu VSYNC là tín hiệu được tạo ra hạt nhân xảy ra cứ sau 16,6 ms hoặc đây còn được gọi là 60 khung hình mỗi giây. Vì vậy, nếu chúng ta muốn kiểm soát nhiều hơn đối với việc làm mới màn hình (ví dụ cho hoạt hình chuyển động rất nhanh), chúng ta không nên sử dụng lớp xem bình thường.

Mặt khác, trong trường hợp lướt web, chúng ta có thể làm mới màn hình nhanh như chúng ta muốn và chúng ta có thể làm điều đó từ một luồng nền. Vì vậy, việc làm mới lượt xem lướt web thực sự không phụ thuộc vào VSYNC và điều này rất hữu ích nếu chúng ta muốn làm hoạt hình tốc độ cao. Tôi có một vài video đào tạo và ứng dụng ví dụ giải thích tất cả những điều này một cách độc đáo. Xin vui lòng xem các video đào tạo sau đây.

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8


0

Tại sao nên sử dụng SurfaceView mà không phải lớp View cổ điển ...

Một lý do chính là SurfaceView có thể nhanh chóng kết xuất màn hình.

Nói một cách đơn giản, một SV có khả năng quản lý thời gian và kết xuất hình ảnh động.

Để hiểu rõ hơn về SurfaceView là gì, chúng ta phải so sánh nó với lớp View.

Sự khác biệt là gì ... kiểm tra lời giải thích đơn giản này trong video

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

Vâng, với Chế độ xem, chúng tôi có một vấn đề lớn .... thời gian hiển thị hình ảnh động.

Thông thường, onDraw () được gọi từ hệ thống thời gian chạy Android.

Vì vậy, khi hệ thống thời gian chạy Android gọi onDraw () thì ứng dụng không thể kiểm soát

thời gian hiển thị, và điều này rất quan trọng đối với hoạt hình. Chúng ta có một khoảng cách về thời gian

giữa ứng dụng (trò chơi của chúng tôi) và hệ thống thời gian chạy Android.

SV nó có thể gọi onDraw () bằng một luồng chuyên dụng.

Do đó: ứng dụng kiểm soát thời gian. Vì vậy, chúng ta có thể hiển thị hình ảnh bitmap tiếp theo của hình ảnh động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.