Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему Canvas так долго думает 
:(
    Опции темы
ivanfain
Дата 19.3.2012, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.3.2012

Репутация: нет
Всего: нет



Я вот думал, WPF несказанно крут, DirectX и всякой такое. Но реально я хочу разместить несколько тысяч ячеек и это занимает несколько секунд. Ячейка - это просто UserControl, на Canvas. UserControl не сложный, текстовое поле TextBlock и Border. Результат должен быть на подобии листа Excel. Но вот всё это не реально долго. Как оптимизировать? Реально ли сделать отрисовку нескольких тысяч ячеек меньш секунды. Excel ведь это умеет, да и не на WPF он написан.
Спасибо.
PM MAIL   Вверх
Stas123
Дата 19.3.2012, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



Подумайте, может стоит использовать паттерн "Приспособленец"(Flyweight).
PM MAIL   Вверх
ivanfain
Дата 19.3.2012, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.3.2012

Репутация: нет
Всего: нет



А как его использовать? Каждая ячейка имеет уникальные координаты, поэтому трудно обойтись одним объектом.
PM MAIL   Вверх
exBlender
Дата 19.3.2012, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.10.2009

Репутация: 9
Всего: 9



Цитата(ivanfain @ 19.3.2012,  12:47)
А как его использовать? Каждая ячейка имеет уникальные координаты, поэтому трудно обойтись одним объектом.

А для чего каждой ячейке иметь уникальные координаты и быть посаженной на Canvas, eсли все это должно быть похожим на таблицу? Почему не использовать DataGrid или, хотя бы, просто Grid?
--------------------
HTML и CSS забыв как страшный сон, хвалу я заммэлу пою и фирме Майкрософт.
PM MAIL   Вверх
ivanfain
Дата 19.3.2012, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.3.2012

Репутация: нет
Всего: нет



Цитата(exBlender @  19.3.2012,  22:01 Найти цитируемый пост)
 Почему не использовать DataGrid или, хотя бы, просто Grid? 

Потому что это будет не стандартная таблице. Не знаю как насчёт DataGrid но через обычный Grid это сделать можно. Вы утверждаете что скорость отрисовки будет больше?
PM MAIL   Вверх
SergeyLoginov
Дата 20.3.2012, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.9.2009
Где: Иваново

Репутация: 4
Всего: 4



WPF очень медленно отрисовывает большое количество визуальных элементов. Но в Вашем случае можно использовать виртуализацию данных. В частности, существует виртуализированный Canvas, в котором рендерятся только видимые на экране элементы. В DataGrid, кстати, тоже реализована виртуализация. 
PM MAIL   Вверх
erm0l0v
Дата 21.3.2012, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 11.1.2011

Репутация: нет
Всего: 1



Используйте DataGrid. Canvas не для этого предназначен.

И как вам вообще пришла в голову мысль использовать Canvas? Элементы ведь можно по координатам размещать и в Grid.

В общем попробуйте реализовать задачу с использованием DataGrid. Это будет самый оптимальный способ. В крайнем случае через Grid.
PM MAIL   Вверх
ivanfain
Дата 21.3.2012, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.3.2012

Репутация: нет
Всего: нет



Цитата(SergeyLoginov @  20.3.2012,  16:52 Найти цитируемый пост)
 В частности, существует виртуализированный Canvas, в котором рендерятся только видимые на экране элементы.

Спасибо, но это контрол я знаю
Цитата(erm0l0v @  21.3.2012,  08:51 Найти цитируемый пост)
Используйте DataGrid. Canvas не для этого предназначен.

DataGrid не подойдёт. Мне нужны головы таблицы со всех сторон. Переделал на Grid, так как Canvas потом использовать не удобно. Но при переходе на Grid производительность ещё снизилась. Что же делать?
PM MAIL   Вверх
erm0l0v
Дата 22.3.2012, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 11.1.2011

Репутация: нет
Всего: 1



Цитата(ivanfain @ 21.3.2012,  23:47)
Мне нужны головы таблицы со всех сторон.

Я такого не делал но уверен почти на 100 процентов что это возможно сделать по средствам стилей. В WPF стилями можно изменить вообще все.

По поводу что делать поставьте профайлер памяти и вы сможете увидеть какие классы занимают больше всего места. На первый взгляд копать нужно в сторону большого количества UserControl.

Кроме того возможно неправильно настроен ScrollViewer. Возможно в приложении ошибка которую вы не ведите из-за пустого catch.

И все таки ради теста попробуйте отобразить данные в DataGrid если будет работать так же долго то проблема не в визуальном отображении. У меня таблица из 100к строк и примерно 15 столбцов строится очень быстро, меньше секунды и учетом того что данные еще тянутся из базы и некоторые поля таблицы вычисляются.
PM MAIL   Вверх
ivanfain
Дата 22.3.2012, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.3.2012

Репутация: нет
Всего: нет



Цитата(erm0l0v @  22.3.2012,  09:05 Найти цитируемый пост)
По поводу что делать поставьте профайлер памяти и вы сможете увидеть какие классы занимают больше всего места.

Дело не в памяти, а в процессорном времени
Цитата(erm0l0v @  22.3.2012,  09:05 Найти цитируемый пост)
На первый взгляд копать нужно в сторону большого количества UserControl.

Там и теряется перформанс. 

Цитата(erm0l0v @  22.3.2012,  09:05 Найти цитируемый пост)
Я такого не делал но уверен почти на 100 процентов что это возможно сделать по средствам стилей.

Если вы покажете как переопределить стиль DataGrid чтобы он выглядел так, как это показано на изображении. С возможность в добавлять и убирать головы(как сверху так и слева), а следоватьльно и менять количество ячеек, буду вам очень признателен. Если же это просто разговоры - тогда плохо.
user posted image

Это сообщение отредактировал(а) ivanfain - 22.3.2012, 09:49
PM MAIL   Вверх
erm0l0v
Дата 23.3.2012, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 11.1.2011

Репутация: нет
Всего: 1



Теперь понятно почему вы решили использовать Canvas))
Только может быть Canvas работал бы быстрее если вы не добавляли контролы а рисовали таблицу примитивами, но это конечно жестоко.

