我通过网络连接收到一系列图像,并希望尽快显示它们,最高可达30 FPS。我已经派生了一个UIView对象(所以我可以覆盖drawRect)并暴露了一个名为cameraImage
的UIImage属性。帧数据以所需的速度到达,但实际绘制到屏幕需要花费太多时间(由于setNeedsDisplay的延迟),都会在视频中产生延迟并减慢与其他控件的交互。有什么更好的方法呢?我虽然使用OpenGL,但我见过的唯一例子不是将静态图像绘制到屏幕上,而是用于为某些旋转多边形添加纹理。
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect screenBounds = [[UIScreen mainScreen] bounds];
[self.cameraImage drawInRect:screenBounds];
// Drawing code
//CGContextDrawImage(context, screenBounds, [self.cameraImage CGImage]); // Doesn't help
}
答案 0 :(得分:3)
尝试为图片设置CALayer
的{{1}}。或者,如果您使用相对合理的参数进行设置,设置contents
的{{1}}的速度应该不会慢得多。
OpenGL绝对是一种替代方案,但它的使用起来要困难得多,它仍然会受到与其他产品相同的限制:纹理上传速度。
(你正在做的方式(在UIImageView
中绘图),你必须让UIKit为你分配一个位图,然后将图像绘制到位图中,然后将位图上传到视频硬件。如果可以,跳过中间人并直接上传图片。)
它也可能取决于CGImage的来源。它是由原始位图数据支持(如果是这样,以什么格式?),还是JPEG或PNG?如果图像必须进行格式转换或解码,则需要更长时间。
另外,CGImage有多大?确保它不比它需要的大!