History

Add entity PPS per script configuration

Ryan Huffman committed 9 years ago

Commit f75eced1 parent 534d3c55 files · +106 −2Browse files

Showing the changes to assignment-client/src/scripts/EntityScriptServer.cpp (1 of 5 files). Show all

Unified · Split

assignment-client/src/scripts/EntityScriptServer.cpp+51−1
@@ -30,7 +30,6 @@ · 29 unmodified lines
3030 int EntityScriptServer::_entitiesScriptEngineCount = 0;
3131
3232 EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssignment(message) {
33− _entityEditSender.setPacketsPerSecond(3000);
3433 DependencyManager::get<EntityScriptingInterface>()->setPacketSender(&_entityEditSender);
3534
3635 ResourceManager::init();
@@ -101,6 +100,52 @@ void EntityScriptServer::handleEntityScriptGetStatusPacket(QSharedPointer<Receiv · 64 unmodified lines
101100 }
102101 }
103102
103+void EntityScriptServer::handleSettings() {
104+
105+ auto nodeList = DependencyManager::get<NodeList>();
106+
107+ auto& domainHandler = nodeList->getDomainHandler();
108+ const QJsonObject& settingsObject = domainHandler.getSettingsObject();
109+
110+ static const QString ENTITY_SCRIPT_SERVER_SETTINGS_KEY = "entity_script_server";
111+
112+ if (!settingsObject.contains(ENTITY_SCRIPT_SERVER_SETTINGS_KEY)) {
113+ qWarning() << "Received settings from the domain-server with no entity_script_server section.";
114+ return;
115+ }
116+
117+ auto entityScriptServerSettings = settingsObject[ENTITY_SCRIPT_SERVER_SETTINGS_KEY].toObject();
118+
119+ static const QString MAX_ENTITY_PPS_OPTION = "max_total_entity_pps";
120+ static const QString ENTITY_PPS_PER_SCRIPT = "entity_pps_per_script";
121+
122+ if (!entityScriptServerSettings.contains(MAX_ENTITY_PPS_OPTION) || !entityScriptServerSettings.contains(ENTITY_PPS_PER_SCRIPT)) {
123+ qWarning() << "Received settings from the domain-server with no max_total_entity_pps or entity_pps_per_script properties.";
124+ return;
125+ }
126+
127+ _maxEntityPPS = std::max(0, entityScriptServerSettings[MAX_ENTITY_PPS_OPTION].toInt());
128+ _entityPPSPerScript = std::max(0, entityScriptServerSettings[ENTITY_PPS_PER_SCRIPT].toInt());
129+
130+ qDebug() << QString("Received entity script server settings, Max Entity PPS: %1, Entity PPS Per Entity Script: %2")
131+ .arg(_maxEntityPPS).arg(_entityPPSPerScript);
132+}
133+
134+void EntityScriptServer::updateEntityPPS() {
135+ int numRunningScripts = _entitiesScriptEngine->getNumRunningEntityScripts();
136+ int pps;
137+ if (std::numeric_limits<int>::max() / _entityPPSPerScript < numRunningScripts) {
138+ qWarning() << QString("Integer multiplaction would overflow, clamping to maxint: %1 * %2").arg(numRunningScripts).arg(_entityPPSPerScript);
139+ pps = std::numeric_limits<int>::max();
140+ pps = std::min(_maxEntityPPS, pps);
141+ } else {
142+ pps = _entityPPSPerScript * numRunningScripts;
143+ pps = std::min(_maxEntityPPS, pps);
144+ }
145+ _entityEditSender.setPacketsPerSecond(pps);
146+ qDebug() << QString("Updating entity PPS to: %1 @ %2 PPS per script = %3 PPS").arg(numRunningScripts).arg(_entityPPSPerScript).arg(pps);
147+}
148+
104149 void EntityScriptServer::run() {
105150 // make sure we request our script once the agent connects to the domain
106151 auto nodeList = DependencyManager::get<NodeList>();
@@ -115,6 +160,9 @@ void EntityScriptServer::run() { · 8 unmodified lines
115160 connect(messagesThread, &QThread::started, messagesClient.data(), &MessagesClient::init);
116161 messagesThread->start();
117162
163+ DomainHandler& domainHandler = DependencyManager::get<NodeList>()->getDomainHandler();
164+ connect(&domainHandler, &DomainHandler::settingsReceived, this, &EntityScriptServer::handleSettings);
165+
118166 // make sure we hear about connected nodes so we can grab an ATP script if a request is pending
119167 connect(nodeList.data(), &LimitedNodeList::nodeActivated, this, &EntityScriptServer::nodeActivated);
120168 connect(nodeList.data(), &LimitedNodeList::nodeKilled, this, &EntityScriptServer::nodeKilled);
@@ -233,7 +281,9 @@ void EntityScriptServer::resetEntitiesScriptEngine() { · 112 unmodified lines
233281 newEngine->runInThread();
234282 DependencyManager::get<EntityScriptingInterface>()->setEntitiesScriptEngine(newEngine.data());
235283
284+ disconnect(_entitiesScriptEngine.data(), &ScriptEngine::entityScriptDetailsUpdated, this, &EntityScriptServer::updateEntityPPS);
236285 _entitiesScriptEngine.swap(newEngine);
286+ connect(_entitiesScriptEngine.data(), &ScriptEngine::entityScriptDetailsUpdated, this, &EntityScriptServer::updateEntityPPS);
237287 }
238288
239289