Большая часть efficent способа создать CALayer с изображением в нем?

Пример минимальной гранулярности блоков

Давайте немного поиграем, чтобы посмотреть, что происходит.

mount говорит мне, что я нахожусь в разделе ext4, смонтированном в /.

Я нахожу его размер блока с помощью:

stat -fc %s .

, что дает:

4096

Теперь давайте создадим несколько файлов с размерами 1 4095 4096 4097:

#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
  dd if=/dev/zero of=f bs=1 count="${size}" status=none
  echo "size     ${size}"
  echo "real     $(du --block-size=1 f)"
  echo "apparent $(du --block-size=1 --apparent-size f)"
  echo
done

и результаты:

size     1
real     4096   f
apparent 1      f

size     4095
real     4096   f
apparent 4095   f

size     4096
real     4096   f
apparent 4096   f

size     4097
real     8192   f
apparent 4097   f

Итак, мы видим, что все, что ниже или равно 4096, на самом деле занимает 4096 байтов.

Затем, как только мы пересекаем 4097, он поднимается до 8192, который является 2 * 4096.

Тогда ясно, что диск всегда хранит данные на границе блока в 4096 байтов.

Что происходит с разреженными файлами?

Я не исследовал, что такое точное представление, но ясно, что --apparent принимает это во внимание.

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

Например:

dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f

дает:

8192    f
1073741825      f

Связанные: Как проверить, поддерживается ли разреженный файл

] Что делать, если я хочу хранить кучу небольших файлов?

Некоторые возможности:

Библиография:

Протестировано в Ubuntu 16.04.

8
задан Michael Gaylord 14 June 2009 в 10:32
поделиться

1 ответ

Что ж, CGImage не является CALayer , поэтому вы, очевидно, оставляете некоторые шаги там, но я предполагаю, что вы знаете, о чем говорите, насколько рисование в CALayer или еще много чего.

Если ваш вопрос касается создания CGImage без использования UIImage, вы можете попробовать изучить следующие функции:

  • CGImageCreateWithJPEGDataProvider
  • CGImageCreateWithPNGDataProvider

Если вы заранее знаете, что это за изображение, просто используйте соответствующий метод. В противном случае вам нужно будет посмотреть подпись файла, чтобы узнать, содержит ли он PNG или JFIF. Конечно, для этого необходимо реализовать CGDataProvider .

Я предполагаю, что это именно то, что уже делает класс UIImage . Если вы хотите выжать из этого максимум эффективности, вы можете использовать один из следующих методов в классе UIImage :

+ (UIImage *)imageWithContentsOfFile:(NSString *)path
+ (UIImage *)imageWithData:(NSData *)data

Единственная разница между этими методами и

+ (UIImage *)imageNamed:(NSString *)name

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

2
ответ дан 5 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: