2012-10-02 11 views
12

Tôi đang tạo ứng dụng máy ảnh và ứng dụng này sẽ cung cấp một số bộ lọc cho người dùng. Hiện tại mã của tôi là trên NDK và nó hoạt động Ok, tuy nhiên tôi muốn làm cho nó nhanh hơn một chút. Có vẻ như GPU và opengl Es 2.0 là con đường để đi. Mối quan tâm duy nhất của tôi với GPU là giới hạn bộ nhớ của họ. Vì các máy ảnh hiện đại có hình ảnh 5-10 mp trong khi giới hạn bộ nhớ GPU ít hơn nhiều so với máy ảnh. Tôi đã tự hỏi nếu có một cách để làm việc xung quanh giới hạn đó. Tùy chọn hợp lý duy nhất dường như với tôi là chia nhỏ hình ảnh hơn một phần, và sau đó xử lý chúng trên GPU và cuối cùng là đưa chúng vào hình ảnh cuối cùng. Câu hỏi của tôi là, nếu cách tiếp cận này vẫn sẽ tốt cho hiệu suất và cũng có tùy chọn khác để xử lý hình ảnh hình ảnh có độ phân giải cao trên GPU di động.Làm cách nào để xử lý giới hạn bộ nhớ của GPU để xử lý hình ảnh có độ phân giải cao trên GPU?

Chỉnh sửa: Tôi cần làm rõ rằng tôi muốn sử dụng GPU để xử lý hình ảnh để mục tiêu của tôi không hiển thị kết quả trên màn hình. Tôi sẽ đưa nó vào một texture khác và lưu nó vào đĩa.

+1

Nó thực sự phụ thuộc vào những gì bạn đang cố gắng làm. Ưu điểm mà GPU cung cấp là chúng có tính song song cao, nhưng không phải tất cả các vấn đề đều có thể được thực hiện dễ dàng hơn bằng cách đơn giản là ném nhiều lõi hơn vào chúng. – thecoshman

+0

Tôi muốn nhận được một giải pháp chung cho một vấn đề chung tuy nhiên hiện tại tôi đang cố gắng để mã "kim tự tháp Laplacian" mà là rất tốn kém khi nó được thực hiện trên CPU. – dirhem

+0

tốt, nếu bạn đang làm một cái gì đó như áp dụng một màu sắc cho một hình ảnh, nơi bạn muốn áp dụng các hoạt động tương tự cho tất cả các bit, sau đó tải lên GPU là một giải pháp rõ ràng. các tác vụ như làm mờ hình ảnh phức tạp hơn một chút, vì mỗi pixel giá trị mới tùy thuộc vào phạm vi pixel. Trong trường hợp của bạn, bạn phải xem xét có rất nhiều sự khác biệt giữa phần cứng, chẳng hạn như bao nhiêu ram họ hỗ trợ, làm thế nào lớn một kết cấu, bao nhiêu dữ liệu bạn có thể gửi cho họ. Họ thậm chí không thể thực hiện xử lý kiểu OpenCL – thecoshman

Trả lời

2

Ý tưởng ốp lát của bạn đã được sử dụng từ Hệ thống giải trí Nintendo, có hệ thống Ricoh 2A03 ở tốc độ 1.79 MHz, vì vậy đây là một cách tiếp cận tốt. Google sử dụng ốp lát để quản lý hiển thị bản đồ và thậm chí các trò chơi như Crysis có xu hướng giới hạn kích thước hoạ tiết của hầu hết các hoạ tiết của chúng thành một thứ như 1024x1024 (1 megapixel). Và vâng, 10 megapixel yêu cầu 30 megabyte RAM, vì vậy một số thiết bị có thể gặp sự cố, đặc biệt là nếu bạn sử dụng nguồn và kết cấu đích, điều đó có nghĩa là 60 megabyte RAM được yêu cầu.

Chỉ cần nhớ rằng kích thước họa tiết có xu hướng sử dụng công suất 2 (2, 4, 8, 16, 32, 64, v.v.). Đôi khi bạn sẽ nhận được chất lượng tốt hơn ít nhất nếu bạn cắt nó lên và xếp hình ảnh lên.

2

Bạn không cần phải áp dụng bộ lọc thời gian thực vào hình ảnh 10 mp ... vì không có màn hình như vậy (hoặc có thể có nhưng không phổ biến trong số chúng tôi). :)

Vì vậy, bạn chỉ cần áp dụng các bộ lọc trên các pixel đang được hiển thị (1900x1280?). Kỹ thuật lát gạch bạn đã đề cập vẫn sẽ được sử dụng với một số tình huống. Biểu diễn trì hoãn là ví dụ như vậy. X-Box 360 sử dụng cả hai kỹ thuật (ốp lát với trì hoãn) trên cơ sở hàng ngày. Không tiling nó sẽ không thể vì yêu cầu bộ nhớ cao cho kỹ thuật trì hoãn.

+0

Tôi đã chỉnh sửa câu hỏi để làm rõ rằng tôi sẽ không sử dụng gpu để đổi hình ảnh thành màn hình. Tôi không có gì để làm với màn hình và độ phân giải của nó cả. Xử lý hình ảnh sẽ được thực hiện nền và màn hình sẽ chỉ hiển thị một thanh tiến trình. Vì vậy, giới hạn bộ nhớ GPU vẫn còn đó cho tôi. – dirhem