如何在iPhone上更快地推动像素?

时间:2008-10-11 15:04:01

标签: iphone framebuffer pixels

之前我问过关于像素推送的问题,现在已经设法足够远,以便在屏幕上显示噪音。这是我如何初始化:

CGDataProviderRef provider;
bitmap = malloc(320*480*4);
provider = CGDataProviderCreateWithData(NULL, bitmap, 320*480*4, NULL);
CGColorSpaceRef colorSpaceRef;
colorSpaceRef = CGColorSpaceCreateDeviceRGB();
ir = CGImageCreate(
320,
480,
8,
32,
4 * 320,
colorSpaceRef,
kCGImageAlphaNoneSkipLast,
provider,
NULL,
NO,
kCGRenderingIntentDefault
);

以下是我渲染每一帧的方法:

for (int i=0; i<320*480*4; i++) {
bitmap[i] = rand()%256;
}
CGRect rect = CGRectMake(0, 0, 320, 480);
CGContextDrawImage(context, rect, ir); 

问题是这个非常慢,大约5fps。我认为我发布缓冲区的路径一定是错的。甚至可以使用基于像素的全屏图形,我可以在不使用3D芯片的情况下以30fps更新吗?

4 个答案:

答案 0 :(得分:2)

噪音几乎肯定在噪音的产生。如果你在乐器中运行它,你可能会看到花费大量时间在你的循环中。

另一个较小的问题是你的色彩空间。如果使用屏幕的颜色空间,则可以避免颜色空间转换,这可能很昂贵。

如果您可以将CoreGraphics例程用于绘图,则可以通过为绘图上下文创建CGLayer而不是每次创建新对象来获得更好的服务。

bytesPerRow组件对性能也很重要。这应该是32 IIRC的一个因素。有一些可用的代码link text显示了如何计算它。

是的,原始性能,OpenGL。

答案 1 :(得分:1)

我怀疑做614400(320*480*4)内存写入,随机数生成以及每帧生成一个新对象会降低你的速度。

您是否尝试过将静态位图写入屏幕并查看其速度有多快?您是否尝试过分析代码?你是否还需要每次制作一个新的CGRect?

如果您只想提供随机效果,则可能不需要每次都重新生成整个位图。

答案 2 :(得分:1)

据我所知,OpenGL应该是在iPhone上制作图形的最快方式。这包括2D和3D。 UIView由核心动画层支持,无论如何最终都会使用OpenGL进行绘制。那么为什么不跳过中间人。

答案 3 :(得分:1)

您可以通过将CGContextDrawImage分配给CGImageRef来避免-[CALayer setContents:]之间的旅行,只需确保在您仍然使用位图时不要释放位图。

[[view layer] setContents:(id)ir];

是的,我知道这已经过时了,我偶然发现了谷歌