Здравствуйте, Dmitry_Sharp2008, Вы писали:
D_S>Путь 2. наиболее актуален для таких задач. Однако, в случае работы с большим числом данных(более 10к точек) и особенно с всякими ресайзами, скроллингами и т.д. уже одного такого направления- мало.
Наследовал свой класс от канвы, переопределяя OnRender, в нем рисовал 1000 эллипсов — все равно тормозит

Я имею в виду тормоза при перемещении канвы через RenderTransform. Пробовал на каждое движение мыши перерисовывать эллипсы в новых позициях — так еще в несколько раз медленнее. Единственный способ, который позволил заметно ускорить перемещение объектов — кэширование через BitmapCache. С ним работает идеально. Но при размере кэша порядка 1.5-2 тысяч пикселей начинают лезть какие-то непонятные артефакты. Я пытался сделать так: двигаем закешированный грид с видимой в данный момент частью точек. Когда нужно подгрузить новые точки, грид сдвигается в начало координат, координаты существующих точек относительно грида обновляются (чтобы не скакали по экрану), новые подгружаются сразу в нужные места. Работает абсолютно плавно (подгрузка происходит после отпускания мыши, то есть пользователь уже не замечает тормозов), но при этом появляется какой-то мусор кругом, если окно развернуто на весь экран.
Также идеально двигаются 1000 квадратиков (их можно и 10000 нарисовать, все равно быстро). А эллипсы тормозят. Кэширование каждого отдельного эллипса тоже ничего не дает. Перемещение каждого отдельного эллипса через рендертрансформ (если эллипсы — Shape) также работает медленнее, чем перемещение всей канвы (или грида, короче, где лежат фигуры) целиком.
В общем, или не давать пользователю смотреть сразу весь график (~2к точек + столько же линий + сетка и надписи), или как-то пытаться сделать свое нормальное кэширование в битмап, чтобы двигать по экрану битмап, а не фигуры. Или кэшировать кусочками
Как вообще правильно двигать сложное векторное изображение по экрану? Перерисовывать вручную каждый кадр или двигать целиком контейнер с изображением, заставляя впф думать самой?