Использование Thread.Sleep: я пробовал Thread.Sleep с рассчитанным интервалом toSleep в миллисекундах, но ясно, что Thread.Sleep — нет. достаточно точны, особенно для более коротких периодов времени. Иногда Thread.Sleep превышает допустимое значение на миллисекунду или более, что влияет на плавность синхронизации кадров.
Сочетание Thread.Sleep с циклом ожидания занятости: поскольку Thread.Sleep обрабатывает только миллисекунды точности, я использовал его для грубой синхронизации, а затем добавил цикл ожидания занятости для последних наносекунд. Этот подход работает несколько лучше, но ожидание занятости сохраняет активность процессора, что не идеально.
Task.Delay и сопрограммы: я также пробовал Task.Delay, но это не помогает. Кажется, он не обеспечивает большей точности, чем Thread.Sleep, и, поскольку мне нужны обновления кадров в реальном времени, сопрограммы не подходят, поскольку они зависят от частоты кадров Unity.
Код: Выделить всё
// Main processing loop
void Update()
{
long startProcessingTime = ProfilerUnsafeUtility.Timestamp;
// Process frame reception and other operations here...
long processingTimeNS = ElapsedNanoseconds(startProcessingTime, ProfilerUnsafeUtility.Timestamp);
long toSleepNS = targetFrameIntervalNS - processingTimeNS;
if (toSleepNS > 0)
{
// Coarse sleep in milliseconds
int sleepMS = (int)(toSleepNS / 1_000_000);
if (sleepMS > 0)
{
Thread.Sleep(sleepMS);
}
// Fine adjustment with busy-wait for remaining nanoseconds
long remainingNS = toSleepNS % 1_000_000;
long targetTime = ProfilerUnsafeUtility.Timestamp + remainingNS;
while (ProfilerUnsafeUtility.Timestamp < targetTime) { /* Busy-wait */ }
}
}
Существуют ли в Unity какие-либо другие подходы, которые могут обеспечить высокоточную синхронизацию без чрезмерного потребления ресурсов ЦП?< /п>
Подробнее здесь: https://stackoverflow.com/questions/791 ... -precision