Использование одного и того же буфера CGImageRef для разных изображений? - PullRequest
0 голосов
/ 18 июля 2011

Я ищу способ создать буфер CGImageRef один раз и использовать его снова для разных изображений.

Я столкнулся с падением производительности моего приложения, поскольку оно создает изображение и затем рисует его в контексте.Этот процесс происходит в таймере, который срабатывает каждые 1 мс.Интересно, могу ли я что-нибудь сделать, чтобы избежать вызова CGBitmapContextCreateImage (bitmapcontext);на каждый тик.

Спасибо

1 Ответ

1 голос
/ 18 июля 2011

Есть один способ теоретически сделать это:

  1. Создать NSMutableData или CFMutableData.
  2. Используйте его mutableBytes / MutableBytePtr в качестве резервного буфера контекста растрового изображения.
  3. Создайте CGDataProvider с объектом данных.
  4. Создайте CGImage с этим поставщиком данных , убедившись, что вы используете все те же значения параметров, с которыми вы создали растровый контекст.

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

Возможно, вам лучше держаться за CGImage. Если вы генерируете изображение на основе некоторого ввода, подумайте, сможете ли вы кэшировать результирующие изображения с помощью этого ввода - например, если вы рисуете число или два в контексте, рассмотрите кэширование CGImages в словаре или * 1023. * NSCache , кодируемый строкой чисел. Конечно, насколько это возможно, зависит от того, насколько велики изображения и насколько ограничена память; если это на iOS, вы, вероятно, довольно быстро удалили бы элементы из этого кэша.

Кроме того, выполнение действий каждые 1 мс фактически не будет видимо пользователю. Если вы хотите показать эти изображения пользователю, то нет способа сделать это 1000 раз в секунду - даже если вы можете сделать это в своем приложении, пользователь просто не сможет увидеть это так быстро. Что касается Snow Leopard (и я думаю со времен Tiger, если не раньше), Mac OS X ограничивает рисование до 60 кадров в секунду; Я думаю, что это также верно для iOS. То, что вы должны делать с разумным интервалом (1/60 секунды достаточно разумно), устанавливает представление как нужное для отображения, и вы должны выполнять генерацию этого рисунка / изображения только тогда, когда представлению предписано рисовать.

...