Цель и задачи: Измерение точности работы таймера Unity для iPhone и в разных браузерах.
Материалы: Unity 3.0, iPhone SDK 4.1, XCode 3.2.4, iPod Touch 3G, iOS 4.1
Прежде чем, что-то мерять, надо померить линейку.
Тест аналогичен
предыдущему: ждем 5 секунд, потом 10 раз по быстрому опрашиваем таймер. Но на этот раз - кросс-платформенный Unity, смотреть будем на iPhone и на разных браузерах. Тест написал сразу на трех Unity языках: C#, Java Script, Boo. Конкретно на этом тестовом примере никакой разницы в зависимости от языка выявлено не было, что на iPhone, что в браузерах. Время узнавал с помощью
Time.realtimeSinceStartup.
Script Call Optimization: Fast but no Exceptions.
Итак, цифры:
iPhone:
Узнать время 1430..2384 нс, погрешность 953 нс.
На нативном Objective C было так: 1208..1416 нс, погрешность 209 нс.
Web:
MacOS X Safari: узнать время 953..2384 нс, погрешность 1430 нс.
Windows 7 Chrome, IE, Safari: узнать время 953..1907 нс, погрешность 953 нс.
Таймер кросс-платформенный, к тому же возвращает float - поэтому 953 нс.
Цифры стабильные, никуда не плавали, сколько раз не запускал тест.
//
// C#
//
using UnityEngine;
using System;
public class TestCSharp : MonoBehaviour
{
private String text;
void Start ()
{
float [] time = new float [10];
// подождем 5 секунд
float start = Time.realtimeSinceStartup;
while ( Time.realtimeSinceStartup - start < 5.0f )
{}
// засечем время
time [0] = Time.realtimeSinceStartup;
time [1] = Time.realtimeSinceStartup;
time [2] = Time.realtimeSinceStartup;
time [3] = Time.realtimeSinceStartup;
time [4] = Time.realtimeSinceStartup;
time [5] = Time.realtimeSinceStartup;
time [6] = Time.realtimeSinceStartup;
time [7] = Time.realtimeSinceStartup;
time [8] = Time.realtimeSinceStartup;
time [9] = Time.realtimeSinceStartup;
// результаты
float min = float.MaxValue, max = 0.0f, avg = 0.0f;
for ( int i = 0; i < 9; ++i )
{
float delta = 1E9f * ( time [i+1] - time [i] ); // 10^9 наносекунд в секунде
if ( delta > max )
max = delta;
if ( delta < min )
min = delta;
avg += delta;
}
avg /= 9;
text = String.Format
(
"C# realtimeSinceStartup:\n" +
"max = {0}\n" +
"min = {1}\n" +
"avg = {2}\n" +
"max delta = {3}\n" +
"% delta = {4}",
max.ToString (),
min.ToString (),
avg.ToString (),
(max - min).ToString (),
(100.0f * (max - min) / avg).ToString ()
);
}
void OnGUI ()
{
GUI.Label ( new Rect (0,0,320,480), text );
}
}
//
// Java Script
//
private var text : String;
function Start ()
{
var time : float [] = new float [10];
// подождем 5 секунд
var start : float = Time.realtimeSinceStartup;
while ( Time.realtimeSinceStartup - start < 5.0f )
{}
// засечем время
time [0] = Time.realtimeSinceStartup;
time [1] = Time.realtimeSinceStartup;
time [2] = Time.realtimeSinceStartup;
time [3] = Time.realtimeSinceStartup;
time [4] = Time.realtimeSinceStartup;
time [5] = Time.realtimeSinceStartup;
time [6] = Time.realtimeSinceStartup;
time [7] = Time.realtimeSinceStartup;
time [8] = Time.realtimeSinceStartup;
time [9] = Time.realtimeSinceStartup;
// результаты
var min : float = float.MaxValue;
var max : float = 0.0f;
var avg : float = 0.0f;
for ( var i : int = 0; i < 9; ++i )
{
var delta : float = 1E9 * ( time [i+1] - time [i] ); // 10^9 наносекунд в секунде
if ( delta > max )
max = delta;
if ( delta < min )
min = delta;
avg += delta;
}
avg /= 9;
text = String.Format
(
"JavaScript realtimeSinceStartup:\n" +
"max = {0}\n" +
"min = {1}\n" +
"avg = {2}\n" +
"max delta = {3}\n" +
"% delta = {4}",
max.ToString (),
min.ToString (),
avg.ToString (),
(max - min).ToString (),
(100.0f * (max - min) / avg).ToString ()
);
}
function OnGUI ()
{
GUI.Label ( Rect (0,0,320,480), text );
}
//
// Boo
//
import UnityEngine
import System
class TestBoo (MonoBehaviour):
private text as string
def Start ():
time = array (single, 10)
// подождем 5 секунд
start as single = Time.realtimeSinceStartup
while Time.realtimeSinceStartup - start < 5.0f:
pass
// засечем время
time [0] = Time.realtimeSinceStartup
time [1] = Time.realtimeSinceStartup
time [2] = Time.realtimeSinceStartup
time [3] = Time.realtimeSinceStartup
time [4] = Time.realtimeSinceStartup
time [5] = Time.realtimeSinceStartup
time [6] = Time.realtimeSinceStartup
time [7] = Time.realtimeSinceStartup
time [8] = Time.realtimeSinceStartup
time [9] = Time.realtimeSinceStartup
// результаты
min as single = single.MaxValue
max as single = 0.0f
avg as single = 0.0f
for i in range(0, 9):
delta as single = 1000000000 * ( time [i+1] - time [i] ) // 10^9 наносекунд в секунде
if delta > max:
max = delta
if delta < min:
min = delta
avg += delta
avg /= 9
text = String.Format (
"Boo realtimeSinceStartup:\n" +
"max = {0}\n" +
"min = {1}\n" +
"avg = {2}\n" +
"max delta = {3}\n" +
"% delta = {4}",
max.ToString (),
min.ToString (),
avg.ToString (),
(max-min).ToString (),
(100.0f * (max-min) / avg).ToString ()
)
def OnGUI():
GUI.Label (Rect (0, 0, 320, 480), text)
Еще по теме:
Измерение точности таймера iPhone [Objective C] Порекомендовать: