Kiến trúc phù hợp để hiển thị lịch sử của dữ liệu truyền phát (điểm)


7

Tổng quat

Chương trình của tôi nhận được một số điểm dữ liệu (0-400 mỗi giây).

// simplified example of point's data structure
struct Point {
    QPoint p;
    QTime t;
    quint32 value;
}
  • Tôi cần kết xuất một số điểm đã lọc (ví dụ: đó point.time > currentTime-5point.value>5).
  • Tôi cần lưu trữ lịch sử dữ liệu (tối đa ~ 50'000 điểm).
  • Dữ liệu cũng có thể được sử dụng trên CPU.
  • Tôi sẽ sử dụng chọn đối tượng.
  • Điểm được hiển thị trong 3d.
  • Vị trí camera có thể thay đổi, nhưng dữ liệu điểm là không đổi.

Câu hỏi

Kiến trúc tốt nhất để thực hiện loại vấn đề này là gì? Thực tiễn tốt nhất với loại dữ liệu này là gì và thực tiễn cần tránh là gì?

Phương pháp khả thi

  • Lưu trữ và lọc dữ liệu.
    1. Lưu trữ dữ liệu trên CPU (tọa độ thế giới), lọc dữ liệu trên CPU và gửi dữ liệu đã lọc đến VBO, tính toán tọa độ không gian màn hình với các shader.
    2. Lưu trữ dữ liệu trên CPU và GPU (cập nhật VBO khi có điểm mới đến).
      Lọc các điểm trên CPU và tính toán bù đắp và sử dụng glMultiDrawArrays.
    3. Chỉ lưu trữ dữ liệu trên GPU (cập nhật VBO khi đến điểm).
      Lọc nó bằng shader, lấy dữ liệu từ VBO sang CPU khi cần.

Giải pháp 1. khá dễ, nhưng tôi nghĩ đó là một thực tế tồi.
Giải pháp 2. có sự trùng lặp dữ liệu, nhưng rất dễ lọc dữ liệu.
Giải pháp 3. có dữ liệu đọc GPU-> CPU.

Tôi đã thử những giải pháp đó và Giải pháp 2. xảy ra với tôi là tốt nhất, nhưng có một số vấn đề với nó:

  • Nhân dữ liệu phải được xử lý nhẹ nhàng.
  • Nó không phải là giải pháp dễ đọc và dễ sửa đổi nhất.
  • Khi có những thay đổi trong dữ liệu, có rất nhiều thứ phải thay đổi.
    Tôi đã sử dụng một cái gì đó như bộ đệm tròn trên VBO và gửi offset để kết xuất nó.

Môi trường

  • OpenGL 3.3
  • Qt 5+ ràng buộc
  • Linux

PS
Tôi còn khá mới đối với đồ họa máy tính và openGL, vì vậy có lẽ loại vấn đề này thậm chí còn có tên của nó. Tôi đã thay đổi việc thực hiện của mình vài lần, tôi mất rất nhiều thời gian và tôi không hài lòng với nó vì sự phức tạp của nó. Bất kỳ tài liệu, hướng dẫn và suy nghĩ đều được chào đón.

Câu trả lời:


4

Lời khuyên của tôi thực sự sẽ là gắn bó với giải pháp 1 trừ khi và cho đến khi cần thêm điều gì đó. Đó là cách đơn giản và dễ hiểu nhất, và nó hoàn toàn khả thi để làm cho nó hoạt động tốt.

Một mặt, có thể lãng phí khi lọc lại các điểm và tải lại một loạt dữ liệu lên VBO mỗi khung hình. Tôi đoán rằng đây là lý do tại sao bạn nói nó là một "thực hành xấu". Nhưng hãy xem xét tổng số lượng dữ liệu liên quan. Một ước tính thứ tự độ lớn cho thấy rằng việc xử lý lượng dữ liệu này mỗi khung hình không phải là nhiều công việc cho một máy tính hiện đại.

Cấu Pointtrúc bạn trích dẫn trông giống như khoảng 20 byte (giả sử đó plà 3 float và tlà một float hoặc int). Với 50.000 điểm, tổng kích thước của dữ liệu khoảng 1 MB. Ngay cả khi cấu trúc dữ liệu thực tế của bạn lớn hơn một chút, tổng kích thước của dữ liệu chỉ là một vài MB theo một số lượng nhỏ theo tiêu chuẩn ngày nay. Thời gian cần thiết để xử lý lượng dữ liệu này trên CPU và chuyển nó sang GPU, theo thứ tự ~ 0,1 ms. (Giả sử băng thông CPU ~ 20 GB / giây và băng thông truyền PCIe ~ 8 GB / giây.) Vì vậy, đây là lượng dữ liệu hoàn toàn hợp lý để xử lý lại từng khung và trên thực tế bạn có thể xử lý nhiều lần hơn mà không cần nhấn mạnh hệ thống nào cả.

Vì vậy, chỉ cần giữ mọi thứ đơn giản và hiệu quả để truy cập bộ nhớ:

  1. Lưu trữ các điểm trong một mảng phẳng lớn (có thể sử dụng bộ đệm vòng để cho phép các điểm đến mới ghi đè lên các điểm cũ).
  2. Mỗi khung hình, quét các điểm bằng cách sử dụng một vòng lặp chặt chẽ trên CPU và sao chép các điểm vượt qua bộ lọc vào VBO.
    • Để có hiệu quả tốt nhất, có lẽ bạn nên sử GL_DYNAMIC_DRAWdụng khi sử dụng VBO, sau đó sử dụng glMapBufferRangetừng khung và sao chép các điểm được lọc trực tiếp vào bộ đệm được ánh xạ.
    • Sử dụng GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BITcho accesstham số để glMapBufferRange; điều này sẽ cho phép trình điều khiển GL thực hiện bộ đệm đôi dưới mui xe để truyền dữ liệu đến GPU một cách hiệu quả. Để biết thêm thông tin về những gì đang diễn ra ở đây, hãy xem Buffer Object Streaming .
  3. Sau đó hủy ánh xạ bộ đệm và đưa ra các lệnh vẽ, sử dụng trình tạo bóng đỉnh để biến đổi các điểm thành không gian màn hình như bình thường.
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.