Нарисовать 50 000 цветных полигонов . Silverlight
От: Аноним  
Дата: 27.05.11 17:27
Оценка: :))
Стоит задача нарисовать 50 000 цветных полигонов используя SilverLigth для Windows Mobile 7.
Задача тривиальная но занимает слишком много времени .
Как можно оптимизировать ?
Рисую Path — ами и добавляю Path — ы на Canvas.

Может есть другой подход .
Буду очень благодарен за помощь!



31.05.11 17:21: Перенесено модератором из '.NET' — TK
Re: Нарисовать 50 000 цветных полигонов . Silverlight
От: hardcase Пират http://nemerle.org
Дата: 27.05.11 18:15
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Может есть другой подход .

А>Буду очень благодарен за помощь!

Другой подход есть — нужно показывать на Canvas-е только видимые пользователем полигоны.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Нарисовать 50 000 цветных полигонов . Silverlight
От: Andy77 Ниоткуда  
Дата: 27.05.11 18:39
Оценка: 2 (1) +2 -1 :)
Здравствуйте, Аноним, Вы писали:

А>Может есть другой подход .

А>Буду очень благодарен за помощь!

WPF и Silverlight — полная Ж в плане производительности рисования кучи графических примитивов. Для достижения нормальной производительности приходится рисовать в битмэп. Используй agg-sharp или WriteableBitmapEx. Из немногочисленных приятностей получаешь возможность отрисовывать графики в отдельных потоках.

P.S. Вот прямо сейчас доделываю интерактивный график в SL, выдающий 30 fps на отрисовке 100тыс. маркеров. Блин, прямо как на 20 лет назад вернулся, рисуя прямо в видеопамять по адресу 0xA000 Куда только технологии катятся, просто китч какой-то.
Re[2]: Нарисовать 50 000 цветных полигонов . Silverlight
От: Andy77 Ниоткуда  
Дата: 27.05.11 18:41
Оценка: +1
Здравствуйте, hardcase, Вы писали:

H>Другой подход есть — нужно показывать на Canvas-е только видимые пользователем полигоны.


Напиши алгоритм для общего случая, приемлемо работающий на 50тысячах полигонов.
Re[2]: Нарисовать 50 000 цветных полигонов . Silverlight
От: Holms США  
Дата: 27.05.11 19:37
Оценка:
Здравствуйте, Andy77, Вы писали:

A>P.S. Вот прямо сейчас доделываю интерактивный график в SL, выдающий 30 fps на отрисовке 100тыс. маркеров. Блин, прямо как на 20 лет назад вернулся, рисуя прямо в видеопамять по адресу 0xA000 Куда только технологии катятся, просто китч какой-то.

не подскажешь что используешь и каким образом?
Я пробовал WriteableBitmapEx но там много фич не хватает в том числе и анти-алиасинга.
пробовал agg-sharp но так и не удалось нарисовать что-то приемленное.
... << RSDN@Home 1.2.0 alpha 5 rev. 1523>>
The life is relative and reversible.
Re[3]: Нарисовать 50 000 цветных полигонов . Silverlight
От: Andy77 Ниоткуда  
Дата: 27.05.11 19:49
Оценка:
Здравствуйте, Holms, Вы писали:

H>Я пробовал WriteableBitmapEx но там много фич не хватает в том числе и анти-алиасинга.

H>пробовал agg-sharp но так и не удалось нарисовать что-то приемленное.

Почему не получилось?

Пользуюсь смесью из agg-sharp и WriteableBitmapEx, но на самом деле достаточно agg-sharp, только ему надо бы еще прикрутить более высокоуровневый API наподобие GDI+.
Re[2]: Нарисовать 50 000 цветных полигонов . Silverlight
От: drol  
Дата: 27.05.11 22:24
Оценка:
Здравствуйте, Andy77, Вы писали:

A>P.S. Вот прямо сейчас доделываю интерактивный график в SL, выдающий 30 fps на отрисовке 100тыс. маркеров.


А зачем 100 тыс. У среднего монитора горизонтальное разрешение даже не 1920. Просто усреднить функцию никак ? Обязательно все 100К рисовать ? Или у Вас какой-то точечный график в стиле "насыпали песка" ?
Re[3]: Нарисовать 50 000 цветных полигонов . Silverlight
От: Andy77 Ниоткуда  
Дата: 28.05.11 00:23
Оценка:
Здравствуйте, drol, Вы писали:

