Сейчас я работаю над публикацией изображений, созданных в Unreal, в ROS, но теперь столкнулся со странными проблемами с производительностью.
Я использую Unreal 5.2 на Ubuntu 20 с Ryzen 5 5600X, RTX 3070 и 40 ГБ ОЗУ.
Мой метод сейчас выглядит так
void FROSOutputServer::PublishImage(ros::Publisher& ImagePublisher, TSharedPtr& SensorData){ TRACE_CPUPROFILER_EVENT_SCOPE(FROSOuputServer::PublishImage); FCameraData* CameraData = static_cast(SensorData.Get()); Sensor_msgs::ImagePtr ImgMsgPtr = boost::make_shared(); ros::Time TimeStamp; TimeStamp.fromSec(CameraData->Timestamp.ToDouble()); ImgMsgPtr->header.stamp = TimeStamp; ImgMsgPtr->header.frame_id = "тест"; ImgMsgPtr->step = CameraData->Width * 3; ImgMsgPtr->height = CameraData->Height; ImgMsgPtr->width = CameraData->Width; ImgMsgPtr->кодирование = "bgr8"; ImgMsgPtr->is_bigendian = 0; { TRACE_CPUPROFILER_EVENT_SCOPE(FROSOuputServer::PublishImage::Copy); ImgMsgPtr->data.resize(CameraData->ImageData.Num()); uint8* DestPtr = ImgMsgPtr->data.data(); uint8* SrcPtr = Данные камеры->Данные изображения.Получить данные(); FMemory::Memcpy(DestPtr, SrcPtr, CameraData->ImageData.Num()); } { TRACE_CPUPROFILER_EVENT_SCOPE(FROSOuputServer::PublishImage::Publish); ImagePublisher.publish(ImgMsgPtr); } // Только в целях отладки, это будет неявно вызываться деструктором общего указателя { TRACE_CPUPROFILER_EVENT_SCOPE(FROSOuputServer::PublishImage::FreeUnrealPtr); ДатчикДанные.Сброс(); } { TRACE_CPUPROFILER_EVENT_SCOPE(FROSOuputServer::PublishImage::FreeBoostPtr); ImgMsgPtr.reset(); } } С помощью этих структур данных Unreal:
struct FSensorDataBase { Utils::Time Timestamp; }; структура FCameraData: общедоступная FSensorDataBase { TArray ImageData; uint32 Ширина; uint32 Высота; }; В целях тестирования я создал изображение размером 1000x1000, в результате чего получился TArray размером 3 МБ.
Я ожидал, что современным процессорам потребуется очень мало времени для копирования таких «маленьких» объемов данных, но при профилировании я обнаружил очень плохие результаты. Для профилирования я использовал Unreal Insights. (См. макрос TRACE_CPUPROFILER_EVENT_SCOPE выше)

Таким образом, операция копирования занимает около 13,5 мс, а освобождение указателя повышения после его публикации занимает еще 20,8 мс. Общий указатель Unreals в этой области не освобождается.
Можно ли это как-то оптимизировать или я просто сталкиваюсь с ограничениями ЦП из-за накладных расходов Unreals?