@virty90
20 лет, программист C#

Как отрисовать большое кол-во точек с помощью WPF 3D?

Меня интересует 3 вопроса.
1)Как отрисовать наибольшее кол-во объектов с наименьшими затратами по памяти и наибольшим FPS?
2)Как оптимизировать графическую сцену так что бы wpf "не думал" о тех объектах, которых не видно (перекрыты другими объектами)?
3) Куда уходит оперативная память?

Мои мысли по каждому из пунктов

1)В принципе я добился неплохого результата. У меня рендерится в реальном времени без сильного просидания по фпс, когда камеру перемещаю мышью 10 000 кубов. Куб - 8 точек -12 треугольников. Каждый куб это новый GeometryModel3D, который помещается в Model3DGroup. Это самый эффективный способ отрисовки?

2)Перед камерой находится объект, который закрывает остальные 10 000 * 12 треугольников. По идее я вижу только один этот объект, но камера перемещается с заметными подтормаживаниями. Как избежать этого? Ведь если объекты находятся вне угла обзора камеры, ничего не подтормажевает.

3)У меня во Viewport3d всего находится 10 000 кубов. Куб = 8 точек + 12 int (индексы треугольников) = 8*3(координаты)*8(байт double)+12*4 = 240 байт. У всех у них один общий цвет. Т.е. ссылка на один объект Brush 4 байта. Получается что бы описать один куб требуется 244 байта. 244б*10 000 = 2.3 мб. Но в диспетчере задач программа сжирает целых 110 000 мб. Почему так?
  • Вопрос задан
  • 385 просмотров
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C#
1) вы так легко считаете память, выделяемую под ваши кубы). Я думаю это весьма далеко от истины, т.к. лично я даже предположить не смогу, что конкретно происходит при создании дотнетовского объекта и сколько конкретно он потребует памяти;

2) вы используете инструмент не по назначению. WPF - это для относительно малого числа граф. объектов (десятки, сотни) с высоким уровнем интерактивности для каждого из них. Иными словами - для интерфейсов. В интерфейсах есть небольшое количество высокоинтерактивных объектов - кнопок, скроллов, комбобоксов, и именно для таких сценариев WPF и оптимизирован. Вам с 10К кубами уже давно пора брать Direct3D и не мучаться. Это я вам не с потолка говорю, мы тоже когда-то пытались использовать WPF-шную двухмерную графику для двухмерной отрисовки, но быстро поняли, что его инфраструктура слишком тяжелая для нашей задачи. Вы замучаетесь в попытках это все оптимизировать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AxisPod
@AxisPod
Ну WPF рендер явно не умеет отсеивать невидимые объекты. Если хочется, делайте нативное окно и сами занимайтесь рендерингом и отсевом невидимых объектов. Да и я так понимаю, что в вашем случае на каждый куб используется отдельный draw call, так это ни одна видяха не протянет с порядочной скоростью.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы