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

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更新?

有帮助吗?

解决方案

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

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

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

bytesPerRow组件对性能也很重要。这应该是32 IIRC的一个因素。 链接文字提供了一些代码,展示了如何计算它

是的,原始性能,OpenGL。

其他提示

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top