WPF против XNA для рендеринга тысяч спрайтов

Мне нужно отобразить тысячи эллипсов, связанных друг с другом линиями. Как лучше всего (с точки зрения производительности) отобразить его внутри приложения WPF. Является ли рисование WPF Canvas намного хуже, чем рисование XNA?

На самом деле, скрытый вопрос: возможно ли выполнить рендеринг xna внутри хоста WPF? Я видел несколько примеров, в которых использовалось наложение окна xna без полей, но не было собственного решения...

Спасибо, Орельен.


person Aurelien Ribon    schedule 03.05.2010    source источник


Ответы (4)


Если все сделано правильно, вы можете получить довольно высокую производительность при рендеринге WPF, которая имеет то преимущество, что вам не нужно терпеть боль взаимодействия WPF-XNA. Вы можете визуализировать (и анимировать) очень большое количество визуальных элементов, если используете низкоуровневые API-интерфейсы рендеринга WPF, такие как CompositionTarget.Rendering и Контекст рисования. Вы также можете воспользоваться новым Функция кэширования композиции в .net 4.0. Есть еще много всего, просто возьмите это за отправную точку.

person bitbonk    schedule 03.05.2010
comment
Я думаю, что пойду по этому пути, но мне нужно некоторое интерактивное взаимодействие с каждым эллипсом, и они отображаются в ScrollViewer. На самом деле, в настоящее время я использую элемент управления для рендеринга эллипса и другой элемент управления для рендеринга линии. Это только для прототипа, а производительность с более чем сотней эллипсов ужасна. Спасибо. Думаю, я пойду с DrawingVisuals... - person Aurelien Ribon; 04.05.2010
comment
DrawingVisuals намного быстрее, чем элементы управления, производные от Shape (линия, эллипс), но для динамического содержимого предложение DrawingContext от bitbonk может быть еще быстрее. - person Ray Burns; 13.05.2010

Я успешно «интегрировал» XNA с WPF, сначала отрендерив сцену XNA в элемент управления WinForms, а затем разместив этот элемент управления в WPF с помощью элемент WindowsFormsHost.

person Peter Lillevold    schedule 03.05.2010
comment
Я хотел это сделать, но слышал, что перфомансы задавливаются в хосте winform. Думаю, это только слухи, мне нужно проверить это предположение. - person Aurelien Ribon; 04.05.2010
comment
Да, это предположение нужно проверить :) Я запускаю сцену из 60k+ треугольников с приемлемой производительностью. Я использую BasicEffect с одним источником света и включенным туманом, текстуры еще не пробовал. Но я предполагаю, что дополнительные накладные расходы на передачу его через WinForms должны быть постоянными независимо от того, что происходит на стороне XNA. - person Peter Lillevold; 04.05.2010
comment
На самом деле накладные расходы на рендеринг через WinForms равны нулю (по сравнению с оверлейным окном). Под капотом как метод WinForms, так и окно наложения дают Direct3D прямоугольную область экрана, с которой можно владеть и играть. Изменение размера и перемещение вашего окна будет технически медленнее, но на практике незаметно. - person Ray Burns; 13.05.2010
comment
Есть способ сделать то же самое с немного меньшими затратами и без зависимости от WinForms, используя HwndHost напрямую, чтобы получить HWND для XNA, но если вы уже написали код решения WinForms, нет причин отказываться от него сейчас. - person Ray Burns; 13.05.2010
comment
@Ray Burns: хороший вклад. HwndHost требует разрешений для неуправляемого кода, но на это стоит обратить внимание. - person Peter Lillevold; 13.05.2010

Я только что нашел эту статью на CodeProject:

Мы хотим интегрировать нашу сцену XNA в пользовательский интерфейс WPF так же, как мы интегрируем холст или любой виджет. Но лучший способ просмотреть 3D-сцену в XNA — включить ее в окно. Невозможно получить дескриптор любого элемента управления WPF, как это можно сделать с помощью WinForm. Хитрость заключается в том, чтобы переписать часть среды XNA, вращающуюся вокруг класса Game. Цель состоит в том, чтобы наследовать новый класс Game от Panel (в нашем случае Canvas), чтобы иметь возможность включать его в визуальное дерево WPF. Визуальными границами панели будет область просмотра сцены XNA. Тем не менее, мы только что сказали, что невозможно получить дескриптор визуального элемента управления, который не наследуется от Window. Как тогда отображать 3D с помощью XNA? Мы просто отобразим окно без рамки прямо над панелью. Это окно всегда будет сверху, когда приложение находится в фокусе, а панель видна, и в этом случае будет скрыто. Точно так же, когда панель не видна, мы остановим активность игры.

эта тема на На форумах Microsoft есть обсуждение по этому поводу, и один плакат заявляет:

Затем можно сделать вывод, что у вас может быть рендеринг XNA в форму WPF без проблем, но вы должны избегать использования классов Game и GraphicsDeviceManager, поскольку последний требует запуска экземпляра Game (конструктор определяется как новый GraphicsDeviceManager(Game game)) и класс Game не предоставляет никакого способа определить окно, в котором он отображается.

Так что похоже, что это возможно, но требует некоторой работы над частью уравнения XNA.

person ChrisF    schedule 03.05.2010

Однако имейте в виду, что приложения XNA не будут работать в системах без по крайней мере 1.1 шейдерного графического процессора.

person SiN    schedule 12.05.2010