[WPF] использование Grid, UniormGrid больших размеров
От: s8k  
Дата: 31.10.07 13:55
Оценка:
Задача приложения такова: необходимо считать бинарный файл и отобразить его содержимое в виде таблицы битов. Каждая ячейка этой таблицы должна показывать значение бита и может иметь разный фон (всего 16 цветов). Вся таблица должна zoom'иться и scroll'иться.
Реализую следующим образом: в XAML имеется контейнер ScrollViewer и в нем динамически создаю UniformGrid (либо просто Grid). Так же динамически создаю Rectangle для каждой ячейки (благодаря чему реализую border и background для каждой ячейки). Zoom делаю с помощью ScaleTransform.

Есть 2 вопроса..

1-ый и самый главный. Если читать файл килобайт этак 20, то создается 20 тысяч объектов Rectangle. Этот процесс занимает на моем (не самом слабом компьютере) до нескольких минут. Приложение съедает примерно 350 мб оперативы. Но как только все объекты созданы, приложение отрисовывается и работает без единого тормоза, даже при скролле и зуме таблицы.
Учитывая, что у rectangle'ов может быть всего 16 цветов фона. Я думал, используя только 16 объектов, заполнить Grid, но насколько я понял это невозможно
Подскажите пожалуйста, как можно оптимизировать приложение, естественно не отказываясь от WPF?

2-ой. затрудняюсь придумать, как отображать "1" или "0" в моих ячейках-rectangle'ах?
Re: [WPF] использование Grid, UniormGrid больших размеров
От: SiAVoL Россия  
Дата: 31.10.07 15:00
Оценка:
Здравствуйте, s8k, Вы писали:

s8k>1-ый и самый главный. Если читать файл килобайт этак 20, то создается 20 тысяч объектов Rectangle. Этот процесс занимает на моем (не самом слабом компьютере) до нескольких минут. Приложение съедает примерно 350 мб оперативы. Но как только все объекты созданы, приложение отрисовывается и работает без единого тормоза, даже при скролле и зуме таблицы.

здесь видимо придется создавать свой грид, наследуясь от VirtualizingPanel.

s8k>Учитывая, что у rectangle'ов может быть всего 16 цветов фона. Я думал, используя только 16 объектов, заполнить Grid, но насколько я понял это невозможно

можно покурить в сторону статических ресурсов, но вроде контролы нельзя разделять (share). Поэтому, видимо, не получится.

s8k>Подскажите пожалуйста, как можно оптимизировать приложение, естественно не отказываясь от WPF?

остается VirtualizingPanel
... << RSDN@Home 1.2.0 alpha rev. 745>>
Re[2]: [WPF] использование Grid, UniormGrid больших размеров
От: s8k  
Дата: 31.10.07 15:55
Оценка:
Здравствуйте, SiAVoL, Вы писали:

SAV>остается VirtualizingPanel


Спасибо.
Сейчас буду читать про VirtualizingPanel. Но, если все равно придется создавать 20 тысяч объектов, то, думаю, это не лучший выход как минимум с точки зрения расхода оперативной памяти.
Re: [WPF] использование Grid, UniormGrid больших размеров
От: Igor Stepin Россия  
Дата: 06.11.07 20:59
Оценка:
Здравствуйте, s8k, Вы писали:
s8k>1-ый и самый главный. Если читать файл килобайт этак 20, то создается 20 тысяч объектов Rectangle. Этот процесс занимает на моем (не самом слабом компьютере) до нескольких минут. Приложение съедает примерно 350 мб оперативы. Но как только все объекты созданы, приложение отрисовывается и работает без единого тормоза, даже при скролле и зуме таблицы.
s8k>Учитывая, что у rectangle'ов может быть всего 16 цветов фона. Я думал, используя только 16 объектов, заполнить Grid, но насколько я понял это невозможно
s8k>Подскажите пожалуйста, как можно оптимизировать приложение, естественно не отказываясь от WPF?

s8k>2-ой. затрудняюсь придумать, как отображать "1" или "0" в моих ячейках-rectangle'ах?


Border & Background умеет Border, у него же есть свойство Child. Туда можно поместить любой UI объект или строку.
Для простоты восприятия ИМХО единицу лучше отображать как +, а 0 никак не отображать (+еще чуть-чуть скорость можно повысить на этом).

Я так понял, что все 20000 объектов видно на экране (или существенную часть). В этом случае VirtualizingPanel не поможет. Есть старый добрый метод: отнаследоваться от UIElement/FrameworkElement/Control, перекрыть OnRender и всё ручками. Правда, непонятно тогда причём здесь WPF.

Второй вариант: использовать WPF Perfomance Suite отсюда: http://wpf.netfx3.com/files/folders/developer/default.aspx . Где проявится проблема там и оптимизировать. Хотя, скорее всего придётся писать свою панель и свой контрол, но, может быть, пронесёт .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.