【发布时间】:2011-09-23 07:48:37
【问题描述】:
我正在尝试尽快从 RGBA 图像数据中复制 1 或 2 个颜色通道(这是我的代码中最慢的部分,它会降低整个应用程序的速度)。有没有快速大步复制的方法?
数据只是简单地排列为 RGBARGBARGBA 等,我只需要复制 R 值,或者在另一种情况下只复制 RG 值。
到目前为止,我所拥有的大致是复制 R 值:
for(int i=0; i<dataSize; i++){
dest[i] = source[i*4];
}
对于 RG 值,我正在做:
for(int i=0; i<dataSize; i+=2){
dest[i] = source[i*2];
dest[i+1] = source[(i*2)+1];
}
所有数据都是无符号的 1 字节值。有没有更快的方法?我已经部分展开了循环(每次迭代执行 64 个值 - 除此之外加速微不足道)。平台是 Armv7 (iOS),所以使用 NEON (SIMD) 可能会很有用,不幸的是我的经验为零!
不幸的是,更改数据是不可能的,它是由 opengl 的 readPixels() 函数提供的,据我所知,iOS 不支持读取 L、LA、RG 等。
【问题讨论】:
-
对于 RG 值
*(uint16_t *)(dest + i) = *(short *)(source + i)可能会有所帮助。 -
另外,这些美元符号是怎么回事?
-
是的,这可能确实有帮助。我会试一试,并对其进行分析 - 它可能会有所作为(我的速度是 22fps,需要 25,所以即使是很小的差异也足够了)。还有美元符号……到底是什么?!缺乏睡眠? :D 我会在任何人注意到之前进行快速编辑
-
@Chris Lutz,我认为他们可能是@psonic & 符号而不是 $ 输入错误。
-
愚蠢的问题——我假设您已经消除了这些可能性,但是在执行 getpixels 之前是否可以使用 openGL 函数将数据展平为单色或其他东西?或者改变视频编码以期望跨步格式的数据并消除冗余副本?