void Scene::SendStatistics(TaskQueue&) { POVMS_Message parserStats(kPOVObjectClass_ParserStatistics, kPOVMsgClass_SceneOutput, kPOVMsgIdent_ParserStatistics); GetStatistics(parserStats); parserStats.SetInt(kPOVAttrib_SceneId, sceneData->sceneId); parserStats.SetSourceAddress(sceneData->backendAddress); parserStats.SetDestinationAddress(sceneData->frontendAddress); POVMS_SendMessage(parserStats); for(std::vector<TraceThreadData*>::iterator i(sceneThreadData.begin()); i != sceneThreadData.end(); i++) delete (*i); sceneThreadData.clear(); }
void Scene::GetStatistics(POVMS_Object& parserStats) { struct TimeData final { POV_LONG cpuTime; POV_LONG realTime; size_t samples; TimeData() : cpuTime(0), realTime(0), samples(0) { } }; TimeData timeData[TraceThreadData::kMaxTimeType]; for(std::vector<TraceThreadData*>::iterator i(sceneThreadData.begin()); i != sceneThreadData.end(); i++) { timeData[(*i)->timeType].realTime = max(timeData[(*i)->timeType].realTime, (*i)->realTime); if ((*i)->cpuTime >= 0) timeData[(*i)->timeType].cpuTime += (*i)->cpuTime; else timeData[(*i)->timeType].cpuTime = -1; timeData[(*i)->timeType].samples++; } for(size_t i = TraceThreadData::kUnknownTime; i < TraceThreadData::kMaxTimeType; i++) { if(timeData[i].samples > 0) { POVMS_Object elapsedTime(kPOVObjectClass_ElapsedTime); elapsedTime.SetLong(kPOVAttrib_RealTime, timeData[i].realTime); if (timeData[i].cpuTime >= 0) elapsedTime.SetLong(kPOVAttrib_CPUTime, timeData[i].cpuTime); elapsedTime.SetInt(kPOVAttrib_TimeSamples, POVMSInt(timeData[i].samples)); switch(i) { case TraceThreadData::kParseTime: parserStats.Set(kPOVAttrib_ParseTime, elapsedTime); break; case TraceThreadData::kBoundingTime: parserStats.Set(kPOVAttrib_BoundingTime, elapsedTime); break; } } } parserStats.SetInt(kPOVAttrib_FiniteObjects, sceneData->numberOfFiniteObjects); parserStats.SetInt(kPOVAttrib_InfiniteObjects, sceneData->numberOfInfiniteObjects); parserStats.SetInt(kPOVAttrib_LightSources, POVMSInt(sceneData->lightSources.size())); parserStats.SetInt(kPOVAttrib_Cameras, POVMSInt(sceneData->cameras.size())); if(sceneData->boundingMethod == 2) { parserStats.SetInt(kPOVAttrib_BSPNodes, sceneData->nodes); parserStats.SetInt(kPOVAttrib_BSPSplitNodes, sceneData->splitNodes); parserStats.SetInt(kPOVAttrib_BSPObjectNodes, sceneData->objectNodes); parserStats.SetInt(kPOVAttrib_BSPEmptyNodes, sceneData->emptyNodes); parserStats.SetInt(kPOVAttrib_BSPMaxObjects, sceneData->maxObjects); parserStats.SetFloat(kPOVAttrib_BSPAverageObjects, sceneData->averageObjects); parserStats.SetInt(kPOVAttrib_BSPMaxDepth, sceneData->maxDepth); parserStats.SetFloat(kPOVAttrib_BSPAverageDepth, sceneData->averageDepth); parserStats.SetInt(kPOVAttrib_BSPAborts, sceneData->aborts); parserStats.SetFloat(kPOVAttrib_BSPAverageAborts, sceneData->averageAborts); parserStats.SetFloat(kPOVAttrib_BSPAverageAbortObjects, sceneData->averageAbortObjects); } }