背景: 我们在录制Unreal Insights时为了方便查看性能热点时候正在做什么,开了一个后台线程在定时截屏并传输数据给insights存储到Screenshot Channel里。但是最近注意到这样生成的utrace文件体积增长的非常快,很不利于存储的和分发,调查了一下原因。
TraceScreenshot接口
FTraceScreenshot::TraceScreenshot
接受一个未压缩过的TArray<FColor>
或者TArray<FLinearColor>
作为原始数据,内部会根据数据类型选择不同的压缩格式。
- FColor: PNG
- FLinearColor: exr
默认情况下FColor是压缩成PNG,压缩效率有点低,一张1280x720
的数据要增长1M多。
void ImageUtilsCompressImageArrayWrapper(int32 ImageWidth, int32 ImageHeight, const TArrayView64<const FColor>& SrcData, TArray64<uint8>& DstData)
{
FImageUtils::PNGCompressImageArray(ImageWidth, ImageHeight, SrcData, DstData);
}
这里可以改一下,改成JPG。
UnrealInsights程序在解码utrace里编码的图片数据时,会调用DecompressImage
函数来解码Blob数据。这个函数里面会根据每个格式的Magic Header来探测图片格式,再解码。
不同图片格式的Magic Header
可以在以下链接找到。
因此只要是虚幻ImageWrapper
模块支持的格式都可以被encode
到utrace里。
调整格式以后再下调了一点分辨率,这样一张截图只增长70k左右的空间,基本不会造成太大的影响了。