refs #386, performance issues

* keep split per callsign map in IInterpolator (so it is available for all interpolators)
* Interpolator using CWorker, so it can run in background
* added signals to provider to add split situations / callsigns
* adjustments to airspace / context for those signals
* thread safe access to those from interpolator
* renamed from rendered to remote aircraft as discussed
* adjust samples
* removed no longer required functions in timestampobjectlist
* changed connectioStatusChanged from uint -> int
This commit is contained in:
Klaus Basan
2015-02-20 03:14:49 +01:00
parent 1ff0cfa618
commit f8bebf5ffa
37 changed files with 835 additions and 583 deletions

View File

@@ -29,10 +29,11 @@ namespace BlackSimPlugin
namespace Fs9
{
CFs9Client::CFs9Client(
IRenderedAircraftProviderReadOnly *renderedAircraftProvider, QObject *owner, const QString &callsign, const CTime &updateInterval) :
BlackCore::IInterpolator *interpolator, QObject *owner, const QString &callsign, const CTime &updateInterval) :
CDirectPlayPeer(owner, callsign),
m_renderedAircraftProvider(renderedAircraftProvider), m_updateInterval(updateInterval)
{ }
m_interpolator(interpolator), m_updateInterval(updateInterval)
{
}
CFs9Client::~CFs9Client()
{
@@ -75,14 +76,14 @@ namespace BlackSimPlugin
void CFs9Client::timerEvent(QTimerEvent *event)
{
Q_UNUSED(event);
Q_ASSERT(m_interpolator);
if (m_clientStatus == Disconnected) { return; }
QMutexLocker locker(&m_mutexInterpolator);
CInterpolatorLinear interpolator(m_renderedAircraftProvider);
if (!interpolator.hasEnoughAircraftSituations(this->m_callsign)) { return; }
CAircraftSituation situation = interpolator.getCurrentInterpolatedSituation(m_callsign);
bool ok;
CAircraftSituation situation = this->m_interpolator->getCurrentInterpolatedSituation(this->m_interpolator->getSituationsByCallsign(), m_callsign, &ok);
if (!ok) { return; }
MPPositionSlewMode positionSlewMode = aircraftSituationToFS9(situation);
QByteArray positionMessage;

View File

@@ -11,7 +11,7 @@
#define DIRECTPLAY_CLIENT_H
#include "directplay_peer.h"
#include "blackcore/interpolator_linear.h"
#include "blackcore/interpolator.h"
#include "blackmisc/avaircraftsituation.h"
#include "blackmisc/pqtime.h"
#include <QMutex>
@@ -38,7 +38,7 @@ namespace BlackSimPlugin
};
//! Constructor
CFs9Client(BlackMisc::Simulation::IRenderedAircraftProviderReadOnly *renderedAircraftProvider, QObject *owner, const QString &callsign, const BlackMisc::PhysicalQuantities::CTime &updateInterval);
CFs9Client(BlackCore::IInterpolator *interpolator, QObject *owner, const QString &callsign, const BlackMisc::PhysicalQuantities::CTime &updateInterval);
//! Destructor
virtual ~CFs9Client();
@@ -85,10 +85,9 @@ namespace BlackSimPlugin
BlackMisc::Aviation::CAircraftSituation m_lastAircraftSituation;
BlackMisc::PhysicalQuantities::CTime m_updateInterval;
BlackCore::IInterpolator *m_interpolator = nullptr;
int m_timerId = 0;
QMutex m_mutexInterpolator;
BlackMisc::Simulation::IRenderedAircraftProviderReadOnly *m_renderedAircraftProvider = nullptr;
IDirectPlay8Address *m_hostAddress = nullptr;
ClientStatus m_clientStatus = Disconnected;

View File

@@ -14,6 +14,7 @@
#include "fs9_client.h"
#include "multiplayer_packets.h"
#include "multiplayer_packet_parser.h"
#include "blackcore/interpolator_linear.h"
#include "blacksim/simulatorinfo.h"
#include "blackmisc/project.h"
#include "blackmisc/logmessage.h"
@@ -38,11 +39,11 @@ namespace BlackSimPlugin
{
BlackCore::ISimulator *CSimulatorFs9Factory::create(
IOwnAircraftProvider *ownAircraftProvider,
IRenderedAircraftProvider *renderedAircraftProvider,
IRemoteAircraftProvider *remoteAircraftProvider,
QObject *parent)
{
registerMetadata();
return new Fs9::CSimulatorFs9(ownAircraftProvider, renderedAircraftProvider, parent);
return new Fs9::CSimulatorFs9(ownAircraftProvider, remoteAircraftProvider, parent);
}
BlackSim::CSimulatorInfo CSimulatorFs9Factory::getSimulatorInfo() const
@@ -50,13 +51,15 @@ namespace BlackSimPlugin
return CSimulatorInfo::FS9();
}
CSimulatorFs9::CSimulatorFs9(IOwnAircraftProvider *ownAircraftProvider, IRenderedAircraftProvider *renderedAircraftProvider, QObject *parent) :
CSimulatorFsCommon(CSimulatorInfo::FS9(), ownAircraftProvider, renderedAircraftProvider, parent),
CSimulatorFs9::CSimulatorFs9(IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *remoteAircraftProvider, QObject *parent) :
CSimulatorFsCommon(CSimulatorInfo::FS9(), ownAircraftProvider, remoteAircraftProvider, parent),
m_fs9Host(new CFs9Host(this)), m_lobbyClient(new CLobbyClient(this))
{
connect(m_fs9Host.data(), &CFs9Host::customPacketReceived, this, &CSimulatorFs9::ps_processFs9Message);
connect(m_fs9Host.data(), &CFs9Host::statusChanged, this, &CSimulatorFs9::ps_changeHostStatus);
m_fs9Host->start();
this->m_interpolator = new BlackCore::CInterpolatorLinear(remoteAircraftProvider, this);
this->m_interpolator->start();
}
CSimulatorFs9::~CSimulatorFs9()
@@ -104,22 +107,22 @@ namespace BlackSimPlugin
return true;
}
bool CSimulatorFs9::addRemoteAircraft(const CSimulatedAircraft &remoteAircraft)
bool CSimulatorFs9::addRemoteAircraft(const CSimulatedAircraft &newRemoteAircraft)
{
CCallsign callsign = remoteAircraft.getCallsign();
CCallsign callsign = newRemoteAircraft.getCallsign();
if (m_hashFs9Clients.contains(callsign))
{
// already exists, remove first
this->removeRenderedAircraft(callsign);
}
CFs9Client *client = new CFs9Client(this->m_renderedAircraftProvider, this, callsign.toQString(), CTime(25, CTimeUnit::ms()));
CFs9Client *client = new CFs9Client(m_interpolator, this, callsign.toQString(), CTime(25, CTimeUnit::ms()));
client->setHostAddress(m_fs9Host->getHostAddress());
client->setPlayerUserId(m_fs9Host->getPlayerUserId());
client->start();
m_hashFs9Clients.insert(callsign, client);
renderedAircraft().applyIfCallsign(callsign, CPropertyIndexVariantMap(CSimulatedAircraft::IndexRendered, CVariant::fromValue(true)));
remoteAircraft().applyIfCallsign(callsign, CPropertyIndexVariantMap(CSimulatedAircraft::IndexRendered, CVariant::fromValue(true)));
CLogMessage(this).info("FS9: Added aircraft %1") << callsign.toQString();
return true;
}
@@ -131,7 +134,7 @@ namespace BlackSimPlugin
auto fs9Client = m_hashFs9Clients.value(callsign);
fs9Client->quit();
m_hashFs9Clients.remove(callsign);
renderedAircraft().applyIfCallsign(callsign, CPropertyIndexVariantMap(CSimulatedAircraft::IndexRendered, CVariant::fromValue(false)));
remoteAircraft().applyIfCallsign(callsign, CPropertyIndexVariantMap(CSimulatedAircraft::IndexRendered, CVariant::fromValue(false)));
CLogMessage(this).info("FS9: Removed aircraft %1") << callsign.toQString();
return true;
}