D>А зачем 100 тыс. У среднего монитора горизонтальное разрешение даже не 1920. Просто усреднить функцию никак ? Обязательно все 100К рисовать ? Или у Вас какой-то точечный график в стиле "насыпали песка" ?


Просто задачи у нас отличаются от "нарисовать бар сумм продаж товара с разбивкой по странам"

Если коротко, то никакой функции нет, например, в exploratory data analysis все наоборот — ученые пытаются найти скрытые зависимости в данных, глядя на графики. Не рисовать все маркеры или же принять тормоза отрисовки WPF/SL — это как "оптимизировать" Quake, сделав только перпендикулярные стены и разрашить менять угол обзора только на 90 градусов.

Да, в случае скаттер плота ("насыпали песка") обязательно рисовать все маркеры. Даже если бы существовал быстрый алгоритм, позволяющий определить невидимые (а маркеры бывают произвольных форм, так что это точно невозможно), то все равно надо отрисовывать все — "плотность" точек отлично выражается цветом. Бывает, рисуют и миллионы. К тому же мы хотим, чтобы зуминг/паннинг при этом происходил интерактивно. Кроме скаттер плота, есть и другие графики, плохо поддающиеся агрегации или же содержащие много примитивов даже после агрегации. Или же, например, захочется нарисовать на графике пару тысяч молекул, каждая из которых представляется на экране парой сотен (обязательно anti-aliased) примитивов. Да мало ли чего, я могу еще долго продолжать, поверь, мы на этом собаку съели
Re[4]: Нарисовать 50 000 цветных полигонов . Silverlight
От: drol  
Дата: 28.05.11 00:52
Оценка:
Здравствуйте, Andy77, Вы писали:

A>Если коротко, то никакой функции нет, например, в exploratory data analysis все наоборот — ученые пытаются найти скрытые зависимости в данных, глядя на графики.


Функция есть всегда, и далеко не одна. Для обычного графика множество маркеров шарящих один столбец можно изображать толщиной штриха, цветом и т.д.

A>Да, в случае скаттер плота ("насыпали песка") обязательно рисовать все маркеры.


Это понятно. Но правильная схема оного дела уже есть задача совершенно другого уровня. Явно не область базового API Silverlight'а. Вы бы ещё повозмущались, что там нет библиотеки быстрой планаризации графов из 100К вершин, например А то вот мне надо

A>Или же, например, захочется нарисовать на графике пару тысяч молекул,


Аналогично. Это тоже специализированное навороченное ПО должно быть. Очень специфичное.
Re[5]: Нарисовать 50 000 цветных полигонов . Silverlight
От: Andy77 Ниоткуда  
Дата: 28.05.11 01:49
Оценка:
Здравствуйте, drol, Вы писали:

A>>Если коротко, то никакой функции нет, например, в exploratory data analysis все наоборот — ученые пытаются найти скрытые зависимости в данных, глядя на графики.


D>Функция есть всегда, и далеко не одна. Для обычного графика множество маркеров шарящих один столбец можно изображать толщиной штриха, цветом и т.д.


Без комментариев Ну конечно, функция есть, и не одна (доказательство: y = 2*x и у=3*x), но как это связано с обсуждаемым вопросом?

A>>Да, в случае скаттер плота ("насыпали песка") обязательно рисовать все маркеры.


D>Это понятно. Но правильная схема оного дела уже есть задача совершенно другого уровня. Явно не область базового API Silverlight'а. Вы бы ещё повозмущались, что там нет библиотеки быстрой планаризации графов из 100К вершин, например А то вот мне надо


Какая еще нафиг "правильная схема оного дела"? Возможность рисования примитивов — неужели я слишком многого прошу от одного из самых продвинутых GUI фреймворков? Это можно было делать эффективно на древнем железе 20-летней давности, а тут на тебе, прогресс пришел, рисовать ничего нельзя, но можно показывать стриминг видео на грани вращающегося куба — всем кричать "вау"! Ну хорошо хоть, WriteableBitmap в третьей версии появился, спасибо партии за это. Давай вообще выкинем из винды DirectX, DirectDraw etc. и скажем "вам не нужно ничего быстро рисовать, это же специализированное ПО, которое должно выполняться на специализированном железе под специализированной ОС". Тоже мне, сделали фреймворк для клепания морд к БД, ничего странного, что он не приживается. На стандартные charting libraries вообще без слез смотреть нельзя... Простите, накипело

A>>Или же, например, захочется нарисовать на графике пару тысяч молекул,


