Какой предпочтительный способ нарисовать коллекцию линий в NSView? - PullRequest
0 голосов
/ 24 мая 2018

Допустим, в моем экземпляре NSView есть коллекция строк в некоторой переменной экземпляра.Эта коллекция остается неизменной с течением времени.Как бы вы нарисовали коллекцию?

В настоящее время я рисую NSImage при настройке коллекции и перезаписываю -drawRect:, чтобы отобразить содержимое изображения.Есть ли лучший способ?

До сих пор тестировались два варианта:

  1. Рисовать на NSImage при настройке коллекции и переопределять -drawRect: для отображения изображениясодержание.
  2. Нарисуйте список строк в самом -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;
}
...