У меня есть программа, которая отображает изображение внутри NSScrollView
. Я использую Metal для рендеринга изображения, поэтому NSClipView
documentView
- это MTKView
. Я поддерживаю возможность увеличения / уменьшения изображения. Последние шаги конвейера рендеринга заключают мою текстуру Metal в CIImage
, где я применяю фильтр CIAffineTransform
для масштабирования. Я визуализирую изображение в drawRect
в графическом виде следующим образом:
CIImage *image = ...;
CIRenderDestination *renderDest = [[CIRenderDestination alloc] initWithWidth:image.extent.size.width
height:image.extent.size.height
pixelFormat:self.colorPixelFormat
commandBuffer:commandBuffer
mtlTextureProvider:^id<MTLTexture> _Nonnull{
return drawable.texture;
}];
[self.ciContext startTaskToRender:image
toDestination:renderDest
error:&error];
Когда размер представления документа изменяется, я обновляю свойство представления drawableSize
. Это отлично работает, и полосы прокрутки и полосы прокрутки работают должным образом. Проблема в том, что когда коэффициент увеличения становится слишком большим, базовая текстура отрисовываемого объекта превышает объем памяти графического процессора:
validateTextureDimensions, line 1081: error 'MTLTextureDescriptor has width (18798) greater than the maximum allowed size of 16384.'
validateTextureDimensions:1081: failed assertion `MTLTextureDescriptor has width (18798) greater than the maximum allowed size of 16384.'
поэтому рисование обрезанного изображения в части чертежа не сработает (не то, чтобы я знал, как это сделать из CIImage
). Это происходит, даже если я не рисую изображение в представлении (т.е. просто устанавливаю ожидаемый размер для рисования), что предполагает, что проблема в MTKView
. Конечно, рисовать полное изображение мне не нужно; только та часть, которая видна в виде клипа. Я мог бы ограничить просмотр drawableSize
/ документа, но тогда мне пришлось бы эффективно реализовать прокрутку вручную и потерять полосы прокрутки.
Каков наилучший путь для стандартного режима прокрутки при отображении очень больших изображений? В качестве альтернативы, есть ли способ использовать что-то вроде CATiledLayer
с Metal?