У меня есть представление со слоями, я пытаюсь добавить к нему подслои размером примерно 300 X 270 (в пикселях).
Количество подслоев может достигать 1000-2000, не говоря уже о том, что каждый подслой снова масштабируется до примерно 4280 X 1500 или более для начинающих.
Итак, проблема, очевидно, в ограничении графического процессора.
После добавления около 100 подслоев размером 300 X 270 появляется предупреждение image is too large for GPU, ignoring
, которое не работает с отображением слоя.
Решением такой проблемы (из некоторых списков рассылки) было использование CATiledLayer
, но я не могу использовать tiledLayer
из-за сложного требования отображения подуровня.
Есть ли возможность удаления подслоев, которые не попадают под VisibleRect
вида?
Я пытался removeFromSuperlayer
, а затем добавлял его всякий раз, когда это требовалось, всегда возникал сбой при попытке добавить подслой обратно.
Как я могу это сделать?
Я добавляю подслой дважды (мне нужно изменить его), но пока только для сути кода:
-(IBAction)addLayer:(id)sender
{
Layer *l = [[Layer alloc] init];
CALayer *layer = [l page];
[contentArray addObject:page];
[drawLayer addSublayer:layer];
[self layout];
}
-(void)layout
{
NSEnumerator *pageEnumr = [contentArray objectEnumerator];
float widthMargin = [self frame].size.width;
CGRect rect;
float zoom = [self zoomFactor];
while(obj = [contentEnmr nextObject] )
{
[obj setZoomFactor:zoom];
CALayer *pg =(CALayer *)[obj page] ;
rect = pg.bounds;
if ( x + pg.bounds.size.width > widthMargin )
{
x = xOffset;
y += rect.size.height + spacing ;
}
rect.origin = CGPointMake(x,y);
[obj changeBounds];
NSRect VisibleRect = [self visibleRect];
NSRect result = NSIntersectionRect(VisibleRect,NSRectFromCGRect( rect));
if( NSEqualRects (result ,NSZeroRect) )
{
[pg removeFromSuperlayer];
}else
{
[drawLayer addSublayer:pg];
[pg setFrame:rect];
[pg setNeedsDisplay];
}
x += ( rect.size.width + spacing);
}
NSRect viewRect = [self frame];
if(viewRect.size.height < ( y + rect.size.height + spacing ) )
viewRect.size.height = ( y + rect.size.height + spacing) ;
[self setFrameSize: viewRect.size];
}
@interface Layer : NSObject {
CALayer *page;
}
@property (retain) CALayer *page;