2011-12-09 33 views
5

Tôi đang sử dụng OpenGL ES để thực hiện vẽ trong ứng dụng Android.Android: Đồng bộ hóa với chuỗi trình kết xuất OpenGL

Tôi muốn viết một hàm được gọi từ chuỗi giao diện người dùng sẽ gọi chuỗi trình kết xuất và làm cho nó đọc và trả lại hình ảnh cho người gọi.

Tôi đã suy nghĩ về việc sử dụng Future để chuỗi giao diện người dùng có thể ngủ trong khi trình kết xuất ghi dữ liệu hình ảnh (thao tác đó rất nhanh, vì vậy người dùng sẽ không cảm thấy ứng dụng không phản hồi).

Nhưng tôi không biết cách gửi Tương lai cho chuỗi trình kết xuất. Tất cả các ví dụ tôi tìm thấy tạo chủ đề của riêng mình và sau đó gửi tương lai cho các chủ đề này. Tài liệu hướng dẫn về GLSurfaceView đề cập đến "Phương thức queueEvent() được sử dụng để giao tiếp an toàn giữa chuỗi giao diện người dùng và chuỗi hiển thị. Nếu bạn thích, bạn có thể sử dụng một số kỹ thuật giao tiếp chéo qua Java khác, chẳng hạn như các phương thức đồng bộ hóa trên lớp Renderer . " vì vậy có vẻ như sử dụng Tương lai thay vì gọi queueEvent() là có thể, nhưng tôi không biết làm thế nào để làm điều đó.

Trả lời

7

Thy này, tôi đã không kiểm tra nó, vì vậy có thể không làm việc:

FutureTask<YourReturnObject> futureTask = new FutureTask<YourReturnObject>(new Callable<YourReturnObject>() { 
    @Override 
    public YourReturnObject call() throws Exception { 
     //your gl stuff here 
     return // result 
    } 
}); 
glSurfaceView.queueEvent(futureTask); 
YourReturnObject result=futureTask.get(); // should block until gl thread is done. 
4

tôi muốn đề nghị không mở rộng GLSurfaceView, nhưng thay vì làm truyền thông không đồng bộ giữa các chủ đề. Xem số answer here của tôi cho một vài ví dụ

Về cơ bản bạn xếp hàng các nhiệm vụ trong việc triển khai các cuộc gọi phương thức GLSurfaceView.Renderer qua nó. Sau đó, khi chuỗi GL gọi phương thức onDraw() của bạn trong Trình kết xuất đồ họa, bạn thực thi các tác vụ xếp hàng đó. Khi hoàn thành các nhiệm vụ, chỉ ra các chủ đề khác mà các nhiệm vụ được hoàn thành bằng cách sử dụng Handler

Cũng đừng ngủ chủ đề giao diện người dùng. Nếu chuỗi giao diện người dùng bị đặt vào chế độ ngủ, hệ điều hành Android sẽ không nhận được phản hồi từ đó và thông báo sai rằng ứng dụng đã bị lỗi, (bị phát hiện trong vòng lặp vô hạn hoặc thứ gì đó) và sẽ ném một cuộc đối thoại gần với người dùng

Các vấn đề liên quan