diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 7 | ||||
-rw-r--r-- | OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 82 |
2 files changed, 51 insertions, 38 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index c38a52e..078a22a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -10367,7 +10367,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10367 | ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384)); | 10367 | ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384)); |
10368 | break; | 10368 | break; |
10369 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: | 10369 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: |
10370 | ret.Add(new LSL_Float(0)); | 10370 | ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f)); |
10371 | break; | 10371 | break; |
10372 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: | 10372 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: |
10373 | ret.Add(new LSL_Integer(1)); | 10373 | ret.Add(new LSL_Integer(1)); |
@@ -10435,9 +10435,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10435 | ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384)); | 10435 | ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384)); |
10436 | break; | 10436 | break; |
10437 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: | 10437 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: |
10438 | // Average cpu time per simulator frame expended on all scripts in the object | 10438 | // Average cpu time in seconds per simulator frame expended on all scripts in the object |
10439 | // Not currently available at Object level | 10439 | ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f)); |
10440 | ret.Add(new LSL_Float(0)); | ||
10441 | break; | 10440 | break; |
10442 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: | 10441 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: |
10443 | // according to the SL wiki A prim or linkset will have prim | 10442 | // according to the SL wiki A prim or linkset will have prim |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 7712076..b7903d5 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -1907,45 +1907,59 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1907 | if (!topScripts.ContainsKey(si.LocalID)) | 1907 | if (!topScripts.ContainsKey(si.LocalID)) |
1908 | topScripts[si.RootLocalID] = 0; | 1908 | topScripts[si.RootLocalID] = 0; |
1909 | 1909 | ||
1910 | // long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | 1910 | topScripts[si.RootLocalID] += CalculateAdjustedExectionTime(si, tickNow); |
1911 | // float framesElapsed = ticksElapsed / (18.1818 * TimeSpan.TicksPerMillisecond); | 1911 | } |
1912 | 1912 | } | |
1913 | // Execution time of the script adjusted by it's measurement period to make scripts started at | ||
1914 | // different times comparable. | ||
1915 | // float adjustedExecutionTime | ||
1916 | // = (float)si.MeasurementPeriodExecutionTime | ||
1917 | // / ((float)(tickNow - si.MeasurementPeriodTickStart) / ScriptInstance.MaxMeasurementPeriod) | ||
1918 | // / TimeSpan.TicksPerMillisecond; | ||
1919 | |||
1920 | long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||
1921 | |||
1922 | // Avoid divide by zerp | ||
1923 | if (ticksElapsed == 0) | ||
1924 | ticksElapsed = 1; | ||
1925 | 1913 | ||
1926 | // Scale execution time to the ideal 55 fps frame time for these reasons. | 1914 | return topScripts; |
1927 | // | 1915 | } |
1928 | // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no | ||
1929 | // 'script execution time per frame', which is the original purpose of this value. | ||
1930 | // | ||
1931 | // 2) Giving the raw execution times is misleading since scripts start at different times, making | ||
1932 | // it impossible to compare scripts. | ||
1933 | // | ||
1934 | // 3) Scaling the raw execution time to the time that the script has been running is better but | ||
1935 | // is still misleading since a script that has just been rezzed may appear to have been running | ||
1936 | // for much longer. | ||
1937 | // | ||
1938 | // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect | ||
1939 | // since the figure does not represent actual execution time and very hard running scripts will | ||
1940 | // never exceed 18ms (though this is a very high number for script execution so is a warning sign). | ||
1941 | float adjustedExecutionTime | ||
1942 | = ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f; | ||
1943 | 1916 | ||
1944 | topScripts[si.RootLocalID] += adjustedExecutionTime; | 1917 | public float GetScriptExecutionTime(List<UUID> itemIDs) |
1918 | { | ||
1919 | if (itemIDs == null|| itemIDs.Count == 0) | ||
1920 | { | ||
1921 | return 0.0f; | ||
1922 | } | ||
1923 | float time = 0.0f; | ||
1924 | long tickNow = Util.EnvironmentTickCount(); | ||
1925 | IScriptInstance si; | ||
1926 | // Calculate the time for all scripts that this engine is executing | ||
1927 | // Ignore any others | ||
1928 | foreach (UUID id in itemIDs) | ||
1929 | { | ||
1930 | si = GetInstance(id); | ||
1931 | if (si != null && si.Running) | ||
1932 | { | ||
1933 | time += CalculateAdjustedExectionTime(si, tickNow); | ||
1945 | } | 1934 | } |
1946 | } | 1935 | } |
1936 | return time; | ||
1937 | } | ||
1947 | 1938 | ||
1948 | return topScripts; | 1939 | private float CalculateAdjustedExectionTime(IScriptInstance si, long tickNow) |
1940 | { | ||
1941 | long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||
1942 | |||
1943 | // Avoid divide by zero | ||
1944 | if (ticksElapsed == 0) | ||
1945 | ticksElapsed = 1; | ||
1946 | |||
1947 | // Scale execution time to the ideal 55 fps frame time for these reasons. | ||
1948 | // | ||
1949 | // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no | ||
1950 | // 'script execution time per frame', which is the original purpose of this value. | ||
1951 | // | ||
1952 | // 2) Giving the raw execution times is misleading since scripts start at different times, making | ||
1953 | // it impossible to compare scripts. | ||
1954 | // | ||
1955 | // 3) Scaling the raw execution time to the time that the script has been running is better but | ||
1956 | // is still misleading since a script that has just been rezzed may appear to have been running | ||
1957 | // for much longer. | ||
1958 | // | ||
1959 | // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect | ||
1960 | // since the figure does not represent actual execution time and very hard running scripts will | ||
1961 | // never exceed 18ms (though this is a very high number for script execution so is a warning sign). | ||
1962 | return ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f; | ||
1949 | } | 1963 | } |
1950 | 1964 | ||
1951 | public void SuspendScript(UUID itemID) | 1965 | public void SuspendScript(UUID itemID) |