Я работаю над переносом существующего редактора tilemap на основе XNA/WinForms в WPF. Я довольно новичок в WPF, но большинство концепций не так сложно понять. У меня есть Boxbox, встроенный в ScrollViewer, с использованием метода DrawImage из DrawingContext, предоставленного методом OnRender (Viewbox) для рисования карты. Проблема в том, что я не могу достичь почти той же производительности, что и с версией XNA/WinForm, когда на экране отображается довольно большое количество фрагментов (> 1000 на моей машине). Я реализовал масштабирование и панорамирование, но когда я уменьшаю масштаб слишком далеко или панорамирую, когда на экране появляется большое количество фрагментов, происходит значительное отставание, которое разрушает пользовательский интерфейс. Я предпринял несколько очевидных мер оптимизации (замораживание исходного растрового изображения, отбраковка фрагментов, которые невозможно увидеть, установка режима масштабирования растровых изображений на LowQuality, предоставление подсказки кэширования кэша), но они, похоже, не устраняют проблему. Проблема, очевидно, в том, как WPF обрабатывает рисование текстурированных квадрациклов с помощью DrawingContext.WPF Slow Tilemap Rendering Performance
Я предоставил пример приложение со всем кодом, необходимого для воспроизведения проблемы: SampleGridDrawingExample
Удерживайте среднюю кнопку мыши и переместите мышь к лотку. Он становится все более заметным по мере увеличения размера окна (очевидно, потому что больше фрагментов визуализируется).
Есть ли более быстрый метод, чем DrawingContext в WPF для рисования больших объемов текстурированных квадрациклов с разумной производительностью ?. Используя XNA/WinForms, я могу нарисовать ~ 50000 фрагментов в нескольких слоях с разумным запаздыванием, тогда как в WPF, используя мой текущий подход, который превышает 1000, вызывает заметное отставание (> 10000 приводит приложение к обходу).
Расчет во время перемещения мыши - это просто вычислить дельту мыши и прокрутить карту на ее основе. Я бы подумал, что это не проблема (но, очевидно, она часто вычисляет это при перемещении мыши, поэтому я понимаю прыжок в CPU). Старый редактор использует XNA для преобразования загруженных растровых изображений в Texture2Ds и для рендеринга (используя SpriteBatch). Цикл, который рисует карту, такой же, как в образце. Таким образом, по сути, GPU обрабатывает его, но есть некоторый процессор, участвующий в вычислении видимой области для отбраковки и реагирования на вход для масштабирования/панорамирования. – batchprogram
Предполагая, что WPF использует аппаратное ускорение в моем примере, единственное отличие, которое я знаю в рендеринге между ним и моим старым редактором, состоит в том, что у моего старого редактора есть цикл, который связан с событием Idle приложения, которое перерисовывает карту со скоростью 60Гц. – batchprogram