D>Аналогично. Это тоже специализированное навороченное ПО должно быть. Очень специфичное.


Ну вот мы такое ПО и пишем, что дальше?
Re[6]: Нарисовать 50 000 цветных полигонов . Silverlight
От: drol  
Дата: 28.05.11 02:18
Оценка: +1
Здравствуйте, Andy77, Вы писали:

A>Без комментариев Ну конечно, функция есть, и не одна (доказательство: y = 2*x и у=3*x), но как это связано с обсуждаемым вопросом?


Я же выше показал — не нужно будет 100К рисовать.

A>Какая еще нафиг "правильная схема оного дела"?


Ну вот такая. Или Вы хотите сказать, что сможете за день планаризатор мегаграфов сделать ?

A>Возможность рисования примитивов — неужели я слишком многого прошу от одного из самых продвинутых GUI фреймворков?


Вы не этого хотите. Вы хотите 100К примитивов. А он не для этого предназначен. Особенно в случае топикстартера — на Windows Phone 7

A>Ну хорошо хоть, WriteableBitmap в третьей версии появился, спасибо партии за это.


Ну вот видите...

A>Давай вообще выкинем из винды DirectX, DirectDraw etc.


Наоборот. Их не надо выкидывать. Их надо дотачивать, осовременивая API и удаляя атавизмы каменного века. И не нужно реализовывать мегавизуализацию прямо и целиком на WPF — он не для этого. Для уберграфики в WPF есть интеграция с Direct3D. Делайте на Direct3D, или каком-нибудь специализированном middleware поверх него. И все счастливы...

А от Silverlight'а Вы слишком многого хотите. Хотя возможно со временем он и дорастёт...

A>Тоже мне, сделали фреймворк для клепания морд к БД, ничего странного, что он не приживается.


Да нормально он приживается. У нас от клиентов отбоя нет...

A> На стандартные charting libraries вообще без слез смотреть нельзя...


Гы! Да и большинство нестандартных тоже знатное убожество, даже нативные для обычных Windows.

A>Ну вот мы такое ПО и пишем, что дальше?


Ну так странный выбор платформы у вас для прямой визуализации-то.
Re[7]: Нарисовать 50 000 цветных полигонов . Silverlight
От: Andy77 Ниоткуда  
Дата: 28.05.11 03:00
Оценка: 1 (1) +2
То есть, ты хочешь сказать, что отсутствие нормальной 2D-графики — это нормально? Ни у кого нет необходимости рисовать много 2D примитивов (а если им кажется, что им это нужно, то они ошибаются) только потому, что в силверлайте нет поддержки этого?

Ну ладно, похоже мы пошли по кругу, не буду уподобляться герою комикса. Спасибо за дискуссию!
Re[3]: Нарисовать 50 000 цветных полигонов . Silverlight
От: hardcase Пират http://nemerle.org
Дата: 28.05.11 06:45
Оценка:
Здравствуйте, Andy77, Вы писали:

A>Здравствуйте, hardcase, Вы писали:


H>>Другой подход есть — нужно показывать на Canvas-е только видимые пользователем полигоны.


A>Напиши алгоритм для общего случая, приемлемо работающий на 50тысячах полигонов.


Хм, а нельзя для начала количество Path-ов уменьшить, объединив в него несколько примитивов?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Нарисовать 50 000 цветных полигонов . Silverlight
От: Andy77 Ниоткуда  
Дата: 28.05.11 15:22
Оценка: +1 -1
Здравствуйте, hardcase, Вы писали:

H>Хм, а нельзя для начала количество Path-ов уменьшить, объединив в него несколько примитивов?


В общем случае нельзя, у них разный цвет. К тому же, при зуме абсолютные размеры маркеров должны сохраняться.
Re[4]: Нарисовать 50 000 цветных полигонов . Silverlight
От: Holms США  
Дата: 28.05.11 20:03
Оценка:
Здравствуйте, Andy77, Вы писали:

A>Пользуюсь смесью из agg-sharp и WriteableBitmapEx, но на самом деле достаточно agg-sharp, только ему надо бы еще прикрутить более высокоуровневый API наподобие GDI+.

не желаете поделиться примеленым agg-sharp проектом? там всё так намудренно что пока нарисуешь линию надо написать дохрена кода
... << RSDN@Home 1.2.0 alpha 5 rev. 1523>>
The life is relative and reversible.
Re: Нарисовать 50 000 цветных полигонов . Silverlight
От: DreamWeaver ОАЭ  
Дата: 31.05.11 08:00
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Стоит задача нарисовать 50 000 цветных полигонов используя SilverLigth для Windows Mobile 7.

