History

Basic network simulation for metavoxels.

Andrzej Kapolka committed 12 years ago

Commit 45fb31c1 parent b796e1b5 files · +132 −5Browse files

Showing the changes to interface/src/MetavoxelSystem.cpp (1 of 5 files). Show all

Unified · Split

interface/src/MetavoxelSystem.cpp+101−4
@@ -39,6 +39,13 @@ REGISTER_META_OBJECT(StaticModelRenderer) · 38 unmodified lines
3939
4040 static int bufferPointVectorMetaTypeId = qRegisterMetaType<BufferPointVector>();
4141
42+MetavoxelSystem::NetworkSimulation::NetworkSimulation(float dropRate, float repeatRate, int minimumDelay, int maximumDelay) :
43+ dropRate(dropRate),
44+ repeatRate(repeatRate),
45+ minimumDelay(minimumDelay),
46+ maximumDelay(maximumDelay) {
47+}
48+
4249 void MetavoxelSystem::init() {
4350 MetavoxelClientManager::init();
4451 DefaultMetavoxelRendererImplementation::init();
@@ -61,6 +68,16 @@ MetavoxelLOD MetavoxelSystem::getLOD() { · 16 unmodified lines
6168 return _lod;
6269 }
6370
71+void MetavoxelSystem::setNetworkSimulation(const NetworkSimulation& simulation) {
72+ QWriteLocker locker(&_networkSimulationLock);
73+ _networkSimulation = simulation;
74+}
75+
76+MetavoxelSystem::NetworkSimulation MetavoxelSystem::getNetworkSimulation() {
77+ QReadLocker locker(&_networkSimulationLock);
78+ return _networkSimulation;
79+}
80+
6481 class SimulateVisitor : public MetavoxelVisitor {
6582 public:
6683
@@ -692,10 +709,53 @@ MetavoxelData MetavoxelSystemClient::getAugmentedData() { · 625 unmodified lines
692709 return _augmentedData;
693710 }
694711
712+class ReceiveDelayer : public QObject {
713+public:
714+
715+ ReceiveDelayer(const SharedNodePointer& node, const QByteArray& packet);
716+
717+protected:
718+
719+ virtual void timerEvent(QTimerEvent* event);
720+
721+private:
722+
723+ SharedNodePointer _node;
724+ QByteArray _packet;
725+};
726+
727+ReceiveDelayer::ReceiveDelayer(const SharedNodePointer& node, const QByteArray& packet) :
728+ _node(node),
729+ _packet(packet) {
730+}
731+
732+void ReceiveDelayer::timerEvent(QTimerEvent* event) {
733+ QMutexLocker locker(&_node->getMutex());
734+ MetavoxelClient* client = static_cast<MetavoxelClient*>(_node->getLinkedData());
735+ if (client) {
736+ QMetaObject::invokeMethod(&client->getSequencer(), "receivedDatagram", Q_ARG(const QByteArray&, _packet));
737+ }
738+ deleteLater();
739+}
740+
695741 int MetavoxelSystemClient::parseData(const QByteArray& packet) {
696742 // process through sequencer
697− QMetaObject::invokeMethod(&_sequencer, "receivedDatagram", Q_ARG(const QByteArray&, packet));
698− Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::METAVOXELS).updateValue(packet.size());
743+ MetavoxelSystem::NetworkSimulation simulation = Application::getInstance()->getMetavoxels()->getNetworkSimulation();
744+ if (randFloat() < simulation.dropRate) {
745+ return packet.size();
746+ }
747+ int count = (randFloat() < simulation.repeatRate) ? 2 : 1;
748+ for (int i = 0; i < count; i++) {
749+ int delay = randIntInRange(simulation.minimumDelay, simulation.maximumDelay);
750+ if (delay > 0) {
751+ ReceiveDelayer* delayer = new ReceiveDelayer(_node, packet);
752+ delayer->startTimer(delay);
753+
754+ } else {
755+ QMetaObject::invokeMethod(&_sequencer, "receivedDatagram", Q_ARG(const QByteArray&, packet));
756+ }
757+ Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::METAVOXELS).updateValue(packet.size());
758+ }
699759 return packet.size();
700760 }
701761
@@ -774,9 +834,46 @@ void MetavoxelSystemClient::dataChanged(const MetavoxelData& oldData) { · 72 unmodified lines
774834 QThreadPool::globalInstance()->start(new Augmenter(_node, _data, getAugmentedData(), _remoteDataLOD));
775835 }
776836
837+class SendDelayer : public QObject {
838+public:
839+
840+ SendDelayer(const SharedNodePointer& node, const QByteArray& data);
841+
842+ virtual void timerEvent(QTimerEvent* event);
843+
844+private:
845+
846+ SharedNodePointer _node;
847+ QByteArray _data;
848+};
849+
850+SendDelayer::SendDelayer(const SharedNodePointer& node, const QByteArray& data) :
851+ _node(node),
852+ _data(data) {
853+}
854+
855+void SendDelayer::timerEvent(QTimerEvent* event) {
856+ NodeList::getInstance()->writeDatagram(_data, _node);
857+ deleteLater();
858+}
859+
777860 void MetavoxelSystemClient::sendDatagram(const QByteArray& data) {
778− NodeList::getInstance()->writeDatagram(data, _node);
779− Application::getInstance()->getBandwidthMeter()->outputStream(BandwidthMeter::METAVOXELS).updateValue(data.size());
861+ MetavoxelSystem::NetworkSimulation simulation = Application::getInstance()->getMetavoxels()->getNetworkSimulation();
862+ if (randFloat() < simulation.dropRate) {
863+ return;
864+ }
865+ int count = (randFloat() < simulation.repeatRate) ? 2 : 1;
866+ for (int i = 0; i < count; i++) {
867+ int delay = randIntInRange(simulation.minimumDelay, simulation.maximumDelay);
868+ if (delay > 0) {
869+ SendDelayer* delayer = new SendDelayer(_node, data);
870+ delayer->startTimer(delay);
871+
872+ } else {
873+ NodeList::getInstance()->writeDatagram(data, _node);
874+ }
875+ Application::getInstance()->getBandwidthMeter()->outputStream(BandwidthMeter::METAVOXELS).updateValue(data.size());
876+ }
780877 }
781878
782879 BufferData::~BufferData() {