Android, OpenGL và mở rộng GLSurfaceView?


12

Câu hỏi này là một phần kỹ thuật, một phần meta, một phần chủ quan và rất cụ thể:

Tôi là một nhà phát triển game độc ​​lập làm việc trên Android và trong 6 tháng qua tôi đã đấu tranh và cuối cùng đã thành công trong việc tạo ra ứng dụng trò chơi 3D của riêng mình cho Android. Vì vậy, tôi nghĩ rằng tôi hy vọng vào SO và giúp đỡ những người khác đang vật lộn với Android và openGL-ES

Tuy nhiên, phần lớn các câu hỏi liên quan đến việc mở rộng GLSurfaceView. Tôi đã thực hiện toàn bộ ứng dụng của mình mà không cần mở rộng GLSurfaceView(và nó chạy tốt). Tôi không thể thấy bất kỳ lý do nào để mở rộng GLSurfaceViewcho phần lớn các câu hỏi tôi gặp.

Tồi tệ hơn, tài liệu android ngụ ý rằng bạn nên làm, nhưng không giải thích chi tiết về lý do hoặc những ưu / nhược điểm so với việc không mở rộng và thực hiện mọi thứ thông qua việc thực hiện của riêng bạn GLSurfaceView.Renderernhư tôi đã làm

Tuy nhiên, khối lượng câu hỏi lớn mà vấn đề hoàn toàn liên quan đến việc mở rộng GLSurfaceViewđang khiến tôi tự hỏi liệu thực sự có lý do nào thực sự tốt để làm theo cách đó so với cách tôi đã làm hay không (và gợi ý trong câu trả lời của tôi cho người khác làm).

Vì vậy, có điều gì tôi đang thiếu? Tôi có nên ngừng trả lời câu hỏi trong lúc này không?

Tài liệu openGL của Android


câu hỏi hay tôi rất quan tâm về câu trả lời ..
Tofeeq

Một lý do là tại sao mở rộng GLSurfaceView có thể được tìm thấy ở đây: gamedev.stackexchange.com/questions/12629/... Nếu không nhận ra điều đó, tôi thực sự đã tránh né các vấn đề được nói đến trong câu hỏi này trong ứng dụng của riêng mình bằng cách tải lại kết cấu vvonResume()
Spoon Thumb

Câu trả lời:


2

Tôi có một phần mở rộng rất nhỏ cho tôi GLSurfaceView, và hầu hết sự khôn ngoan thuộc về việc tôi thực hiện GLSurfaceView.Renderer. Tôi có ba lý do sau để sử dụng trình bao bọc cho GLSurfaceView:

  1. Cơ sở GLSurfaceViewcung cấp không có cách nào để lấy Rendererlại cá thể. Tôi có nhiều bề mặt và khi tôi nhận được một sự kiện UI cho một trong số chúng, tôi muốn truyền lệnh cho trình kết xuất tương ứng. Vì vậy, tôi ghi đè setRenderervà giữ tham chiếu trong lớp mở rộng của mình.

  2. GLSurfaceView.Rendererkhông nhận được thông báo cho onDetachedFromWindow()hoặc surfaceDestroyed(). Điều này gây ra một số vấn đề để thực hiện của tôi. Phần mở rộng của tôi GLSurfaceViewghi đè các phương thức này và cho mRenderer biết. Điều đó có thể vì §1 .

  3. Một số phương pháp chỉ được gói để thêm try { super.bất ; } catch() { log(cứ điều gì) } . Ví dụ: queueEvent()sẽ ném nếu Renderer không được đặt; nhưng đối với tôi, chỉ cần bỏ qua những mâu thuẫn dòng thời gian như vậy là ổn.


Tôi cũng đã bắt đầu làm điều này, mặc dù câu hỏi nhắm nhiều hơn vào lý do tại sao bạn có thể đưa logic thực tế vào một phần mở rộng GLSurfaceViewhơn là GLSurfaceView.Renderer. Mặc dù ở điểm 1, tôi vẫn giữ trình kết xuất dưới dạng một biến trong hoạt động của mình. Về lý thuyết tôi có thể lấy nó từ bất cứ đâu bằng cách chọn bối cảnh : ((MyActivity)view.getContext()).getRenderer(). Có lẽ nguy hiểm hơn một chút vì đối tượng bối cảnh có thể không nhất thiết phải làMyActivity
Spoon Thumb

Thật tốt nếu bạn có một trình kết xuất. Nhưng như tôi đã nói trước đây, chúng tôi có nhiều trình kết xuất và chúng được kết nối với các SurfaceView khác nhau - một mớ hỗn độn!
Alex Cohn

0

Ít nhất một lý do chính đáng để mở rộng GLSurfaceView là có thể khởi tạo nó trực tiếp từ tệp xml bố cục, giống như mọi tiện ích khác:

    <RelativeLayout ... >
      <com.example.MyGlSurfaceView
        android:id="@+id/my_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
      />
     </RelativeLayout>

1
Dù sao thì bạn cũng có thể làm điều đó bằng cách sử dụng<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
Spoon Thumb

Điểm tốt. Sự khác biệt là trong ví dụ của tôi, khung Android tăng cao và thiết lập mọi thứ mà không cần thêm dòng mã. Phương pháp của bạn là nhiều mã hơn, nhưng linh hoạt để thay thế thực hiện. Ngoài ra, cả hai cách có vẻ tương tự nhau.
Amir Uval

-1

Chà ... GLSurfaceView là, như tôi chắc chắn rằng bạn đã nhận thấy, chỉ là một trình bao bọc cho lợi ích chung. Nó gói gọn tất cả các chức năng mà người ta sẽ cần kết xuất với opengl, có tùy chọn kết hợp độc đáo với hệ thống phân cấp Chế độ xem Android.

Bạn không cung cấp giải pháp thay thế để không thể so sánh, nhưng tôi hy vọng bạn đã sinh ra một chủ đề khác để hiển thị như GLSurfaceView, hoặc đầu vào người dùng của bạn có thể bị trễ.

Vì vậy, một lần nữa: GLSurfaceView cung cấp một luồng mới để kết xuất, do đó bạn không phải lo lắng về độ trễ đầu vào của người dùng


2
Có, nhưng GLSurfaceViewthực hiện điều đó (bắt đầu một chuỗi kết xuất) ngay cả khi bạn không mở rộng nó. Tôi sử dụng GLSurfaceView, nhưng tôi không mở rộng nó. Tôi đang hỏi những lợi ích gì từ việc mở rộng nó và ghi đè các phương thức khác nhau trong đó thay vì chỉ có mọi thứ trongRenderer
Spoon Thumb

Welp, tôi đã thử :) Tôi có thể xem xét nó sau, bây giờ tôi cũng quan tâm!
Greg
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.