А>Задача тривиальная но занимает слишком много времени .
А>Как можно оптимизировать ?
А>Рисую Path — ами и добавляю Path — ы на Canvas.

А>Может есть другой подход .

А>Буду очень благодарен за помощь!

Не пробовал под XNA написать? Если нужно именно на Silverlight, то можно писать под Mango (выходить осенью, но тулзы для разработки уже доступны). Там можно будет в Silverlight- проекте использовать XNA.
В сложившихся условиях ни то, ни другое не сулило ему никакой выгоды. Чего не скажешь о молчании...
Re[2]: Нарисовать 50 000 цветных полигонов . Silverlight
От: Denom Украина  
Дата: 31.05.11 08:22
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Другой подход есть — нужно показывать на Canvas-е только видимые пользователем полигоны.


Верно, нужно делать свой контрол (аля Canval, Grid, StackPanel, VirtualStackPanel и т.д)
наследник от Panel, перекрывать ArrageOverride, MeasureOverride..

Причем поведениен должно быть аналогично VirtualStackPanel создаём визуальные элементы только
для того что видно + pooling(recicling) визуальных элементов...

Вот статья на похожую тему для WPF тут

Можно было-ы перекрыть OnRender и рисовать самому на DrawingContext, но в Sl 3 его небыло, как в SL 4 — не знаю
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[5]: Нарисовать 50 000 цветных полигонов . Silverlight
От: Andy77 Ниоткуда  
Дата: 31.05.11 18:31
Оценка:
Здравствуйте, Holms, Вы писали:

H>не желаете поделиться примеленым agg-sharp проектом? там всё так намудренно что пока нарисуешь линию надо написать дохрена кода


Да, надо бы, по-хорошему, объединиться с автором и выставить наружу GDI-like API... как только сделаю это, поделюсь с общественностью.
Re: Нарисовать 50 000 цветных полигонов . Silverlight
От: MxMsk Португалия  
Дата: 31.05.11 22:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Может есть другой подход .

А>Буду очень благодарен за помощь!
Там нет DrawingContext, поэтому пространства для оптимизации, насколько я понимаю, почти нет. Боюсь, на RSDN маловато знатоков Silverlight-а, а тем более его версии под Windows Phone 7. Я бы посоветовал спросить на Stack Overflow.
Re[8]: Нарисовать 50 000 цветных полигонов . Silverlight
От: aloch Россия  
Дата: 06.06.11 07:39
Оценка: 12 (1)
Здравствуйте, Andy77, Вы писали:

> То есть, ты хочешь сказать, что отсутствие нормальной 2D-графики — это нормально?


Вот, например, в Direct3d и OpenGL есть поддержка 3D графики. При чем, по общепринятым критериям, она "нормальная". Но вот в игрушке возникает необходимость нарисовать много полигонов — т.е. сделать открытое пространство. И тут выясняется, что это "нормальное" API + навороченные дорогущие видеокарты просто не справляются с такой задачей — слишком много полигонов! И по этому появляеются специальные "движки", заточенные под отрисовку открытых пространсв — путем упрощения "дальних" моделей, скрытия какихнибуть гор на горизонте и т.п.

То-же и с 2D API — если нужно рисовать много примитивов, то нужно писать оптимилаторы отображаемого на экране (прорй — весьма сложные), т.к. ни один нормальный человек не будет рассмативать на экране 50000 цветных полигонов — ему нужна общая карина. Попробуй, например, сделать такой чертеж в AutoCAD и посмотри, что он нарисует на экране.


Re[9]: Нарисовать 50 000 цветных полигонов . Silverlight
От: MxMsk Португалия  
Дата: 06.06.11 09:07
Оценка:
Здравствуйте, aloch, Вы писали:

A>Вот, например, в Direct3d и OpenGL есть поддержка 3D графики. При чем, по общепринятым критериям, она "нормальная". Но вот в игрушке возникает необходимость нарисовать много полигонов — т.е. сделать открытое пространство. И тут выясняется, что это "нормальное" API + навороченные дорогущие видеокарты просто не справляются с такой задачей — слишком много полигонов! И по этому появляеются специальные "движки", заточенные под отрисовку открытых пространсв — путем упрощения "дальних" моделей, скрытия какихнибуть гор на горизонте и т.п.

