Fixing first ticks of a sensor (#5616)

* Stream is removed when the sensor is destroyed

* Changing log_info to log_debug

* changeslog

* Changes to return some non-const objects

* Changing from weak_ptr to shared_ptr for storing sessions

* Split long line

* Changing log priority of some messages

* Make sure sensor is active when an user wants to use it (before it connects to it)

* Change UE tasks to any task, and not from Game thread
This commit is contained in:
bernat 2022-07-25 15:32:29 +02:00 committed by GitHub
parent 5c4b37c710
commit 078cf0f824
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 17 additions and 4 deletions

View File

@ -110,6 +110,7 @@ namespace detail {
if (search != _stream_map.end()) {
log_debug("Found sensor id: ", sensor_id);
auto stream_state = search->second;
stream_state->ForceActive();
log_debug("Getting token from stream ", sensor_id, " on port ", stream_state->token().get_port());
return stream_state->token();
} else {
@ -118,6 +119,7 @@ namespace detail {
temp_token.set_stream_id(sensor_id);
auto ptr = std::make_shared<MultiStreamState>(temp_token);
auto result = _stream_map.emplace(std::make_pair(temp_token.get_stream_id(), ptr));
ptr->ForceActive();
if (!result.second) {
log_debug("Failed to create multistream for stream ", sensor_id, " on port ", temp_token.get_port());
}

View File

@ -58,8 +58,12 @@ namespace detail {
}
}
void ForceActive() {
_force_active = true;
}
bool AreClientsListening() {
return (_sessions.size() > 0);
return (_sessions.size() > 0 || _force_active);
}
void ConnectSession(std::shared_ptr<Session> session) final {
@ -84,6 +88,7 @@ namespace detail {
DEBUG_ASSERT(session == _session.load());
_session.store(nullptr);
_sessions.clear();
_force_active = false;
log_warning("Last session disconnected");
} else {
_sessions.erase(
@ -107,6 +112,7 @@ namespace detail {
}
}
_sessions.clear();
_force_active = false;
_session.store(nullptr);
log_debug("Disconnecting all multistream sessions");
}
@ -119,6 +125,7 @@ namespace detail {
AtomicSharedPtr<Session> _session;
// if there are more than one session, we use vector of sessions with mutex
std::vector<std::shared_ptr<Session>> _sessions;
bool _force_active {false};
};
} // namespace detail

View File

@ -24,6 +24,7 @@
#include <mutex>
class UCarlaSettings;
class FFrameData;
struct FEpisodeSettings;
class FCarlaEngine : private NonCopyable

View File

@ -66,7 +66,7 @@ public:
{
if (HeaderStr->frame != FrameNumber)
{
carla::log_info("Re-framing stream ", HeaderStr->sensor_type, " from ", HeaderStr->frame, " to ", FrameNumber);
carla::log_debug("Re-framing sensor type ", HeaderStr->sensor_type, " from ", HeaderStr->frame, " to ", FrameNumber);
HeaderStr->frame = FrameNumber;
}
}

View File

@ -76,7 +76,7 @@ void FPixelReader::WritePixelsToBuffer(
RHICmdList.GetRenderQueryResult(Query, OldAbsTime, true);
}
AsyncTask(ENamedThreads::GameThread, [=, Readback=std::move(BackBufferReadback)]() mutable {
AsyncTask(ENamedThreads::AnyNormalThreadNormalTask, [=, Readback=std::move(BackBufferReadback)]() mutable {
{
TRACE_CPUPROFILER_EVENT_SCOPE_STR("Wait GPU transfer");
while (!Readback->IsReady())

View File

@ -10,6 +10,8 @@
#include "Engine/TextureRenderTarget2D.h"
#include "Runtime/ImageWriteQueue/Public/ImagePixelData.h"
#include "Carla/Game/CarlaEngine.h"
#include <compiler/disable-ue4-macros.h>
#include <carla/Logging.h>
#include <carla/Buffer.h>
@ -111,7 +113,7 @@ void FPixelReader::SendPixelsInRenderThread(TSensor &Sensor, bool use16BitFormat
if (!Sensor.IsPendingKill())
{
FPixelReader::Payload FuncForSending =
[&Sensor, Conversor = std::move(Conversor)](void *LockedData, uint32 Size, uint32 Offset)
[&Sensor, Frame = FCarlaEngine::GetFrameCounter(), Conversor = std::move(Conversor)](void *LockedData, uint32 Size, uint32 Offset)
{
if (Sensor.IsPendingKill()) return;
@ -127,6 +129,7 @@ void FPixelReader::SendPixelsInRenderThread(TSensor &Sensor, bool use16BitFormat
}
auto Stream = Sensor.GetDataStream(Sensor);
Stream.SetFrameNumber(Frame);
auto Buffer = Stream.PopBufferFromPool();
{