我正在基于虚幻的开源无人机仿真(Microsoft AirSim)上进行工作,在该仿真中,我试图从连接到无人机的摄像机捕获并保存图像。下面的图像提供了游戏外观的概念。底部最右边的视图是摄像机的实际视图,其他两个视图只是同一图像的处理版本。
现在,它的设置方式是这样的:有一个相机资产,通过代码作为捕获组件读取。屏幕快照中的三个视图链接到此捕获组件。无人机在游戏中飞来飞去时,视图流没有任何问题。但是,当涉及到记录屏幕截图时,当前代码从该捕获组件设置一个TextureRenderTargetResource,然后调用ReadPixels并将该数据保存为图像(请参见下面的代码流)。照原样使用ReadPixels()会直接阻止游戏线程,并使整个游戏速度大大降低:当我开始记录时,它从〜120 FPS降至不到10 FPS。
bool saveImage() {
USceneCaptureComponent2D* capture = getCaptureComponent(camera_type, true);
FTextureRenderTargetResource* RenderResource = capture->TextureTarget->GameThread_GetRenderTargetResource();
width = capture->TextureTarget->GetSurfaceWidth();
height = capture->TextureTarget->GetSurfaceHeight();
TArray<FColor> imageColor;
imageColor.AddUninitialized(width * height);
RenderResource->ReadPixels(bmp);
}
Run Code Online (Sandbox Code Playgroud)
看这篇文章,似乎很明显ReadPixels()将“阻塞游戏线程,直到渲染线程赶上”。本文包含用于读取像素的“非阻塞”方法的示例代码(通过移除FlushRenderingCommands()并使用RenderCommandFence标志来确定何时完成任务),但并不能显着提高性能:保存的图像稍高一些,但是游戏线程仍然只能以约20 FPS的速度运行,因此很难控制无人机。是否有任何更有效的异步方法可以实现我正在尝试的功能,例如在单独的线程中?我也对为什么代码在尽快将这些图像流式传输到屏幕上没有问题感到困惑,但是保存图像似乎更加复杂。它'
| 归档时间: |
|
| 查看次数: |
2634 次 |
| 最近记录: |