mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 07:10:06 +02:00
first cut at using wait signals to improve RPC timing
This commit is contained in:
parent
1fcfc9444b
commit
7c7d239e00
4 changed files with 42 additions and 1 deletions
|
@ -573,6 +573,7 @@ void ScriptEngine::registerValue(const QString& valueName, QScriptValue value) {
|
||||||
QMetaObject::invokeMethod(this, "registerValue",
|
QMetaObject::invokeMethod(this, "registerValue",
|
||||||
Q_ARG(const QString&, valueName),
|
Q_ARG(const QString&, valueName),
|
||||||
Q_ARG(QScriptValue, value));
|
Q_ARG(QScriptValue, value));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -603,6 +604,7 @@ void ScriptEngine::registerGlobalObject(const QString& name, QObject* object) {
|
||||||
QMetaObject::invokeMethod(this, "registerGlobalObject",
|
QMetaObject::invokeMethod(this, "registerGlobalObject",
|
||||||
Q_ARG(const QString&, name),
|
Q_ARG(const QString&, name),
|
||||||
Q_ARG(QObject*, object));
|
Q_ARG(QObject*, object));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef THREAD_DEBUGGING
|
#ifdef THREAD_DEBUGGING
|
||||||
|
@ -628,6 +630,7 @@ void ScriptEngine::registerFunction(const QString& name, QScriptEngine::Function
|
||||||
Q_ARG(const QString&, name),
|
Q_ARG(const QString&, name),
|
||||||
Q_ARG(QScriptEngine::FunctionSignature, functionSignature),
|
Q_ARG(QScriptEngine::FunctionSignature, functionSignature),
|
||||||
Q_ARG(int, numArguments));
|
Q_ARG(int, numArguments));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef THREAD_DEBUGGING
|
#ifdef THREAD_DEBUGGING
|
||||||
|
@ -647,6 +650,7 @@ void ScriptEngine::registerFunction(const QString& parent, const QString& name,
|
||||||
Q_ARG(const QString&, name),
|
Q_ARG(const QString&, name),
|
||||||
Q_ARG(QScriptEngine::FunctionSignature, functionSignature),
|
Q_ARG(QScriptEngine::FunctionSignature, functionSignature),
|
||||||
Q_ARG(int, numArguments));
|
Q_ARG(int, numArguments));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef THREAD_DEBUGGING
|
#ifdef THREAD_DEBUGGING
|
||||||
|
@ -672,6 +676,7 @@ void ScriptEngine::registerGetterSetter(const QString& name, QScriptEngine::Func
|
||||||
Q_ARG(QScriptEngine::FunctionSignature, getter),
|
Q_ARG(QScriptEngine::FunctionSignature, getter),
|
||||||
Q_ARG(QScriptEngine::FunctionSignature, setter),
|
Q_ARG(QScriptEngine::FunctionSignature, setter),
|
||||||
Q_ARG(const QString&, parent));
|
Q_ARG(const QString&, parent));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef THREAD_DEBUGGING
|
#ifdef THREAD_DEBUGGING
|
||||||
|
@ -704,6 +709,7 @@ void ScriptEngine::removeEventHandler(const EntityItemID& entityID, const QStrin
|
||||||
Q_ARG(const EntityItemID&, entityID),
|
Q_ARG(const EntityItemID&, entityID),
|
||||||
Q_ARG(const QString&, eventName),
|
Q_ARG(const QString&, eventName),
|
||||||
Q_ARG(QScriptValue, handler));
|
Q_ARG(QScriptValue, handler));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef THREAD_DEBUGGING
|
#ifdef THREAD_DEBUGGING
|
||||||
|
@ -735,6 +741,7 @@ void ScriptEngine::addEventHandler(const EntityItemID& entityID, const QString&
|
||||||
Q_ARG(const EntityItemID&, entityID),
|
Q_ARG(const EntityItemID&, entityID),
|
||||||
Q_ARG(const QString&, eventName),
|
Q_ARG(const QString&, eventName),
|
||||||
Q_ARG(QScriptValue, handler));
|
Q_ARG(QScriptValue, handler));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef THREAD_DEBUGGING
|
#ifdef THREAD_DEBUGGING
|
||||||
|
@ -821,6 +828,7 @@ QScriptValue ScriptEngine::evaluate(const QString& sourceCode, const QString& fi
|
||||||
Q_ARG(const QString&, sourceCode),
|
Q_ARG(const QString&, sourceCode),
|
||||||
Q_ARG(const QString&, fileName),
|
Q_ARG(const QString&, fileName),
|
||||||
Q_ARG(int, lineNumber));
|
Q_ARG(int, lineNumber));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -920,7 +928,25 @@ void ScriptEngine::run() {
|
||||||
auto remainingSleepUntil = std::chrono::duration_cast<std::chrono::microseconds>(sleepUntil - clock::now());
|
auto remainingSleepUntil = std::chrono::duration_cast<std::chrono::microseconds>(sleepUntil - clock::now());
|
||||||
auto closestUntil = std::min(remainingSleepUntil, untilTimer);
|
auto closestUntil = std::min(remainingSleepUntil, untilTimer);
|
||||||
auto thisSleepUntil = std::min(sleepUntil, clock::now() + closestUntil);
|
auto thisSleepUntil = std::min(sleepUntil, clock::now() + closestUntil);
|
||||||
std::this_thread::sleep_until(thisSleepUntil);
|
|
||||||
|
// if the sleep until is more than 1 ms away, then don't sleep, and instead use a wait condition
|
||||||
|
// for any possible invoke methods that might also be pending.
|
||||||
|
const std::chrono::microseconds MAX_USECS_TO_SLEEP(USECS_PER_MSEC);
|
||||||
|
if (closestUntil < MAX_USECS_TO_SLEEP) {
|
||||||
|
qDebug() << "about to sleep:" << closestUntil.count() << "usec";
|
||||||
|
std::this_thread::sleep_until(thisSleepUntil);
|
||||||
|
} else {
|
||||||
|
// FIXME - we might want to make this 1 less ms to wait
|
||||||
|
unsigned long maxWait = closestUntil.count() / USECS_PER_MSEC;
|
||||||
|
qDebug() << "about to wait:" << maxWait << "ms --- closestUntil:" << closestUntil.count() << "usec";
|
||||||
|
_waitingOnInvokeMethod.lock();
|
||||||
|
bool signalled = _hasInvokeMethod.wait(&_waitingOnInvokeMethod, maxWait);
|
||||||
|
_waitingOnInvokeMethod.unlock();
|
||||||
|
if (signalled) {
|
||||||
|
qDebug() << "SIGNALLED!! done waiting... now:" << usecTimestampNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SCRIPT_DELAY_DEBUG
|
#ifdef SCRIPT_DELAY_DEBUG
|
||||||
|
@ -1058,6 +1084,7 @@ void ScriptEngine::stop(bool marshal) {
|
||||||
|
|
||||||
if (marshal) {
|
if (marshal) {
|
||||||
QMetaObject::invokeMethod(this, "stop");
|
QMetaObject::invokeMethod(this, "stop");
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!_isFinished) {
|
if (!_isFinished) {
|
||||||
|
@ -1078,6 +1105,7 @@ void ScriptEngine::callAnimationStateHandler(QScriptValue callback, AnimVariantM
|
||||||
Q_ARG(QStringList, names),
|
Q_ARG(QStringList, names),
|
||||||
Q_ARG(bool, useNames),
|
Q_ARG(bool, useNames),
|
||||||
Q_ARG(AnimVariantResultHandler, resultHandler));
|
Q_ARG(AnimVariantResultHandler, resultHandler));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QScriptValue javascriptParameters = parameters.animVariantMapToScriptValue(this, names, useNames);
|
QScriptValue javascriptParameters = parameters.animVariantMapToScriptValue(this, names, useNames);
|
||||||
|
@ -1428,6 +1456,7 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co
|
||||||
Q_ARG(const QString&, contents),
|
Q_ARG(const QString&, contents),
|
||||||
Q_ARG(bool, isURL),
|
Q_ARG(bool, isURL),
|
||||||
Q_ARG(bool, success));
|
Q_ARG(bool, success));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1526,6 +1555,7 @@ void ScriptEngine::unloadEntityScript(const EntityItemID& entityID) {
|
||||||
|
|
||||||
QMetaObject::invokeMethod(this, "unloadEntityScript",
|
QMetaObject::invokeMethod(this, "unloadEntityScript",
|
||||||
Q_ARG(const EntityItemID&, entityID));
|
Q_ARG(const EntityItemID&, entityID));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef THREAD_DEBUGGING
|
#ifdef THREAD_DEBUGGING
|
||||||
|
@ -1547,6 +1577,7 @@ void ScriptEngine::unloadAllEntityScripts() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QMetaObject::invokeMethod(this, "unloadAllEntityScripts");
|
QMetaObject::invokeMethod(this, "unloadAllEntityScripts");
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef THREAD_DEBUGGING
|
#ifdef THREAD_DEBUGGING
|
||||||
|
@ -1639,10 +1670,13 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS
|
||||||
"entityID:" << entityID << "methodName:" << methodName;
|
"entityID:" << entityID << "methodName:" << methodName;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
qDebug() << "about to invokeMethod callEntityScriptMethod() now:" << usecTimestampNow();
|
||||||
|
|
||||||
QMetaObject::invokeMethod(this, "callEntityScriptMethod",
|
QMetaObject::invokeMethod(this, "callEntityScriptMethod",
|
||||||
Q_ARG(const EntityItemID&, entityID),
|
Q_ARG(const EntityItemID&, entityID),
|
||||||
Q_ARG(const QString&, methodName),
|
Q_ARG(const QString&, methodName),
|
||||||
Q_ARG(const QStringList&, params));
|
Q_ARG(const QStringList&, params));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef THREAD_DEBUGGING
|
#ifdef THREAD_DEBUGGING
|
||||||
|
@ -1675,6 +1709,7 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS
|
||||||
Q_ARG(const EntityItemID&, entityID),
|
Q_ARG(const EntityItemID&, entityID),
|
||||||
Q_ARG(const QString&, methodName),
|
Q_ARG(const QString&, methodName),
|
||||||
Q_ARG(const PointerEvent&, event));
|
Q_ARG(const PointerEvent&, event));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef THREAD_DEBUGGING
|
#ifdef THREAD_DEBUGGING
|
||||||
|
@ -1708,6 +1743,7 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS
|
||||||
Q_ARG(const QString&, methodName),
|
Q_ARG(const QString&, methodName),
|
||||||
Q_ARG(const EntityItemID&, otherID),
|
Q_ARG(const EntityItemID&, otherID),
|
||||||
Q_ARG(const Collision&, collision));
|
Q_ARG(const Collision&, collision));
|
||||||
|
_hasInvokeMethod.wakeAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef THREAD_DEBUGGING
|
#ifdef THREAD_DEBUGGING
|
||||||
|
|
|
@ -217,6 +217,9 @@ protected:
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
|
QWaitCondition _hasInvokeMethod;
|
||||||
|
QMutex _waitingOnInvokeMethod;
|
||||||
|
|
||||||
bool evaluatePending() const { return _evaluatesPending > 0; }
|
bool evaluatePending() const { return _evaluatesPending > 0; }
|
||||||
quint64 getTimersRemainingTime();
|
quint64 getTimersRemainingTime();
|
||||||
void timerFired();
|
void timerFired();
|
||||||
|
|
|
@ -2141,6 +2141,7 @@ function MyController(hand) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.nearGrabbing = function(deltaTime, timestamp) {
|
this.nearGrabbing = function(deltaTime, timestamp) {
|
||||||
|
print("nearGrabbing() deltaTime:" + deltaTime);
|
||||||
|
|
||||||
this.grabPointSphereOff();
|
this.grabPointSphereOff();
|
||||||
|
|
||||||
|
|
|
@ -154,6 +154,7 @@
|
||||||
},
|
},
|
||||||
continueEquip: function(entityID, args) {
|
continueEquip: function(entityID, args) {
|
||||||
this.deltaTime = checkInterval();
|
this.deltaTime = checkInterval();
|
||||||
|
print("continueEquip delta:" + this.deltaTime);
|
||||||
//debounce during debugging -- maybe we're updating too fast?
|
//debounce during debugging -- maybe we're updating too fast?
|
||||||
if (USE_DEBOUNCE === true) {
|
if (USE_DEBOUNCE === true) {
|
||||||
this.sinceLastUpdate = this.sinceLastUpdate + this.deltaTime;
|
this.sinceLastUpdate = this.sinceLastUpdate + this.deltaTime;
|
||||||
|
|
Loading…
Reference in a new issue