Угу. А я добавлю, что такие вещи, как ComboBox не является частью GDI, они только используют его для отрисовки. Следуя этой же логике, WPF — это уровень ComboBox-ов, который использует DirectX для отрисовки. Так что, ничего удивительного в отсутствии "быстрой" 2D графики. Возможно MS стоит сделать аналог Canvas-а из HTML5 для каких-то критических ситуаций, но для этого, как я понимаю, уже придумали хосты DirectX. Впрочем, сейчас мне это уже не нужно, мы добились нужной скорости в своем проекте. Пришлось попотеть, но результат радует.
Re[9]: Нарисовать 50 000 цветных полигонов . Silverlight
От: Andy77 Ниоткуда  
Дата: 07.06.11 01:54
Оценка:
Здравствуйте, aloch, Вы писали:

Приведенная аналогия страдает тем, что отличие 2D от 3D в том, что миллионы полигонов можно на современном железе быстро нарисовать даже без использования аппаратного ускорения. В случае 3D движки игрушек решают реальную проблему; Силверлайт же говорит "нет, ребята, вам этого не надо". Как показывает практика — иногда надо. Спорить по этому поводу я не собираюсь, если твоих пользователей (ты решаешь похожие задачи?) устраивает медленная графика, не показывающая всех элементов, значит, у нас просто разные категории пользователей, тебе повезло.
Re[10]: Нарисовать 50 000 цветных полигонов . Silverlight
От: Аноним  
Дата: 07.06.11 04:43
Оценка:
Здравствуйте, Andy77, Вы писали:

A>Здравствуйте, aloch, Вы писали:


A>Приведенная аналогия страдает тем, что отличие 2D от 3D в том, что миллионы полигонов можно на современном железе быстро нарисовать даже без использования аппаратного ускорения.


К сожалению это не так — иначе такого понятия, как "поддержка открытых пространств" не было бы в принципе в 3Д движках "за ненадобностью" — вали все полигоны в кучу, оно их все быстро нарисует. В качестве примера стоит попробовать в Доом3 (например) войти в режим "ноклип" и посмотреть на весь уровень со стороны — тормоза гарантированы.

Возможно разговор там идет не о миллионах, а о сотнях миллионов полигонов, но предел производительности есть везде.

Безусловно, жаль, что у WPF/Silverlight этот предел достаточно низкий (я это и сам ощущаю, мне, например, пришлось написать рисование сложных DWFx — чертежей в отдельном потоке (через RenderTargetBitmap) для того чтобы тормоза-подвисания не чустовоались пользователем в GUI-потоке).

Но, с другой стороны, я давно понял, что "за бесплатно" получить от кого-то эффективное решение сложной, неординарной задачи, практически не возможно. Вот, например, пусть силверлайт прекрано справится с 50000 полигонов, а потом возникнет задача нарисовать 50000000 полигонов. В решеение (программное или аппаратное), решающее "в лоб" такую задачу я не верю. И вот здесь придется "попотеть" программисту, если он хочет получить приличный результат (именно за счет оптимизации того, что рисуем). Программисты Автокад-а "попотели" над этим 20 лет тому назад, и я в 1990 году под ДОС в Автокад 10 на 286 машине (33 мегагерца) с 1 мегабайтом памяти (!), работал с чертежами, которые тормозят на современной машине в WPF!


> В случае 3D движки игрушек решают реальную проблему; Силверлайт же говорит "нет, ребята, вам этого не надо".


Нет, Сильверлайт говорит — "если вам это надо,то сделать это можно, нужно толкьо поработать самим, т.к. я не для того сделан!"
Re[10]: Нарисовать 50 000 цветных полигонов . Silverlight
От: yoriсk.kiev.ua  
Дата: 07.06.11 10:24
Оценка:
Здравствуйте, Andy77, Вы писали:

A>Приведенная аналогия страдает тем, что отличие 2D от 3D в том, что миллионы полигонов можно на современном железе быстро нарисовать даже без использования аппаратного ускорения.


Да там не только количество полигонов исскуственно уменьшают. Подклыдвают текстуры худшего качества и много другое.

A>Спорить по этому поводу я не собираюсь, если твоих пользователей (ты решаешь похожие задачи?) устраивает медленная графика, не показывающая всех элементов, значит, у нас просто разные категории пользователей, тебе повезло.


Осталось только изобрести пользователей, которые могут одновременно увидеть, воспринять и работать с 500тыс. полигонов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.