첨부 된 카메라에서 이미지를 캡처하고 저장하려고하는 Unreal 기반 오픈 소스 UAV 시뮬레이션 (Microsoft AirSim)을 작업 중입니다. 무인 항공기. 아래 이미지는 게임이 어떻게 보이는지에 대한 아이디어를 제공합니다. 아래쪽의 가장 오른쪽 뷰는 카메라의 실제 뷰이며 다른 두 개는 동일한 이미지의 방금 처리 된 버전입니다. 지금Unreal Engine : 게임 스레드를 차단하지 않고 게임 이미지를 디스크에 액세스/저장
는 IT가 이런 식으로 설정하는 것 방법 : 캡처 구성 요소와 코드를 읽을 수있는 카메라 자산이있다. 스크린 샷의 세 가지보기는이 캡처 구성 요소에 연결됩니다. 드론이 게임 내에서 비행 할 때 아무런 문제없이 뷰가 스트리밍됩니다. 그러나 스크린 샷을 녹화 할 때 현재 코드는이 캡처 구성 요소에서 TextureRenderTargetResource를 설정하고 ReadPixels를 호출하고 해당 데이터를 이미지로 저장합니다 (코드 흐름은 아래 참조). ReadPixels()을 그대로 사용하면 게임 스레드를 직접 차단하고 게임 전체를 느리게 처리합니다. 녹화를 시작할 때 ~ 120FPS에서 10FPS 미만으로 떨어집니다. this article에서
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);
}
보면, ReadPixels는() "렌더링 스레드가 잡았 때까지 게임 스레드를 차단합니다"고 분명하게 보인다. 이 기사에는 FlushRenderingCommands()를 제거하고 RenderCommandFence 플래그를 사용하여 작업 완료 시점을 결정하는 픽셀을 읽는 '비 차단'방법에 대한 샘플 코드가 포함되어 있지만 성능이 크게 향상되지는 않습니다. 이미지가 저장되는 위치는 약간 높지만 게임 스레드는 여전히 약 20FPS에서 실행되므로 UAV를 제어하기가 정말 어렵습니다. 별도의 스레드에서 내가하려고하는 것을 달성 할 수있는 더 효율적인 비동기 메서드가 있습니까? 또한 코드가 가능한 빨리 이미지를 스트리밍하는 데 문제가없는 이유에 대해 조금 혼란 스럽지만 이미지를 저장하는 것이 더 복잡해 보입니다. 게임의 기본 FPS를 너무 많이 방해하지 않는 한 이미지가 디스크에 15 Hz 정도만 저장되는 경우에도 문제가 없습니다.
"픽셀 데이터를 조작하는 대신 드론 카메라에서 스크린 샷을 찍는 모습을 보겠습니다."에 대해 더 자세히 설명해주십시오. 캡처 한 이미지 데이터를 끌어낼 수있는 유일한 방법은 ReadPixels() 명령을 사용하는 것입니다. 그리고 지금은 압축 된 PNG 파일을 작성하고 있습니다. 만약 내가 TArray에 그것들을 저장한다면, 나는 그것을 분리 된 실에서 제안 할 것이라고 추측하고 있나? – HighVoltage
방금 내 생각에 내 게시물에 다른 아이디어를 추가했습니다 :) 플레이어 카메라에서 스크린 샷을 찍으려면 콘솔 명령을 호출 할 수 있습니다. 아마도 당신은 그 명령의 근원을 발견 할 수 있었고, 다른 소스 카메라를주는 방법을 발견했을 것입니다. screenshot 명령은 파일을 저장한다고 생각합니다. 죄송합니다, 렌더링은 내 전문 분야가 아닙니다. 여기서 문제는 개별 이미지를 찍는 것이 아니라 비디오를 녹화한다는 것입니다. 제 3 자 미디어 라이브러리를 추가하는 방법을 살펴보십시오. – JonS
나는 또한 게임이 끝난 후에도 이미지를 저장하면 아무런 fps도 떨어지지 않을 것이라고 생각합니다. 원하는 게 있다면, 언리얼의 캡처 기능을 시도해보십시오. https://docs.unrealengine.com/latest/INT/ Engine/Basics/Screenshots /를 사용하면 그림 자체를 저장하고 이미 수행 한 것보다 빠릅니다. – LumbusterTick