3

我之前问过像素推送,现在已经设法让噪音出现在屏幕上。这是我的初始化方式:

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

4 回答 4

2

缓慢几乎肯定是在噪声产生中。如果您在 Instruments 中运行它,您可能会发现大量时间都花在了循环中。

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

如果您可以使用 CoreGraphics 例程进行绘图,则最好为绘图上下文创建一个 CGLayer,而不是每次都创建一个新对象。

bytesPerRow 组件对性能也很重要。它应该是 32 IIRC 的因子。有一些代码可用的链接文本显示了如何计算它。

是的,对于原始性能,OpenGL。

于 2008-10-12T02:39:58.613 回答
1

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

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

如果只是想给出随机的效果,可能没必要每次都重新生成整个位图。

于 2008-10-11T15:40:09.257 回答
1

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

于 2008-10-11T18:04:43.957 回答
1

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

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

是的,我知道这是旧的,我是从谷歌偶然发现的

于 2009-12-22T20:30:37.877 回答