WPF Poor Performace для статических сцен с очень маленьким динамическим контентом - PullRequest
0 голосов
/ 25 августа 2010

У меня есть простая сцена с 64 элементами ModelUIElement3D, каждый element3d Модель представляет собой группу моделей с 8 простыми геометриями, каждая геометрия содержит 3 материала, рассеянный, зеркальный и излучающий.

Все материалы используют сплошные кисти, так каксамые быстрые.

Геометрия, зеркальный материал и рассеянный материал замораживаются для повышения производительности.

Единственное, что не замораживается, это излучающие материалы, которые я буду периодически обновлять кистью с твердыми кистями..

Когда я запускаю приложение и меняю кисть только для одного эмиссионного материала из 1536 материалов на экране (64 * 8 * 3), производительность очень сильно падает, а FPS падает с 60до 15 кадров в секунду.

Даже у меня есть сплошные кисти в словаре, поэтому они кэшируются и создаются один раз.

Это изменение в кисти заставляет материал «мигать» (на самом деле этобыстрое исчезновение / исчезновение) на экране.Смена щетки в излучающем материале происходит каждые 20 мс.

Я вижу, что смена щетки для одного материала или 500 материалов не влияет на производительность.

Я комментирую строку, где я обновляю кисть, и получаю постоянные 60FPS, когда я раскомментирую строку, FPS понижается до +/- 15FPS, пробовал 3 разных машины, 4 ядра / 2 ядра, очень хорошографические карты или средние, почти не имеют значения, всегда между 15-25 FPS.

Я использую «Инструмент профилирования производительности для Windows Presentation Foundation» для измерения производительности, а HW IRT на кадр не делает.не идти выше 1 в любой момент.Когда я устанавливаю флажок «Обновление грязной области», я вижу, что вся сцена визуализируется каждые 20 мс, просто меняя кисть для одного небольшого материала.

Я читал, что WPF viewport3d не поддерживает грязную область, поэтому яЯ предполагаю, что вся сцена визуализируется с минимальными изменениями.

Если это так, могу ли я что-то сделать, чтобы улучшить это?Так как мне нужно создать статическую сцену с несколькими тысячами элементов UIE и 10 тысячами материалов, но изменения будут настолько минимальными, что я ожидал хорошей производительности.

Если сцена WHOLE воспроизводится каждый раз без возможности что-либо сделать, тогда бесполезно думать о WPF для создания динамического контента, и мне нужно перейти к другому, более сложному подходу, как DirectX.

Пожалуйста, подскажите любой намек, как сделать эту работу, потому что я не могу поверить, что это невозможно с WPF, и это какая-то ошибка с моей стороны.

В основном мне нужна большая сцена с минимальными изменениями, эти изменения происходятчасто в диапазоне от 5 до 20 мс и все еще получают 60FPS, так как есть немного материала треугольников, которые действительно меняются.

Спасибо,

Густаво.

1 Ответ

0 голосов
/ 26 февраля 2011

Я не могу дать прямого решения вашего вопроса.Но вот некоторая подсказка:

1536 материалов кажется слишком большим для простой бизнес-ориентированной графики WPF 3D.Даже необходимо тщательно оптимизировать, если вы используете низкоуровневый API, такой как Direct3D, потому что в архитектуре графического драйвера он попадет в узкое место, особенно для интерфейса драйвера уровня DirectX 9.

Для достижения наилучшегопроизводительность, единственное решение - оптимизировать от случая к случаю с помощью низкоуровневого графического API с учетом специфики графического оборудования.Но для высокоуровневого 3D API общего назначения оптимизировать его для каждого случая просто нереально.Это предполагает некоторые предположения, например, обычное использование должно заключаться в навигации по статической сцене.Так что он может оптимизировать и кэшировать оптимизированную очередь команд для достижения максимальной производительности.Но если сцена будет изменена, кеш станет недействительным и, следовательно, потребуется перестроить и повторно оптимизировать.Таким образом, не размер области просмотра вызвал падение FPS, а оптимизацию.

Обычно, есть механизм хинтинга, с помощью которого вы сообщаете ему, какой граф вспомогательной сцены изменяется, а какой статический, так чтопомочь основной оптимизации.Но это только намек.Есть много случаев, которые делают нецелесообразным соблюдать подсказку.И трудно сказать причину, потому что внутренние органы инкапсулированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...