gpt4 book ai didi

ios - 这个 UIImage 数据读取器线程安全吗?

转载 作者:行者123 更新时间:2023-11-29 04:30:14 27 4
gpt4 key购买 nike

或者这段代码可以在后台线程中安全地执行吗?

    CGImageRef cgImage;
CGContextRef context;
CGColorSpaceRef colorSpace;

// Sets the CoreGraphic Image to work on it.
cgImage = [uiImage CGImage];

// Sets the image's size.
_width = CGImageGetWidth(cgImage);
_height = CGImageGetHeight(cgImage);

// Extracts the pixel informations and place it into the data.
colorSpace = CGColorSpaceCreateDeviceRGB();
_data = malloc(_width * _height * 4);
context = CGBitmapContextCreate(_data, _width, _height, 8, 4 * _width, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

// Adjusts position and invert the image.
// The OpenGL uses the image data upside-down compared commom image files.
CGContextTranslateCTM(context, 0, _height);
CGContextScaleCTM(context, 1.0, -1.0);

// Clears and ReDraw the image into the context.
CGContextClearRect(context, CGRectMake(0, 0, _width, _height));
CGContextDrawImage(context, CGRectMake(0, 0, _width, _height), cgImage);

// Releases the context.
CGContextRelease(context);

如果没有,如何达到相同的结果?

(我的问题是,如果它在后台运行,我无法根据此方法的输出缓冲区看到我的 OpenGL 纹理)

最佳答案

我认为您可能会在与 GL 不同的线程上运行此代码时遇到问题,如下所示。即使它可以工作,你也可能会遇到半绘制的图像/纹理。您可以通过创建双缓冲区来避免这种情况:您的“_data”应该只分配一次,并且应该保存 2 个原始图像数据缓冲区。然后只需创建 2 个定义为前台和后台缓冲区的指针(首先是 void *fg = _data[0]、void *bg = _data[1])。现在,当您的方法从 CGImage 收集数据到 bg 时,只需交换指针(然后 void *fg = _data[1]、void *bg = _data[0] 或其他方式)现在你的 GL 线程应该用 fg 上的数据填充你的纹理(与绘图相同的线程)。

您可能还需要一些锁定机制:

  1. 在将数据推送到纹理之前,您应该锁定“缓冲区交换”并按下后解锁。

  2. 您可能想知道是否 缓冲区已被交换,并且仅将 fg 数据推送到纹理中 案例。

另请注意,如果您在超过 1 个线程上调用 GL 方法,大多数情况下您都会遇到麻烦。

关于ios - 这个 UIImage 数据读取器线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11833950/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com