Тому я займаюся розробкою DirectX, використовуючи SharpDX під .NET для точності (але рішення API API DirectX / C ++ застосовні). Я шукаю найшвидший спосіб візуалізації ліній в ортогональній проекції (наприклад, моделювання двовимірного малювання рядків для наукових програм) за допомогою DirectX.
Скріншот видів сюжетів, які я намагаюся зробити:
Не рідкість у таких різновидів сюжетів є лінії з мільйонами сегментів, різної товщини, з антиліазінговою лінією або без неї (або ввімкнення / вимкнення повного екрану AA). Мені потрібно дуже часто оновлювати вершини для рядків (наприклад, 20 разів на секунду) і максимально завантажувати GPU.
Поки я намагався:
- Візуалізація програмного забезпечення, наприклад, GDI + насправді не є поганою продуктивністю, але, очевидно, є важкою для процесора
- Direct2D API - повільніше, ніж GDI, особливо з включеним Antialiasing
- Direct3D10 використовує цей метод для емуляції AA за допомогою вершинних кольорів та тесселяції на стороні процесора. Також повільно (я профілював це і 80% часу витрачається на обчислення вершинних позицій)
Для третього методу я використовую Vertex Buffers для надсилання трикутної смужки до GPU та оновлення кожні 200 м новими вершинами. Я отримую частоту оновлення в межах 5 FPS на 100 000 лінійних сегментів. Мені потрібні мільйони в ідеалі!
Зараз я думаю, що найшвидшим способом було б зробити tessellation на GPU, наприклад, у Geometry Shader. Я міг би надіслати вершини у вигляді списку рядків або упакувати з текстурою і розпакувати в Geometry Shader для створення квадратиків. Або просто надішліть необроблені точки на піксельний шейдер і реалізуйте малюнок Bresenham Line повністю у піксельному шейдері. Моя HLSL - іржава, шейдерна модель 2 з 2006 року, тому я не знаю про шалені речі сучасних графічних процесорів.
Отже, питання: - хтось робив це раніше, і чи є у вас якісь пропозиції спробувати? - Чи є якісь пропозиції щодо підвищення продуктивності за допомогою швидкого оновлення геометрії (наприклад, новий список вершин кожні 20 мс)?
ОНОВЛЕННЯ 21 січня
З тих пір я реалізував метод (3) вище, використовуючи шейдери геометрії, використовуючи буфери LineStrip та Dynamic Vertex. Тепер я отримую 100 FPS у 100k балів та 10FPS у 1000000 балів. Це величезне вдосконалення, але тепер я заповнена та обчислена обмежена, тому я задумалась про інші методи / ідеї.
- А як щодо апаратного монтажу геометрії лінійного сегмента?
- Що з Sprite Batch?
- Що щодо інших (Pixel shader) орієнтованих методів?
- Чи можу я ефективно працювати з графічним процесором чи процесором?
Ваші коментарі та пропозиції дуже оцінені!