作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
或者这段代码可以在后台线程中安全地执行吗?
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 上的数据填充你的纹理(与绘图相同的线程)。
您可能还需要一些锁定机制:
在将数据推送到纹理之前,您应该锁定“缓冲区交换”并按下后解锁。
您可能想知道是否 缓冲区已被交换,并且仅将 fg 数据推送到纹理中 案例。
另请注意,如果您在超过 1 个线程上调用 GL 方法,大多数情况下您都会遇到麻烦。
关于ios - 这个 UIImage 数据读取器线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11833950/
我是一名优秀的程序员,十分优秀!