如何解决如何使逐像素PImage操作更快?
我正在制作一个android应用程序,其中有一个简单的相机UI以及一个过滤器列表,用于操作相机单击的图片。 我正在使用Java中的处理库(https://processing.org/)以及处理IDE中的Ketai库(http://ketai.org/)。
以下是我的程序的主要运行方式:
---我有一个相机对象和一个空图像对象。图像对象具有与相机相同的分辨率。
---从相机读取的内容还会返回图像对象。让我们将相机返回的图像称为cameraimage,将空白图像称为dummyImage。
---在每一帧中,我都使用cameraimage的像素阵列从摄像机读取,将每个像素分别复制到各自坐标位置处的dummyImage上。
---在从cameraimage复制到dummyImage的这一点上,我根据用户选择的选项来操纵像素。
---我将每个像素的红色,绿色和蓝色值复制出来,然后使用移位(以获取最大效率)进行复制。
---复制到dummyImage后,我将dummyImage作为普通图像显示在屏幕上。
现在的问题是,当我直接显示cameraimage时,我很容易获得大约50到60 fps。但是当我在复制后显示dummyImage时,我得到大约1.5 fps。
以下代码演示了如何从cameraimage复制到dummyImage。它没有任何过滤器,但所需的时间与任何过滤器一样。
cameraimage.read();
cameraimage.loadPixels();
dummyImage.loadPixels();
for (int x = 0; x < cameraimage.width; x++){
for (int y = 0; y < cameraimage.height; y++){
int index = x + (y * cameraimage.width);
color currentPixel = cameraimage.pixels[index];
float r = currentPixel >> 16 & 0xFF;
float g = currentPixel >> 8 & 0xFF;
float b = currentPixel & 0xFF;
dummyImage[index] = color(r,g,b)
}
}
dummyImage.updatePixels();
image(dummyImage);
我想知道如何将帧增加到至少每秒20个。请发表评论以获取更多信息,我会尽快回复。
解决方法
一些可能的优化:
-
将
= color(r,g,b)
替换为= 0xff000000 | ((int) (r) << 16 | (int) (g) << 8 | (int) (b))
。 -
您不能在“并行处理”中光栅化图形,但是可以并行读取/写入
pixels[]
数组(之后是updatePixels()
),因此请使用thread()
在多个CPU线程上拆分像素迭代。 -
与其调用
image(dummyImage)
(这涉及对像素进行第二遍复制以将其复制到PApplet
中),不如直接在循环内写入PApplet(删除对{{1 }},而改用dummyImage
。 -
由于逐个像素的计算非常复杂,因此您甚至可以考虑编写glsl着色器(有很多处理示例)或使用Aparapi,将Java代码转换为可用于GPU的OpenCL(我已经成功地将它与Processing结合使用了。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。