diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index edace784ad..2a8dcf5b78 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -178,6 +178,8 @@ EntityItemProperties convertLocationFromScriptSemantics(const EntityItemProperti QUuid EntityScriptingInterface::addEntity(const EntityItemProperties& properties, bool clientOnly) { + PROFILE_RANGE(script_entities, __FUNCTION__); + _activityTracking.addedEntityCount++; EntityItemProperties propertiesWithSimID = convertLocationFromScriptSemantics(properties); @@ -270,6 +272,8 @@ EntityItemProperties EntityScriptingInterface::getEntityProperties(QUuid identit } EntityItemProperties EntityScriptingInterface::getEntityProperties(QUuid identity, EntityPropertyFlags desiredProperties) { + PROFILE_RANGE(script_entities, __FUNCTION__); + EntityItemProperties results; if (_entityTree) { _entityTree->withReadLock([&] { @@ -316,6 +320,8 @@ EntityItemProperties EntityScriptingInterface::getEntityProperties(QUuid identit } QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& scriptSideProperties) { + PROFILE_RANGE(script_entities, __FUNCTION__); + _activityTracking.editedEntityCount++; EntityItemProperties properties = scriptSideProperties; @@ -467,6 +473,8 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& } void EntityScriptingInterface::deleteEntity(QUuid id) { + PROFILE_RANGE(script_entities, __FUNCTION__); + _activityTracking.deletedEntityCount++; EntityItemID entityID(id); @@ -522,6 +530,8 @@ void EntityScriptingInterface::setEntitiesScriptEngine(EntitiesScriptEngineProvi } void EntityScriptingInterface::callEntityMethod(QUuid id, const QString& method, const QStringList& params) { + PROFILE_RANGE(script_entities, __FUNCTION__); + std::lock_guard lock(_entitiesScriptEngineLock); if (_entitiesScriptEngine) { EntityItemID entityID{ id }; @@ -530,6 +540,8 @@ void EntityScriptingInterface::callEntityMethod(QUuid id, const QString& method, } QUuid EntityScriptingInterface::findClosestEntity(const glm::vec3& center, float radius) const { + PROFILE_RANGE(script_entities, __FUNCTION__); + EntityItemID result; if (_entityTree) { EntityItemPointer closestEntity; @@ -553,6 +565,8 @@ void EntityScriptingInterface::dumpTree() const { } QVector EntityScriptingInterface::findEntities(const glm::vec3& center, float radius) const { + PROFILE_RANGE(script_entities, __FUNCTION__); + QVector result; if (_entityTree) { QVector entities; @@ -568,6 +582,8 @@ QVector EntityScriptingInterface::findEntities(const glm::vec3& center, f } QVector EntityScriptingInterface::findEntitiesInBox(const glm::vec3& corner, const glm::vec3& dimensions) const { + PROFILE_RANGE(script_entities, __FUNCTION__); + QVector result; if (_entityTree) { QVector entities; @@ -584,6 +600,8 @@ QVector EntityScriptingInterface::findEntitiesInBox(const glm::vec3& corn } QVector EntityScriptingInterface::findEntitiesInFrustum(QVariantMap frustum) const { + PROFILE_RANGE(script_entities, __FUNCTION__); + QVector result; const QString POSITION_PROPERTY = "position"; @@ -627,6 +645,7 @@ QVector EntityScriptingInterface::findEntitiesInFrustum(QVariantMap frust RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersection(const PickRay& ray, bool precisionPicking, const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) { + PROFILE_RANGE(script_entities, __FUNCTION__); QVector entitiesToInclude = qVectorEntityItemIDFromScriptValue(entityIdsToInclude); QVector entitiesToDiscard = qVectorEntityItemIDFromScriptValue(entityIdsToDiscard); @@ -734,6 +753,8 @@ RayToEntityIntersectionResult::RayToEntityIntersectionResult() : } QScriptValue RayToEntityIntersectionResultToScriptValue(QScriptEngine* engine, const RayToEntityIntersectionResult& value) { + PROFILE_RANGE(script_entities, __FUNCTION__); + QScriptValue obj = engine->newObject(); obj.setProperty("intersects", value.intersects); obj.setProperty("accurate", value.accurate); @@ -781,6 +802,8 @@ QScriptValue RayToEntityIntersectionResultToScriptValue(QScriptEngine* engine, c } void RayToEntityIntersectionResultFromScriptValue(const QScriptValue& object, RayToEntityIntersectionResult& value) { + PROFILE_RANGE(script_entities, __FUNCTION__); + value.intersects = object.property("intersects").toVariant().toBool(); value.accurate = object.property("accurate").toVariant().toBool(); QScriptValue entityIDValue = object.property("entityID"); @@ -818,6 +841,8 @@ void RayToEntityIntersectionResultFromScriptValue(const QScriptValue& object, Ra bool EntityScriptingInterface::setVoxels(QUuid entityID, std::function actor) { + PROFILE_RANGE(script_entities, __FUNCTION__); + if (!_entityTree) { return false; } @@ -842,6 +867,8 @@ bool EntityScriptingInterface::setVoxels(QUuid entityID, } bool EntityScriptingInterface::setPoints(QUuid entityID, std::function actor) { + PROFILE_RANGE(script_entities, __FUNCTION__); + if (!_entityTree) { return false; } @@ -881,18 +908,24 @@ bool EntityScriptingInterface::setPoints(QUuid entityID, std::function& points) { + PROFILE_RANGE(script_entities, __FUNCTION__); + EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); if (!entity) { qCDebug(entities) << "EntityScriptingInterface::setPoints no entity with ID" << entityID; @@ -924,6 +961,8 @@ bool EntityScriptingInterface::setAllPoints(QUuid entityID, const QVector(_entityTree->findEntityByEntityItemID(entityID)); if (!entity) { qCDebug(entities) << "EntityScriptingInterface::setPoints no entity with ID" << entityID; @@ -999,6 +1038,8 @@ bool EntityScriptingInterface::actionWorker(const QUuid& entityID, QUuid EntityScriptingInterface::addAction(const QString& actionTypeString, const QUuid& entityID, const QVariantMap& arguments) { + PROFILE_RANGE(script_entities, __FUNCTION__); + QUuid actionID = QUuid::createUuid(); auto actionFactory = DependencyManager::get(); bool success = false; @@ -1030,6 +1071,8 @@ QUuid EntityScriptingInterface::addAction(const QString& actionTypeString, bool EntityScriptingInterface::updateAction(const QUuid& entityID, const QUuid& actionID, const QVariantMap& arguments) { + PROFILE_RANGE(script_entities, __FUNCTION__); + return actionWorker(entityID, [&](EntitySimulationPointer simulation, EntityItemPointer entity) { bool success = entity->updateAction(simulation, actionID, arguments); if (success) { @@ -1040,6 +1083,8 @@ bool EntityScriptingInterface::updateAction(const QUuid& entityID, const QUuid& } bool EntityScriptingInterface::deleteAction(const QUuid& entityID, const QUuid& actionID) { + PROFILE_RANGE(script_entities, __FUNCTION__); + bool success = false; actionWorker(entityID, [&](EntitySimulationPointer simulation, EntityItemPointer entity) { success = entity->removeAction(simulation, actionID); @@ -1053,6 +1098,8 @@ bool EntityScriptingInterface::deleteAction(const QUuid& entityID, const QUuid& } QVector EntityScriptingInterface::getActionIDs(const QUuid& entityID) { + PROFILE_RANGE(script_entities, __FUNCTION__); + QVector result; actionWorker(entityID, [&](EntitySimulationPointer simulation, EntityItemPointer entity) { QList actionIDs = entity->getActionIDs(); @@ -1063,6 +1110,8 @@ QVector EntityScriptingInterface::getActionIDs(const QUuid& entityID) { } QVariantMap EntityScriptingInterface::getActionArguments(const QUuid& entityID, const QUuid& actionID) { + PROFILE_RANGE(script_entities, __FUNCTION__); + QVariantMap result; actionWorker(entityID, [&](EntitySimulationPointer simulation, EntityItemPointer entity) { result = entity->getActionArguments(actionID); diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 7f5931b1e7..ec83ea2ba9 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -64,6 +64,8 @@ #include "ScriptEngines.h" #include "TabletScriptingInterface.h" +#include + #include "MIDIEvent.h" static const QString SCRIPT_EXCEPTION_FORMAT = "[UncaughtException] %1 in %2:%3"; @@ -927,7 +929,10 @@ void ScriptEngine::run() { bool processedEvents = false; while (!_isFinished && clock::now() < sleepUntil) { - QCoreApplication::processEvents(); // before we sleep again, give events a chance to process + { + PROFILE_RANGE(script, "processEvents-sleep"); + QCoreApplication::processEvents(); // before we sleep again, give events a chance to process + } processedEvents = true; // If after processing events, we're past due, exit asap @@ -942,6 +947,8 @@ void ScriptEngine::run() { std::this_thread::sleep_until(smallSleepUntil); } + PROFILE_RANGE(script, "ScriptMainLoop"); + #ifdef SCRIPT_DELAY_DEBUG { auto actuallySleptUntil = clock::now(); @@ -965,6 +972,7 @@ void ScriptEngine::run() { // Only call this if we didn't processEvents as part of waiting for next frame if (!processedEvents) { + PROFILE_RANGE(script, "processEvents"); QCoreApplication::processEvents(); } @@ -989,7 +997,10 @@ void ScriptEngine::run() { float deltaTime = (float) (now - _lastUpdate) / (float) USECS_PER_SECOND; if (!_isFinished) { auto preUpdate = clock::now(); - emit update(deltaTime); + { + PROFILE_RANGE(script, "ScriptUpdate"); + emit update(deltaTime); + } auto postUpdate = clock::now(); auto elapsed = (postUpdate - preUpdate); totalUpdates += std::chrono::duration_cast(elapsed); diff --git a/libraries/shared/src/Profile.cpp b/libraries/shared/src/Profile.cpp index b4f7ed8509..7a8a8f0570 100644 --- a/libraries/shared/src/Profile.cpp +++ b/libraries/shared/src/Profile.cpp @@ -19,6 +19,8 @@ Q_LOGGING_CATEGORY(trace_render_gpu, "trace.render.gpu") Q_LOGGING_CATEGORY(trace_resource, "trace.resource") Q_LOGGING_CATEGORY(trace_resource_network, "trace.resource.network") Q_LOGGING_CATEGORY(trace_resource_parse, "trace.resource.parse") +Q_LOGGING_CATEGORY(trace_script, "trace.script") +Q_LOGGING_CATEGORY(trace_script_entities, "trace.script.entities") Q_LOGGING_CATEGORY(trace_simulation, "trace.simulation") Q_LOGGING_CATEGORY(trace_simulation_detail, "trace.simulation.detail") Q_LOGGING_CATEGORY(trace_simulation_animation, "trace.simulation.animation") diff --git a/libraries/shared/src/Profile.h b/libraries/shared/src/Profile.h index bbba240840..ee09298deb 100644 --- a/libraries/shared/src/Profile.h +++ b/libraries/shared/src/Profile.h @@ -24,6 +24,8 @@ Q_DECLARE_LOGGING_CATEGORY(trace_render_gpu) Q_DECLARE_LOGGING_CATEGORY(trace_resource) Q_DECLARE_LOGGING_CATEGORY(trace_resource_parse) Q_DECLARE_LOGGING_CATEGORY(trace_resource_network) +Q_DECLARE_LOGGING_CATEGORY(trace_script) +Q_DECLARE_LOGGING_CATEGORY(trace_script_entities) Q_DECLARE_LOGGING_CATEGORY(trace_simulation) Q_DECLARE_LOGGING_CATEGORY(trace_simulation_detail) Q_DECLARE_LOGGING_CATEGORY(trace_simulation_animation)