UWP / Win2D — сохранить чертеж в памяти

#uwp #win2d

#uwp #win2d

Вопрос:

Было бы неплохо привести пример кода, но достаточно нескольких общих советов о наилучшем способе справиться с этой ситуацией.

Я визуализирую изображение на холсте Win2D. Изображение сначала состоит из фрагментов растровых изображений для формирования большого изображения. Я буду называть это «Базовым изображением».

Затем я использую различные вызовы «draw» для разметки базового изображения, а также размещаю другие растровые изображения поверх базового изображения, чтобы создать окончательное изображение.

Пользователь может прокручивать изображение в любом направлении и / или увеличивать и уменьшать масштаб изображения. Движения мыши отслеживаются, и на холсте отображается всплывающая подсказка, чтобы предоставить пользователю подробную информацию. Каждый раз, когда пользователь делает что-либо, что влияет на изображение, я перерисовываю все изображение. В некоторых случаях базовое изображение состоит из целых 46 000 крошечных растровых изображений.

Даже при использовании такого жесткого подхода изображение перерисовывается довольно быстро, но это кажется наихудшим из возможных способов сделать это.

Моя интуиция подсказывает мне, что я должен отрендерить базовое изображение один раз, сохранить его в памяти, а затем скопировать на холст по мере необходимости. После этого наложите необходимые биты, чтобы завершить изображение. Я не могу найти ни одного материала, который подсказывает, как сохранить растровое изображение в памяти для этой цели. Я также не знаю, является ли это наиболее подходящим подходом.

Любые рекомендации или предложения по наиболее подходящему курсу действий будут оценены.

Пол

Ответ №1:

Здесь ваши инстинкты совершенно правы — вы, скорее всего, сможете добиться значительного увеличения производительности, нарисовав изображение только один раз, а затем повторно используя его кэшированную версию.

CanvasRenderTarget — это способ сделать это: проверьте https://microsoft.github.io/Win2D/html/T_Microsoft_Graphics_Canvas_CanvasRenderTarget.htm и https://microsoft.github.io/Win2D/html/Offscreen.htm в качестве отправных точек.

Комментарии:

1. Я думаю, что раньше видел класс CanvasRenderTarget, но статья «за кадром» внезапно придала ему смысл. Я попробую.

2. Похоже, что это будет работать просто отлично. Я могу легко создать сгенерированное растровое изображение на «внеэкранном» ресурсе, а затем скопировать нужные мне фрагменты на свой экранный ресурс. Однако я обнаружил ограничение. Максимальная ширина (и, я полагаю, высота) изображения вне экрана не может превышать 16384. Фактическая ошибка: «MaximumBitmapSizeInPixels для этого устройства равно 16384». Это примерно 1/4 от нужного мне размера, но ограничение также говорит мне о том, что базовый размер, который я пытался создать, был бы слишком большим, чтобы быть разумным.

3. Обратите внимание, что размер растрового изображения 16384 * 16384 (при условии 32-битного цветового формата) составляет 1 ГБ, поэтому, даже если аппаратное обеспечение GPU способно поддерживать такое большое изображение, у вас довольно быстро закончится память!

4. Согласен. Это было частью преимущества создания изображения «на лету». Построенное изображение никогда не бывает больше того, что отображается на экране. Я должен быть в состоянии найти несколько достойных компромиссов, хотя это даст мне производительность, которую я ищу, без полного разжевывания памяти.