View File

@@ -17,7 +17,7 @@
#include "lobby_client.h"
#include "../fscommon/simulator_fscommon.h"
#include "blackcore/simulator.h"
#include "blackcore/interpolator_linear.h"
#include "blackcore/interpolator.h"
#include "blackmisc/simulation/aircraftmodel.h"
#include "blackmisc/avaircraft.h"
#include "blacksim/simulatorinfo.h"
@@ -43,7 +43,7 @@ namespace BlackSimPlugin
//! \copydoc BlackCore::ISimulatorFactory::create()
virtual BlackCore::ISimulator *create(
BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider,
BlackMisc::Simulation::IRenderedAircraftProvider *renderedAircraftProvider,
BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider,
QObject *parent) override;
//! Simulator info
@@ -59,7 +59,7 @@ namespace BlackSimPlugin
//! Constructor, parameters as in \sa BlackCore::ISimulatorFactory::create
CSimulatorFs9(
BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider,
BlackMisc::Simulation::IRenderedAircraftProvider *renderedAircraft,
BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider,
QObject *parent = nullptr);
//! Destructor
@@ -86,7 +86,7 @@ namespace BlackSimPlugin
virtual bool disconnectFrom() override;
//! \copydoc ISimulator::addRemoteAircraft()
virtual bool addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft) override;
virtual bool addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &newRemoteAircraft) override;
//! \copydoc ISimulator::removeRemoteAircraft()
virtual bool removeRenderedAircraft(const BlackMisc::Aviation::CCallsign &callsign) override;
@@ -128,6 +128,8 @@ namespace BlackSimPlugin
bool m_startedLobbyConnection = false;
QHash<BlackMisc::Aviation::CCallsign, QPointer<CFs9Client>> m_hashFs9Clients;
CLobbyClient *m_lobbyClient;
BlackCore::IInterpolator *m_interpolator = nullptr; //!< interpolator instance
};
} // namespace
} // namespace