Разбиение WPF PathGeometry на "плитки"
У меня есть довольно большая PathGeometry (более 100000 точек и штрих, но не заполнен) для отображения для пользователя, но только небольшая часть пути будет видна в любой момент времени. Для пояснения, сам путь не предопределен, а будет создан из данных.
Проблема: я хочу обеспечить очень плавное панорамирование, чтобы пользователь мог исследовать области большего пути.
У меня есть возможное решение, но я не уверен, как его осуществить. Я хотел бы использовать технику листов - разбить геометрию на плитки и загружать только видимые плитки.
Итак, как разбить геометрию траектории только для обводки на плитки. Более конкретно, как мне определить часть пути, которая существует в данной прямоугольной плитке?
Я знаю, что могу использовать CombinedGeometry, чтобы определить пересечение между геометрией пути и прямоугольником, но это будет включать в себя "стены" прямоугольника (который будет зачеркнут). Есть ли лучший способ мозаичной PathGeometry только для обводки?
Спасибо!
3 ответа
Возможно, вместо тайлинга просто используйте одну геометрию пути и программно изменяйте данные пути, используя привязку данных или что-то еще, чтобы представить сегмент пути, на котором вы увеличиваете масштаб. Немного похоже на DeepZoom, но с путями. Это будет означать, что вам не придется возиться с путями слияния.
Я делаю что-то похожее на тебя, но числа, которые я использую В моих путях немного меньше, поэтому я не рассматривал использование каких-либо методов виртуализации. Однако я не заметил серьезных проблем с производительностью. У меня есть траектория в просмотре прокрутки, представляющая около 1000 - 10000 точек, и она становится медленной только при увеличении масштаба, только если точки очень далеко друг от друга. Если точки на пути относительно близки к своим соседям (например, хорошая широкая синусоида), тогда WPF выполняет некоторую оптимизацию для них, чтобы предотвратить любое заметное отставание.
Например: этот путь...
... займет больше времени, чем этот путь:
даже если они содержат одинаковое количество точек, описывающих это. Хотя на самом деле путь должен выглядеть примерно так, как показано на рисунке ниже, прежде чем вы заметите разницу в производительности.
Поскольку путь представляет звуковую волну, я намерен избавиться от любых будущих проблем, подобных этой, выполнив какую-то проверку, чтобы определить, создают ли точки массивный темно-синий блок и заменить его чем-то менее энергоемким, но это может быть достаточное решение для вас.
(извините за разницу в размерах на изображениях, бит, который вычисляет синусоидальную волну, в данный момент не работает, поэтому мне пришлось использовать старые jpegs)
Я сам недавно думал об этом, так что, возможно, мой опыт может помочь вам. Во-первых, вы можете получить более высокую производительность, если сможете использовать StreamGeometry, а не PathGeometry. Я бы порекомендовал создать одну StreamGeometry в качестве свойства Data для Path, поместить ее на холст, а затем применить преобразования Scale и Translate для навигации по фигуре. Я получал приличную производительность с 5 или 6 SeriesGeometries каждая с 1000 баллами (очевидно, намного меньше, чем число, которое вы упомянули), хотя я считаю, что графический движок WPF будет масштабироваться довольно хорошо, пока у вас нет всех точек на экране в то же время. Если вам нужно поддерживать "полное уменьшение", то есть все точки были бы видны, то я бы порекомендовал создать версии геометрии с низким разрешением (то есть, либо более простой набор точек или растровое изображение) и поменять местами максимумы и минимумы. -res версии, когда масштаб достигает некоторого уровня.
Имеет ли это смысл?
Удачи!
Один из способов - загрузить всю геометрию на холсте. Затем примените масштаб к холсту. Вы можете использовать сторонние элементы управления, такие как ab2d.
Я создал такой холст, как в фотошопе, с множеством рисунков (созданных пользователем) в виде лежащих там геометрий. Я использовал ab2d, чтобы уменьшить масштаб с помощью menucontrol, и он работает нормально. Вы также можете установить предопределенный масштаб для его части.
Спасибо / subho100