如何在Mac上使用金属获取当前可绘制的快照?

时间:2019-03-22 02:52:37

标签: metal

我找到了类似的帖子herehere。 我尝试了以下代码,它在iOS 12.1.4上工作正常,但在macOS Mojave version 10.14上为空

    id<CAMetalDrawable> lastDrawable = view.currentDrawable;
    [commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> commandBuffer) {
        id<MTLTexture> drawableTexture = lastDrawable.texture;
        int width = (int)drawableTexture.width;
        int height = (int)drawableTexture.height;
        int len = width * height * 4;
        uint8_t* image = (uint8_t*)malloc(len);
        [drawableTexture getBytes:image bytesPerRow:width*4 fromRegion:MTLRegionMake2D(0, 0, width, height) mipmapLevel:0];

        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        CGContextRef bitmapContext = CGBitmapContextCreate(
                                                           image,
                                                           width,
                                                           height,
                                                           8, // bitsPerComponent
                                                           4*width, // bytesPerRow
                                                           colorSpace,
                                                           kCGImageAlphaNoneSkipLast);

        CFRelease(colorSpace);

        CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext);
        CFRelease(cgImage);
        CFRelease(bitmapContext);
        free(image);
    }];

我需要一些其他过程来获取Mac当前屏幕的正确快照吗?

1 个答案:

答案 0 :(得分:1)

管理绘图对象纹理的存储模式。您需要使用blit命令编码器对-synchronize...命令进行编码。否则,不能保证数据可用于CPU。