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-5
vàpoint.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.
- 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.
- 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ụngglMultiDrawArrays
. - 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.