/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using OpenMetaverse;
using System.Collections.Generic;
namespace OpenSim.Framework
{
///
/// These are the IDs of stats required by viewers protocol
///
///
/// Some of these are not relevant to OpenSimulator since it is architected differently to other simulators
/// (e.g. script instructions aren't executed as part of the frame loop so 'script time' is tricky).
///
public enum StatsID : uint
{
// viewers defined IDs
TimeDilation = 0,
SimFPS = 1,
PhysicsFPS = 2,
AgentUpdates = 3,
FrameMS = 4,
NetMS = 5,
OtherMS = 6,
PhysicsMS = 7,
AgentMS = 8,
ImageMS = 9,
ScriptMS = 10,
TotalPrim = 11,
ActivePrim = 12,
Agents = 13,
ChildAgents = 14,
ActiveScripts = 15,
LSLScriptLinesPerSecond = 16, // viewers don't like this anymore
InPacketsPerSecond = 17,
OutPacketsPerSecond = 18,
PendingDownloads = 19,
PendingUploads = 20,
VirtualSizeKb = 21,
ResidentSizeKb = 22,
PendingLocalUploads = 23,
UnAckedBytes = 24,
PhysicsPinnedTasks = 25,
PhysicsLodTasks = 26,
SimPhysicsStepMs = 27,
SimPhysicsShapeMs = 28,
SimPhysicsOtherMs = 29,
SimPhysicsMemory = 30,
ScriptEps = 31,
SimSpareMs = 32,
SimSleepMs = 33,
SimIoPumpTime = 34,
SimPCTSscriptsRun = 35,
SimRegionIdle = 36, // dataserver only
SimRegionIdlePossible = 37, // dataserver only
SimAIStepTimeMS = 38,
SimSkippedSillouet_PS = 39,
SimSkippedCharsPerC = 40,
// extra stats IDs, just far from viewer defined ones
SimExtraCountStart = 1000,
internalLSLScriptLinesPerSecond = 1000,
FrameDilation2 = 1001,
UsersLoggingIn = 1002,
TotalGeoPrim = 1003,
TotalMesh = 1004,
ScriptEngineThreadCount = 1005,
NPCs = 1006,
SimExtraCountEnd = 1007
}
// stats values are stored on a float[]
// so we need readable indexes to it
// Values sent to viewers via lludp must be first and up to fake index ViewerArraySize
// fake index ArraySize defines the needed array size
// this does not follow same order as IDs, because legacy order
public enum StatsIndex : int
{
// index into data array
TimeDilation = 0,
SimFPS = 1,
PhysicsFPS = 2,
AgentUpdates = 3,
Agents = 4,
ChildAgents = 5,
TotalPrim = 6,
ActivePrim = 7,
FrameMS = 8,
NetMS = 9,
PhysicsMS = 10,
ImageMS = 11,
OtherMS = 12,
InPacketsPerSecond = 13,
OutPacketsPerSecond = 14,
UnAckedBytes = 15,
AgentMS = 16,
PendingDownloads = 17,
PendingUploads = 18,
ActiveScripts = 19,
SimSleepMs = 20,
SimSpareMs = 21,
SimPhysicsStepMs = 22,
VirtualSizeKb = 23,
ResidentSizeKb = 24,
PendingLocalUploads = 25,
PhysicsPinnedTasks = 26,
PhysicsLodTasks = 27,
ScriptEps = 28,
SimAIStepTimeMS = 29,
SimIoPumpTime = 30,
SimPCTSscriptsRun = 31,
SimRegionIdle = 32,
SimRegionIdlePossible = 33,
SimSkippedSillouet_PS = 34,
SimSkippedCharsPerC = 35,
SimPhysicsMemory = 36,
ScriptMS = 37,
LSLScriptLinesPerSecond = 38,
SimPhysicsShapeMs = 39,
SimPhysicsOtherMs = 40,
ViewerArraySize = 41, // just a marker to the end of viewer only stats and start of extra
internalLSLScriptLinesPerSecond = 41,
FrameDilation2 = 42,
UsersLoggingIn = 43,
TotalGeoPrim = 44,
TotalMesh = 45,
ScriptEngineThreadCount = 46,
NPCs = 47,
ArraySize = 48 // last is marker for array size
}
///
/// Enapsulate statistics for a simulator/scene.
///
/// TODO: This looks very much like the OpenMetaverse SimStatsPacket. It should be much more generic stats
/// storage.
///
public class SimStats
{
public uint RegionX;
public uint RegionY;
public uint RegionSizeX;
public uint RegionSizeY;
public uint RegionFlags;
public uint ObjectCapacity;
public UUID RegionUUID;
public string RegionName;
public float[] StatsValues
{
get { return m_statsValues; }
}
private float[] m_statsValues;
// a fixed array with the IDs for each viewer relevant stat
// order and size must match StatsIndex enum
public static readonly uint[] StatsIndexID = new uint[]
{
(uint)StatsID.TimeDilation,
(uint)StatsID.SimFPS,
(uint)StatsID.PhysicsFPS,
(uint)StatsID.AgentUpdates,
(uint)StatsID.Agents,
(uint)StatsID.ChildAgents,
(uint)StatsID.TotalPrim,
(uint)StatsID.ActivePrim,
(uint)StatsID.FrameMS,
(uint)StatsID.NetMS,
(uint)StatsID.PhysicsMS,
(uint)StatsID.ImageMS,
(uint)StatsID.OtherMS,
(uint)StatsID.InPacketsPerSecond,
(uint)StatsID.OutPacketsPerSecond,
(uint)StatsID.UnAckedBytes,
(uint)StatsID.AgentMS,
(uint)StatsID.PendingDownloads,
(uint)StatsID.PendingUploads,
(uint)StatsID.ActiveScripts,
(uint)StatsID.SimSleepMs,
(uint)StatsID.SimSpareMs,
(uint)StatsID.SimPhysicsStepMs,
(uint)StatsID.VirtualSizeKb,
(uint)StatsID.ResidentSizeKb,
(uint)StatsID.PendingLocalUploads,
(uint)StatsID.PhysicsPinnedTasks,
(uint)StatsID.PhysicsLodTasks,
(uint)StatsID.ScriptEps,
(uint)StatsID.SimAIStepTimeMS,
(uint)StatsID.SimIoPumpTime,
(uint)StatsID.SimPCTSscriptsRun,
(uint)StatsID.SimRegionIdle,
(uint)StatsID.SimRegionIdlePossible,
(uint)StatsID.SimSkippedSillouet_PS,
(uint)StatsID.SimSkippedCharsPerC,
(uint)StatsID.SimPhysicsMemory,
(uint)StatsID.ScriptMS,
(uint)StatsID.LSLScriptLinesPerSecond,
(uint)StatsID.SimPhysicsShapeMs,
(uint)StatsID.SimPhysicsOtherMs,
(uint)StatsID.internalLSLScriptLinesPerSecond,
(uint)StatsID.FrameDilation2,
(uint)StatsID.UsersLoggingIn,
(uint)StatsID.TotalGeoPrim,
(uint)StatsID.TotalMesh,
(uint)StatsID.ScriptEngineThreadCount,
(uint)StatsID.NPCs
};
public SimStats(
uint regionX, uint regionY,
uint regionSizeX, uint regionSizeY,
uint regionFlags, uint objectCapacity,
float[] values,
UUID pRUUID, string regionName)
{
RegionUUID = pRUUID;
RegionName = regionName;
RegionX = regionX;
RegionY = regionY;
RegionSizeX = regionSizeX;
RegionSizeY = regionSizeY;
RegionFlags = regionFlags;
ObjectCapacity = objectCapacity;
m_statsValues = values;
}
}
}