什么是在NSView中绘制线条集合的首选方法?

时间:2018-05-24 19:27:47

标签: macos cocoa nsview

让我们说我的NSView实例中的某个实例变量中有一些行集合。随着时间的推移,这个系列保持不变你会如何画出这个系列?

我目前在设置集合时绘制到NSImage,并覆盖-drawRect:以显示图片的内容。还有更好的方法吗?

目前已测试了两个选项:

  1. 设置集合时绘制到NSImage,并覆盖-drawRect:以显示图片的内容。
  2. -drawRect:本身中绘制线条列表。
  3. Benchmarks显示图像绘制速度更快。如果我调整窗口的大小,它就有了,说; 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;
    }
    

0 个答案:

没有答案