Что потребляет меньше памяти фактическое изображение или нарисованное изображение?

Я создаю приложение, и я создаю несколько изображений с PaintCode.

Используя эту программу, я получаю фактический код для каждого создаваемого изображения, что позволяет мне вставлять код или использовать фактическое изображение. Мне было интересно, что будет потреблять меньше памяти, код изображения или фактический PNG?

Я знаю, что потребление памяти изображения составляет width x height x 4 = bytes in memory, но я понятия не имею, является ли изображение, генерируемое кодом, более эффективным с точки зрения памяти, меньшим объемом памяти или разрывом?

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

Ответ 1

Этот ответ зависит от других ответов, потому что у меня создается впечатление, что графический контекст является вашим наиболее распространенным назначением - что вы не всегда оказываете дискретное растровое изображение. Итак, для целей типичного рисования:

Мне было интересно, что будет потреблять меньше памяти, код изображения или фактический PNG?

Скорее всего, этот код значительно снизит потребление памяти.

Я не знаю, является ли изображение, генерируемое кодом, более эффективным с точки зрения памяти, меньшим объемом памяти или разрывом?

Существует много переменных, и нет простого уравнения, чтобы сказать вам, что лучше для любого заданного ввода. Если его достаточно просто создать с помощью WYSIWYG, он, вероятно, намного меньше кода.

Если вам нужно создать промежуточные растеризации или слои для векторного рендеринга, тогда память будет примерно равна после того, как вы добавите первый уровень. Как правило, один/не должен отображать каждый вид или слой (не CALayer, btw) для этих промежуточных элементов, а вместо этого визуализировать непосредственно в графическом контексте. Когда все ваши представления отображаются непосредственно в графическом контексте, они записываются в один и тот же пункт назначения.

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

Ответ 2

Если ваша цель - рисовать изображения, вы должны попытаться использовать UIImageView, если возможно. Это, как правило, самый быстрый и самый дешевый способ получить изображение на экране, и он достаточно гибкий.

кто-то объяснил это лучше здесь. источник

Ответ 3

Векторное изображение почти всегда меньше в памяти, чем растровое изображение, за исключением фотографий. Однако в памяти они должны быть растрированы, если вам нужно их отображать, поэтому они будут использовать более или менее одинаковый объем памяти.

Однако я очень скептически отношусь к пользе PaintCode; в общем случае лучше использовать стандартный формат изображения, такой как .svg или .eps, вместо нестандартного формата, такого как язык, специфичный для домена (DSL) в Objective C.

Ответ 4

Это не имеет никакого значения, если конечный размер изображения (в размерах точек) совпадает с размером экрана (в размерах точки). То, что в конечном итоге отображается в вашем приложении, это, скажем, растровое изображение 100x100. Это одинаковое количество бит, независимо от того, как они были получены для начала.

Место, куда теряется память, - это удерживать изображение, которое намного больше (в размерах точек), чем на самом деле отображается в интерфейсе.

Если я загружу 3MB PNG из своего пакета приложений, уменьшите его до 100x100 и нарисуйте его в интерфейсе и отпустите исходный 3MB PNG, результатом будет то же количество памяти в хранилище резервных копий, что и если я сам рисую содержимое графического контекста 100X100 с помощью Core Graphics (что и помогает PaintCode).