IKImageView изменчивый? - PullRequest
3 голосов
/ 30 июля 2010

У меня есть IKImageView, и я помещаю в него CGImages (который я делаю из NSImages).Однако нормальная страница 200DPI 8.5 / 11 занимает около 3 секунд, появляясь в прямоугольниках около 2 дюймов (экран) по бокам за раз.Это действительно раздражает.Есть ли способ обойти это?

В качестве альтернативы, есть ли способ удвоить представление буфера?Иметь 2 IKImageViews и рисовать в одном, а затем отображать его?

ETA: удвоение моих прокручиваемых обзоров (с ikimageviews внутри) и затем рисование в них, а затем их скрытие, похоже, не помогает ...или, может быть, это немного помогает, но не сильно

Я немного поковырялся с инструментами и обнаружил, что в memcopy выполняется много работы:

  22 commpage [libSystem.B.dylib] 78.0  __memcpy
  21 ImageIO 37.0  CGImageReadGetBytesAtOffset
  20 ImageIO 37.0  CGImageReadSessionGetBytes
  19 ImageIO 37.0  myTIFFReadProc
  18 libTIFF.dylib 37.0  TIFFReadRawStrip1
  17 libTIFF.dylib 37.0  TIFFFillStrip
  16 libTIFF.dylib 37.0  _cg_TIFFReadEncodedStrip
  15 ImageIO 37.0  copyImageBlockSetTIFF
  14 ImageIO 37.0  ImageProviderCopyImageBlockSetCallback
  13 CoreGraphics 37.0  CGImageProviderCopyImageBlockSet
  12 CoreGraphics 37.0  img_blocks_create
  11 CoreGraphics 37.0  img_blocks_extent
  10 CoreGraphics 37.0  img_interpolate_extent
   9 CoreGraphics 37.0  img_data_lock
   8 CoreGraphics 37.0  CGSImageDataLock
   7 libRIP.A.dylib 37.0  ripc_AcquireImage
   6 libRIP.A.dylib 37.0  ripc_DrawImage
   5 CoreGraphics 37.0  CGContextDrawImage
   4 ImageKit 37.0  -[IKImageLayer drawInContext:]
   3 QuartzCore 37.0  tiled_layer_render(_CAImageProvider*, unsigned int, unsigned int, unsigned int, unsigned int, void*)
   2 QuartzCore 37.0  CAImageProviderThread(void*)
   1 libSystem.B.dylib 37.0  _pthread_wqthread
   0 libSystem.B.dylib 37.0  start_wqthread

Я не уверен, что это говорит мне, хотя ...

РЕДАКТИРОВАТЬ: Для записи, проблема в НЕ размер данных.У меня есть старая версия программы, которая использует устаревшие вызовы метода quickdraw.Когда я увеличиваю изображение до 300%, так что один пиксель экрана = один пиксель изображения, поэтому для него нужно использовать все изображение целиком, он ЕДЕТ масштабировать прямо вдоль страницы за страницей.

Меня высмеивает парень, который написал это первоначально, потому что его версия движется быстрее на его древней 10.3 G5, чем на моей современной коробке Intel.быстрее как минимум в 10 раз.

1 Ответ

2 голосов
/ 31 июля 2010

200DPI 8,5 / 11 стр.

Предполагая, что они в цвете RGB, это 11,22 мегабайта пикселей на изображение. Ваше приложение использует много памяти, и отрисовка 3,74 мегапикселя (независимо от цветового пространства) будет медленной.

2 дюйма (экран) на стороне

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

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

...