Câu trả lời:
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
.
Một vài điều tôi đã lưu ý:
Để 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.
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 đè onDraw
phương thức.
view.invalidate
trong luồng UI hoặc view.postInvalid
trong 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.Sự khác biệt chính là SurfaceView
có thể được rút ra bởi các nền tảng nhưng Views
không thể.
SurfaceViews
sử 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.
A SurfaceView
là 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 View
và a SurfaceView
là 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 invalidate
hay 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 VSYNC
sẽ được gửi đi, và hệ điều hành sẽ quyết định khi nó được cập nhật. Các SurfaceView
thể đượ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
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.
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.