2012-04-20 37 views
7

Tôi đã tạo trình phát phim dựa trên FFmpeg. Nó hoạt động tốt. Giải mã khá nhanh, trên LG P970 (Cortex A8 với Neon) Tôi có tốc độ trung bình 70 khung hình/giây với dòng video độ phân giải 640 x 424 bao gồm chuyển đổi YUV2RGB. Tuy nhiên, có một nút cổ chai. Nó đang vẽ trên Canvas.Cách tăng hiệu suất bản vẽ bitmap trên Android

Tôi sử dụng thư viện gốc jnigraphics để điền dữ liệu hình ảnh vào bitmap ở phía gốc và sau đó tôi vẽ bitmap này trên Canvas trong SurfaceView. Đó là cách tiếp cận khá đơn giản và phổ biến, nhưng bản vẽ mất 44 ms cho bitmap với độ phân giải 640 x 424 làm giảm fps xuống 23 và làm cho kỹ thuật này không thể sử dụng được ... Phải mất rất nhiều thì toàn bộ giải mã khung A/V!

Có phương pháp nào để vẽ bitmap nhanh hơn đáng kể không? Tôi muốn hiển thị hoàn toàn trong mã gốc bằng cách sử dụng OpenGLES 2, nhưng tôi đã đọc nó cũng có thể là slow. Vì vậy, những gì bây giờ? ...

Tôi làm cách nào để hiển thị bitmap nhanh nhất có thể?

+0

không có cách nào để truy cập bộ đệm của SurfaceView trực tiếp từ mã gốc? Xem trước máy ảnh thực hiện điều này. – zapl

+0

AFAIK không, ít nhất là không có cách tiêu chuẩn nào khi sử dụng NDK. Tất nhiên, nó có thể liên kết với các nguồn Android, nhưng nó sẽ gây ra rắc rối với khả năng tương thích ... – vitakot

Trả lời

3

Vẽ chúng trong GLES1.x. Bạn không cần phải sử dụng GLES2 vì bạn sẽ không sử dụng, hoặc ít nhất là không trong bối cảnh của câu hỏi của bạn, cho shaders đó sẽ là lý do chính chung của việc sử dụng GLES2.x. Vì vậy, vì mục đích đơn giản, GLES1.x sẽ là lý tưởng. Tất cả những gì bạn cần làm là vẽ dấu gạch ngang lên màn hình. Trên Galaxy S của tôi (Vibrant), nó mất khoảng 3ms. Kích thước của byte [] trong hình nền của tôi là 800x480x3 hoặc 1152000 là lớn hơn đáng kể so với những gì bạn đang làm việc.

Tôi tin rằng hướng dẫn này sẽ chỉ cho bạn đúng hướng.

http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

Đối với các khái niệm về tiếp cận vải từ mã nguồn gốc, tôi sẽ chỉ tránh điều đó hoàn toàn và làm theo một thực hiện OpenGL bằng cách giảm tải mọi thứ để GPU càng nhiều càng tốt.

+0

Cảm ơn, bạn là đúng; Tôi sẽ chuyển về OpenGLES1.x. Tôi không có kinh nghiệm với Open GL vì vậy giả định của tôi là mới hơn là tốt hơn. Tôi đã đọc bài viết trong liên kết bạn đã cung cấp. Trên thực tế, tôi nghĩ rằng tôi phải đọc tất cả các bài báo liên quan mà Google có thể tìm thấy cho tôi, ngay cả đối với nền tảng iOS ... Sau một ngày nghiên cứu, tôi vẫn bị mất một chút. – vitakot

+0

Cả hai phiên bản đều truy cập cùng một phần cứng. Sức mạnh trong 2.0 đến từ phần cứng bổ sung mà bạn có quyền truy cập (bộ xử lý đổ bóng). Vì vậy, trong ánh sáng đó, tôi nghĩ thật khó để nói một điều tốt hơn hay tệ hơn, nó thường đơn giản như việc quyết định những gì bạn cần để đạt được. –

2

Tôi nhớ lại trong bản trình bày Đảo Replica trong GoogleIO, nhà thiết kế nói rằng sử dụng phần mở rộng OpenGL 'draw_texture' glDrawTexfOES là cách nhanh nhất để chuyển sang màn hình và nhanh hơn đáng kể so với chỉ vẽ tứ bình thường với họa tiết đính kèm. giả sử bạn đang sử dụng OpenGL).

Bạn không thể xoay kết cấu, nhưng không có vẻ như bạn cần.

+0

Bạn nói đúng, tôi không quan tâm đến việc xoay vòng. Tôi tìm thấy một số ví dụ tốt đẹp bằng cách sử dụng OpenGLES1.x (https://github.com/richq/glbuffer) trong đó sử dụng chức năng bạn đã đề cập. – vitakot

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