По поводу DataGrid для отображения заголовков в левой части можно использовать группировки, но правда меня разочаровала скорость работы группировки в DataGrid в WPF особенно по сравнению с Silverlight.

По поводу группировки заголовков сверху и объединенных ячеек справа я пока ничего не могу придумать((( если что нибудь придет на ум отпишусь...

Вроде есть компоненты для отображения таблиц Excel в WPF (я нашел только платные) и есть компоненты в Windows Forms вы принципе можете использовать компоненты из WF в WPF но опять же скорость работы WinFormsHost меня разочаровала.
PM MAIL   Вверх
ivanfain
Дата 23.3.2012, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.3.2012

Репутация: нет
Всего: нет



Цитата(erm0l0v @  23.3.2012,  09:34 Найти цитируемый пост)
Теперь понятно почему вы решили использовать Canvas))

Теперь перешёл на Grid, потому как Canvas не адекватно отрисовывается. Для него почему-то не работает нормально SxrolViwer. Портировать на Grid было делом 15 минут.
Меня смущает то, что я добавляю элементы в коллекцию в цикле
Код

forech(var l in list)
{
     myPanel.Children.Add(new UserControl1(){Any="Any"});
}

Может как-то нужно остановить отрисовку прежде чем начать добавлять? Но боюсь WPF это и так делает. Скорее всего он останавливает отрисовку пока не будут добавлены все элементы.
PM MAIL   Вверх
erm0l0v
Дата 23.3.2012, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 11.1.2011

Репутация: нет
Всего: 1



Сейчас для теста вывел таблицу 10000 на 5 ждал 10 секунд.

По идеи

Код

 myPanel.Visibility = System.Windows.Visibility.Collapsed; 


должна остановить отрисовку, но в моем примере это не помогло (или помогло но незначительно).
PM MAIL   Вверх
exBlender
Дата 23.3.2012, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.10.2009

Репутация: 9
Всего: 9



А зачем там вообще UserControl-ы? С такой графикой можно просто назначать Background для TextBlock-ов.

Это сообщение отредактировал(а) exBlender - 23.3.2012, 22:22
--------------------
HTML и CSS забыв как страшный сон, хвалу я заммэлу пою и фирме Майкрософт.
PM MAIL   Вверх
ivanfain
Дата 26.3.2012, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.3.2012

Репутация: нет
Всего: нет



Там логика в UserControl-ах содержится. Её конечно можно вынести отдельно, но будет ли профит? Хотя бы 10% производительности получу? Сомневаюсь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0989 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.