C++ SFML-优化从GPU到RAM的复制

C++ SFML-优化从GPU到RAM的复制,c++,gpu,sfml,C++,Gpu,Sfml,我的应用程序包含一个短函数,它将SFML GPU缓冲区(sf::RenderTexture转换为sf::Image)复制到二维颜色数组中(存储在RAM中,由CPU处理)。以下是代码: const sf::Image image = renderTexture.getTexture().copyToImage(); for (Point_t y = 0; y < totalHeight; ++y) { for (Point_t x = 0; x < totalWidth; +

我的应用程序包含一个短函数,它将SFML GPU缓冲区(
sf::RenderTexture
转换为
sf::Image
)复制到二维颜色数组中(存储在RAM中,由CPU处理)。以下是代码:

const sf::Image image = renderTexture.getTexture().copyToImage();

for (Point_t y = 0; y < totalHeight; ++y)
{
    for (Point_t x = 0; x < totalWidth; ++x)
    {
        const sf::Color& c = image.getPixel(x, totalHeight - y - 1);
        // here processing this c variable
    }
}
const sf::Image=renderTexture.getTexture().copyToImage();
对于(点y=0;y
问题是:在256x64px屏幕上,我获得了20 FPS的速度——这太低了,我的应用程序需要50 FPS的速度。如何改进此流程的性能

也许我应该使用额外的库来加速它

编辑:


有人建议我应该使用RealImaging库而不是SFML。但关键是,SFML是实时旋转对象等的完美库,所以我将坚持使用SFML,只需要优化或以其他方式将缓冲区从GPU复制到CPU。

您不需要这样做,SFML会自行优化所有这些。你真的需要一张图片,难道你不能通过sf::Texture和sf::Sprite吗?

对于感兴趣的图片,我找到了一个解决方案:

此库提供从GPU到CPU的复制加速:


(第70行)

我需要每个像素的颜色,而纹理不提供这种可能性。不过,它是唯一的解决方案,而且速度很慢,因为每次调用
copyToImage()
都会生成一个新图像。SFML不能处理这个问题,我想。。。也许您应该尝试另一个库,或者直接使用Xlib(仅在unix上)。您是否检查了需要花费的时间、复制调用或您的处理?您需要调用上述代码的频率有多高?复制过程需要花费这段时间。我每次都在循环中调用这段代码,我需要50-60 FPS,所以这段代码应该每秒执行50-60次,但现在只有20次。也许还有其他方法可以做到这一点?SFML不是图像处理库。如果你想做到这一点,你应该看看像OpenCV这样的库。如果您只想逐像素操作图像(如边缘检测),可以利用SFML的
sf::Shader
类和GPU进行快速处理。示例可在中找到。可能重复的