На самом деле, я использую метод InvokeRepeating
для вызова другого метода каждые 1/x секунд. Проблема в том, что точность задержки между вызовом и полученными мной данными не очень хороша.Как точно сэмплировать данные с частотой 60 Гц?
Как я могу точно выбрать transform.position
с частотой 60 Гц.
Вот мой код:
public class Recorder : MonoBehaviour {
public float samplingRate = 60f; // sample rate in Hz
public string outputFilePath;
private StreamWriter _sw;
private List<Data> dataList = new List<Data>();
public void OnEnable()
{
InvokeRepeating("SampleNow", 0, 1/samplingRate);
}
public void OnDisable()
{
_sw = System.IO.File.AppendText(outputFilePath);
for (int k=0; k< dataList.Count; k++)
{
_sw.WriteLine("t {0} x {1} y {2} z {3}",
dataList[k].time, dataList[k].x, dataList[k].y, dataList[k].z);
}
_sw.Close();
CancelInvoke();
}
public void SampleNow()
{
dataList.Add(new Data(Time.time, transform.position.x, transform.position.y, transform.position.z));
}
public class Data
{
public float time;
public float x;
public float y;
public float z;
public Data(float time, float x, float y, float z)
{
this.time = time;
this.x = x;
this.y = y;
this.z = z;
}
}
}
Итак, с этим, я могу получить этот вид результата:
t 0 x 0 y 0 z 0
t 0.02 x 0.283776 y -0.76 z 0
t 0.04 x 0.599808 y -0.52 z 0
t 0.06 x 0.599808 y -0.52 z 0
t 0.08 x 0.599808 y -0.52 z 0
t 0.09999999 x 0.599808 y -0.52 z 0
t 0.12 x 0.599808 y -0.52 z 0
t 0.14 x 0.599808 y -0.52 z 0
t 0.16 x 0.599808 y -0.52 z 0
t 0.18 x 0.599808 y -0.52 z 0
t 0.2 x 0.599808 y -0.52 z 0
t 0.22 x 0.599808 y -0.52 z 0
t 0.24 x 0.599808 y -0.52 z 0
t 0.26 x 0.599808 y -0.52 z 0
t 0.28 x 0.599808 y -0.52 z 0
t 0.3 x 0.599808 y -0.52 z 0
t 0.32 x 0.599808 y -0.52 z 0
t 0.3338465 x 0.599808 y -0.52 z 0
t 0.3338465 x 0.2918357 y -0.7538424 z 0
t 0.34 x 0.2918357 y -0.7538424 z 0
t 0.3539519 x 0.2918357 y -0.7538424 z 0
t 0.3539519 x 0.6092016 y -0.5125771 z 0
t 0.3705226 x 0.6092016 y -0.5125771 z 0
t 0.3870888 x 0.8340279 y -0.3137283 z 0
t 0.4036556 x 0.9750986 y -0.114934 z 0
t 0.42 x 0.9865224 y 0.09031145 z 0
...
Как вы можете видеть в этом результате, я могу собрать дубликат позиции для различных время (t = 0,04 до t = 0,32) и худшее, я могу получить дублирующее время (t = 0,3539519) с разными позициями (что дает бесконечное ускорение).
Фактически, анализируемый игровой объект перемещается с линейной синхронизацией во времени, делая круг по оси X-Y более 20 секунд.
Таким образом, этот код не дает мне хорошей точности для научного анализа.
Что я могу сделать, чтобы получить больше точности с Unity3D?
Eh ... просто разместив это там, но вы, вероятно, захотите использовать что-то другое, кроме Unity, если вам нужны точно рассчитанные/имитируемые значения за определенные промежутки времени. Как игровой движок он делает много оптимизаций, используя аппроксимирующие вещи. – Serlite
Вы абсолютно не можете. Это так просто. Unity не имеет никакого отношения - вообще - к этому типу техники. (Обратите внимание, что «Invoke» просто не имеет никакого соединения - ВСЕ ВСЕ - к тому, что вы делаете.) – Fattie