之前我问过关于像素推送的问题,现在已经设法足够远,以便在屏幕上显示噪音。这是我如何初始化:
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更新吗?
答案 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];
是的,我知道这已经过时了,我偶然发现了谷歌