2012-03-30 39 views
5

Tôi có một số mô-đun phải xử lý luồng video trong thời gian thực. Cách tiếp cận đơn giản sẽ là có một bộ đệm khung, từ đó các mô-đun lấy hình ảnh video, xử lý, và sau đó loại bỏ chúng.Nhiều bộ đệm logic trong một bộ đệm khung thực

Vấn đề # 1: Không phải tất cả các mô-đun đều hoạt động ở cùng tốc độ. Một số có thể xử lý tất cả các khung hình, một số không. Vì vậy, một số mô-đun sẽ không xử lý tất cả các khung. Nếu tôi đợi tất cả các mô-đun kết thúc công việc trước khi loại bỏ bộ đệm, các bộ phận nhanh hơn sẽ không có lý do gì (Hình A).

Một giải pháp đơn giản là Hình B. Một bộ đệm riêng biệt cho mỗi mô-đun. Nếu bộ đệm đầy, khung sẽ không được đặt ở đó. Nhưng vấn đề # 2 phát sinh: Bộ nhớ bị lãng phí: Một số khung sẽ có nhiều bản sao trong các bộ đệm khác nhau.

Giải pháp thông minh hơn sẽ là một bộ đệm vật lý, với bộ đệm logic hợp lý hơn, như trong Hình C. Một khung được thêm vào trong bộ đệm thực khi ít nhất một bộ đệm logic có thể chứa nó, và một bộ đệm thực sự sẽ bị xóa khi tất cả các bộ đệm logic liên kết đến nó sẽ bị loại bỏ. (Một giải pháp thực hiện đơn giản được đưa ra bởi con trỏ thông minh - Thêm một con trỏ thông minh vào bộ đệm cho tất cả các bộ đệm logic có thể chứa nó) Bài toán số 3: Có thể xảy ra, trong trường hợp xấu nhất, mỗi khung được gán cho một mô-đun, và thay vì chia sẻ, nó sẽ là một lộn xộn bốc thăm lại để Solution B.

Câu hỏi

có cách nào tốt hơn để đối phó với vấn đề này? Một câu trả lời tiêu chuẩn? Một thư viện mẫu thực hiện nó?

Sửa này cơ chế nào đó phức tạp để sử dụng bộ đệm, nhưng loại bỏ khung nếu bộ đệm đầy, cung cấp một giải pháp mở rộng trên nền tảng khác nhau: Tôi xử lý như nhiều khung hình càng tốt, không phụ thuộc vào các module hoặc hiệu suất phần cứng.

enter image description here

+2

Tại sao bạn có hàng đợi nếu hệ thống được thiết kế để không thành công (các mô-đun được thiết kế không thể theo kịp tỷ lệ đầy đủ)? Bạn cần xác định cách bạn muốn hệ thống hoạt động nếu không có thời gian cho tất cả các mô-đun hoàn tất. – blueshift

+0

Thời gian xử lý mỗi khung hình không phải là không đổi, ngay cả trong cùng một mô-đun. Có một hàng đợi ngắn (2-3 khung hình) cho phép tôi bao gồm các biến động trong thời gian xử lý mà không làm mất quá nhiều khung hình. Nhưng nếu tốc độ xử lý thấp trung bình, nó sẽ có thể tự động bỏ qua một số khung hình. – Sam

+0

có lẽ tôi chưa đủ rõ ràng: Tôi muốn mỗi mô-đun xử lý nhiều khung hình nhất có thể, mà không có kiến ​​thức * ưu tiên * về hiệu suất của từng mô-đun – Sam

Trả lời

3

Dưới đây là hai phương pháp tôi đã thấy trong các hệ thống sản xuất video real-time:

  1. Tương tự như tùy chọn A, lưu trữ một danh sách duy nhất của bộ đệm, nhưng thêm hai bộ cờ để mỗi bộ đệm. Tập cờ đầu tiên xác định nhiệm vụ nào cần được thực hiện trên bộ đệm, và bộ cờ thứ hai xác định nhiệm vụ nào đã được thực hiện. Khi mỗi mô-đun đã sẵn sàng, nó sẽ quét danh sách các bộ đệm cho đến khi nó tìm thấy bộ đệm mà nó có thể trợ giúp.

  2. Tương tự như tùy chọn C, sử dụng nhiều năm mươi chứa con trỏ đến dữ liệu khung thực tế. Sử dụng reference counting để theo dõi những khung hình nào vẫn còn hoạt động. Điều này có nghĩa là mỗi khi bạn tạo một con trỏ mới vào khung, bạn gọi một hàm để tăng số lượng tham chiếu của nó và mỗi khi bạn kết thúc bằng con trỏ, bạn gọi hàm để giảm số lượng tham chiếu. Khung có thể được sử dụng lại khi số lượng tham chiếu của chúng đạt đến 0.

Theo tôi, phương pháp đầu tiên đơn giản hơn và tốt nếu bạn có một số ít khung hình nổi bật và một số nhiệm vụ xử lý nhỏ, nhưng thứ hai tổng quát hơn và dễ dàng hơn đến một hệ thống phức tạp hơn.

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