Почему WPF / RotateTransform использует так много процессора? - PullRequest
2 голосов
/ 17 июля 2009

Шаги для воспроизведения:

  1. Создание нового решения / добавление нового проекта приложения WPF.
  2. Поместите только холст в главное окно.
  3. создать события RotateTransform + PageUp / Down для увеличения угла на + -10.
  4. разместить 50 полигонов на холсте
  5. Нажмите PageUp / Down (и удерживайте нажатой)

На моем ПК загрузка процессора составляет 80%.

  1. Теперь попробуйте разместить 1000 полигонов и нажмите PageUp / Down - процессор может достичь 100% при 1-2 кадрах / с.

Я проверил RenderCapability.Tier, и он равен 2 - это означает, что он должен все визуализировать аппаратно.

Но это не работает, почему?

Ответы [ 2 ]

2 голосов
/ 22 сентября 2010

Немного больше информации было бы полезно, например, типы полигонов, которые вы используете, вашу видеокарту и какую версию WPF вы используете.

Я попробовал ваш пример, и у меня не было проблем с 500 простыми полигонами. (Core 2 Duo, 8800 GTS). Ваш пример и другие случаи, когда у вас есть довольно сложный контент, который не очень часто меняется, но вы преобразуете его, может значительно выиграть от BitmapCache .

<Canvas.CacheMode>
    <BitmapCache />
</Canvas.CacheMode>

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

1 голос
/ 17 июля 2009

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

LayoutTransform может привести к снижению производительности приложения, если вы вызовете его в сценарии, который не требует полного прохождения системой макета. Когда вы применяете LayoutTransform к коллекции Children на Panel, он запускает новый проход с помощью системы макетов и заставляет все объекты на экране повторно измерять и переупорядочивать. Если вы обновляете полный пользовательский интерфейс приложения, эта функциональность может быть именно тем, что вам нужно. Однако, если вам не нужен полный проход макета, используйте свойство RenderTransform, которое не вызывает систему макетов и, следовательно, обычно является лучшим выбором для этого сценария.

...