Как получить снимок текущего рисования с металлом на Mac? - PullRequest
0 голосов
/ 22 марта 2019

Я нашел похожий пост здесь и здесь .Я попробовал следующие коды, он отлично работает в 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 Ответ

1 голос
/ 22 марта 2019

Управляется режим хранения текстуры отрисовки. Вам необходимо использовать кодировщик команды blit для кодирования команды -synchronize.... В противном случае данные не гарантированно будут доступны для ЦП.

...