Vì vậy, tôi đang thực hiện một số phát triển DirectX, sử dụng chính xác SharpDX trong .NET (nhưng các giải pháp API DirectX / C ++ có thể áp dụng được). Tôi đang tìm cách nhanh nhất để kết xuất các đường trong phép chiếu trực giao (ví dụ: mô phỏng vẽ đường 2D cho các ứng dụng khoa học) bằng DirectX.
Ảnh chụp màn hình các loại cốt truyện tôi đang cố gắng hiển thị như sau:
Không có gì lạ khi các loại ô này có các dòng có hàng triệu phân đoạn, có độ dày thay đổi, có hoặc không có khử răng cưa trên mỗi dòng (hoặc bật / tắt toàn màn hình AA). Tôi cần cập nhật các đỉnh cho các dòng rất thường xuyên (ví dụ 20 lần / giây) và giảm tải càng nhiều cho GPU càng tốt.
Cho đến nay tôi đã thử:
- Kết xuất phần mềm, ví dụ GDI + thực sự không có hiệu năng kém nhưng rõ ràng là nặng về CPU
- API Direct2D - chậm hơn GDI, đặc biệt là với tính năng Khử răng cưa
- Direct3D10 sử dụng phương pháp này để mô phỏng AA bằng cách sử dụng màu đỉnh và phần tử ở phía CPU. Cũng chậm (tôi đã mô tả nó và 80% thời gian dành cho việc tính toán các vị trí đỉnh)
Đối với phương pháp thứ 3, tôi đang sử dụng Bộ đệm Vertex để gửi một dải tam giác đến GPU và cập nhật cứ sau 200ms với các đỉnh mới. Tôi đang nhận được tốc độ làm mới khoảng 5FPS cho 100.000 phân khúc dòng. Tôi cần hàng triệu lý tưởng!
Bây giờ tôi đang nghĩ rằng cách nhanh nhất sẽ là thực hiện việc xử lý GPU, ví dụ như trong Shader Geometry. Tôi có thể gửi các đỉnh dưới dạng một danh sách dòng hoặc đóng gói trong một kết cấu và giải nén trong Geometry Shader để tạo các hình tứ giác. Hoặc, chỉ cần gửi các điểm thô đến trình đổ bóng pixel và thực hiện vẽ Bresenham Line hoàn toàn trong trình tạo bóng pixel. HLSL của tôi bị rỉ sét, shader model 2 từ năm 2006 vì vậy tôi không biết về những thứ điên rồ mà GPU hiện đại có thể làm được.
Vì vậy, câu hỏi là: - đã có ai làm điều này trước đây chưa, và bạn có gợi ý nào để thử không? - Bạn có bất kỳ đề xuất nào để cải thiện hiệu suất với hình học cập nhật nhanh chóng (ví dụ: danh sách đỉnh mới cứ sau 20ms) không?
CẬP NHẬT ngày 21 tháng 1
Kể từ đó, tôi đã triển khai phương thức (3) bằng cách sử dụng các trình tạo bóng Geometry bằng cách sử dụng Bộ đệm LineStrip và Dynamic Vertex. Bây giờ tôi đang nhận được 100FPS tại 100 nghìn điểm và 10FPS tại 1.000.000 điểm. Đây là một cải tiến lớn nhưng hiện tại tôi đang lấp đầy tỷ lệ và tính toán hạn chế, vì vậy tôi đã suy nghĩ về các kỹ thuật / ý tưởng khác.
- Điều gì về Instance Phần cứng của hình học Phân đoạn Đường?
- Sprite Batch thì sao?
- Còn các phương pháp định hướng (Pixel shader) khác thì sao?
- Tôi có thể loại bỏ GPU hoặc CPU một cách hiệu quả không?
Nhận xét và đề xuất của bạn đánh giá cao nhiều!