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
30int EntityScriptServer::_entitiesScriptEngineCount = 0;30int EntityScriptServer::_entitiesScriptEngineCount = 0;
31 31
32EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssignment(message) {32EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssignment(message) {
33 _entityEditSender.setPacketsPerSecond(3000);
34 DependencyManager::get<EntityScriptingInterface>()->setPacketSender(&_entityEditSender);33 DependencyManager::get<EntityScriptingInterface>()->setPacketSender(&_entityEditSender);
35 34
36 ResourceManager::init();35 ResourceManager::init();
@@ -101,6 +100,52 @@ void EntityScriptServer::handleEntityScriptGetStatusPacket(QSharedPointer<Receiv · 64 unmodified lines
101 }100 }
102}101}
103 102
103void 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
134void 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
104void EntityScriptServer::run() {149void EntityScriptServer::run() {
105 // make sure we request our script once the agent connects to the domain150 // make sure we request our script once the agent connects to the domain
106 auto nodeList = DependencyManager::get<NodeList>();151 auto nodeList = DependencyManager::get<NodeList>();
@@ -115,6 +160,9 @@ void EntityScriptServer::run() { · 8 unmodified lines
115 connect(messagesThread, &QThread::started, messagesClient.data(), &MessagesClient::init);160 connect(messagesThread, &QThread::started, messagesClient.data(), &MessagesClient::init);
116 messagesThread->start();161 messagesThread->start();
117 162
163 DomainHandler& domainHandler = DependencyManager::get<NodeList>()->getDomainHandler();
164 connect(&domainHandler, &DomainHandler::settingsReceived, this, &EntityScriptServer::handleSettings);
165
118 // make sure we hear about connected nodes so we can grab an ATP script if a request is pending166 // make sure we hear about connected nodes so we can grab an ATP script if a request is pending
119 connect(nodeList.data(), &LimitedNodeList::nodeActivated, this, &EntityScriptServer::nodeActivated);167 connect(nodeList.data(), &LimitedNodeList::nodeActivated, this, &EntityScriptServer::nodeActivated);
120 connect(nodeList.data(), &LimitedNodeList::nodeKilled, this, &EntityScriptServer::nodeKilled);168 connect(nodeList.data(), &LimitedNodeList::nodeKilled, this, &EntityScriptServer::nodeKilled);
@@ -233,7 +281,9 @@ void EntityScriptServer::resetEntitiesScriptEngine() { · 112 unmodified lines
233 newEngine->runInThread();281 newEngine->runInThread();
234 DependencyManager::get<EntityScriptingInterface>()->setEntitiesScriptEngine(newEngine.data());282 DependencyManager::get<EntityScriptingInterface>()->setEntitiesScriptEngine(newEngine.data());
235 283
284 disconnect(_entitiesScriptEngine.data(), &ScriptEngine::entityScriptDetailsUpdated, this, &EntityScriptServer::updateEntityPPS);
236 _entitiesScriptEngine.swap(newEngine);285 _entitiesScriptEngine.swap(newEngine);
286 connect(_entitiesScriptEngine.data(), &ScriptEngine::entityScriptDetailsUpdated, this, &EntityScriptServer::updateEntityPPS);
237}287}
238 288
239 289