代码之家  ›  专栏  ›  技术社区  ›  Bemmu

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

  •  3
  • Bemmu  · 技术社区  · 16 年前

    我以前问过像素推动,现在已经设法得到足够远的噪声显示在屏幕上。以下是我初始化的方法:

    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); 
    

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

    4 回复  |  直到 15 年前
        1
  •  2
  •   Jason Harris    16 年前

    这种缓慢几乎可以肯定是在噪音产生过程中。如果你在仪器中运行它,你可能会看到很多时间都花在你的循环中。

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

    如果可以为图形使用coregraphics例程,那么最好为图形上下文创建一个CGlayer,而不是每次都创建一个新对象。

    BytesPerow组件对性能也很重要。它应该是32 IIRC的系数。有一些代码可用 link text 这说明了如何计算它。

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

        2
  •  1
  •   freespace    16 年前

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

    您是否试过将静态位图写入屏幕并查看其速度?您是否尝试过分析代码?你每次都需要做一个新的CGRECT吗?

    如果您只是想给随机性的效果,可能不需要每次重新生成整个位图。

        3
  •  1
  •   Chris Lundie    16 年前

    据我所知,OpenGL应该是在iPhone上进行图形处理的最快方法。这包括二维和三维。一个uiview由一个核心动画层支持,该层以OpenGL结尾。为什么不跳过中间人呢?

        4
  •  1
  •   rpetrich    15 年前

    你可以避免这趟旅行 CGContextDrawImage 通过分配 CGImageRef -[CALayer setContents:] ,请确保在使用位图时不要释放位图。

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

    是的,我知道这是旧的,我在谷歌上偶然发现的。