Управление памятью с помощью WPF Canvas — большое количество (идентичных) объектов

#wpf #canvas #memory-management #f#

#wpf #холст #управление памятью #f#

Вопрос:

Вопрос: Может ли WPF Canvas отображать один и тот же дочерний элемент или объект в нескольких разных местах или каждый дочерний элемент / объект должен быть уникальным?

У меня есть холст WPF, на который я рисую большое количество объектов. Большинство из них представляют собой изображения, многие из которых идентичны, и, насколько я знаю, каждое из них должно быть уникально создано, поскольку холст, по-видимому, не может рисовать (или, скорее Children.Add() , ) идентичное изображение в нескольких разных местах (если только нет способа сделать это — что было бы предпочтительнее). Я вынужден System.GC.Collect() несколько раз выполнять руководство после того, как все объекты нарисованы, чтобы уменьшить объем памяти до разумного размера (по крайней мере, для проекта WPF).Объем памяти увеличивается примерно с 80 МБ перед рисованием изображений до примерно 225 МБ сразу после этого и не уменьшается до System.GC.Collect() тех пор, пока не будет запущен несколько раз, снова возвращаясь к ~ 80 МБ.

Я также делаю это программно в F #, и поэтому я не использую какой-либо простой XAML, если это имеет какое-либо значение.

Комментарии:

1. Как вы уже заметили, дочерние элементы, добавляемые в холст, должны быть уникальными UIElements. Кроме того, в вашем вопросе недостаточно информации, чтобы добавить дополнительные рекомендации. Если, например, «идентичные изображения», которые рисуются в «разных местах», образуют сетку, вы, возможно, можете поместить наиболее часто используемое изображение в ImageBrush с соответствующим tileMode.

2. Вероятно, вы просто хотите выполнить свой собственный рендеринг, чтобы избежать создания всего этого объекта. Проверьте, например, wpf.2000things.com/2011/03/05 /.