Допустим, в моем экземпляре NSView
есть коллекция строк в некоторой переменной экземпляра.Эта коллекция остается неизменной с течением времени.Как бы вы нарисовали коллекцию?
В настоящее время я рисую NSImage
при настройке коллекции и перезаписываю -drawRect:
, чтобы отобразить содержимое изображения.Есть ли лучший способ?
До сих пор тестировались два варианта:
- Рисовать на
NSImage
при настройке коллекции и переопределять -drawRect:
для отображения изображениясодержание. - Нарисуйте список строк в самом
-drawRect:
.
Контрольные отметки показывают, что рисование изображения происходит намного быстрее.Если я изменю размеры моего окна, и оно имеет, скажем;10000 линейных сегментов, тогда изменение размера будет невероятно медленным, если я воспользуюсь вторым вариантом.С первой не так.
Какая стратегия предпочтительна (например, наиболее эффективна)?
Пример кода:
- (void)drawSegments:(NSSize)size segments:(segment *)segments count:(int)nb_segments {
NSBitmapImageRep *lineRepresentation = [self bitmapForPixels:linePixels];
[NSGraphicsContext setCurrentContext:
[NSGraphicsContext graphicsContextWithBitmapImageRep:lineRepresentation]];
memset(*linePixels, 0, pixels*4);
NSBezierPath *path = [NSBezierPath bezierPath];
for (int i=0 ; i<nb_segments ; i++) {
[path moveToPoint:NSMakePoint(segments[i].x1, segments[i].y1)];
[path lineToPoint:NSMakePoint(segments[i].x2, segments[i].y2)];
}
[[NSColor blackColor] setStroke];
[path stroke];
[lineRepresentation release];
}
- (NSBitmapImageRep *)bitmapForPixels:(int **)pixels {
NSBitmapImageRep *representation = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:((unsigned char **)pixels)
pixelsWide:SCREEN_SIZE.width
pixelsHigh:SCREEN_SIZE.height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:true
isPlanar:false
colorSpaceName:NSDeviceRGBColorSpace
bitmapFormat:NSAlphaFirstBitmapFormat
bytesPerRow:4*SCREEN_SIZE.width
bitsPerPixel:32];
return representation;
}