Лучший способ заснуть или сделать паузу в Unity с высокой точностью времениC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Лучший способ заснуть или сделать паузу в Unity с высокой точностью времени

Сообщение Anonymous »

Я работаю над проектом Unity, где мне нужно добиться высокоточного управления временем для цикла отображения и обработки кадров. В частности, мне нужно, чтобы временной интервал между кадрами был как можно более постоянным, с возможностью приостановки или приостановки выполнения на определенные интервалы с точностью до микросекунды (а в идеале даже до наносекунды).В моем приложении кадры принимаются по сети через нерегулярные промежутки времени, и я пытаюсь контролировать время отображения, динамически вычисляя интервал toSleep для каждого кадра на основе времени его обработки. Значение toSleep компенсирует любые задержки, поэтому каждый кадр отображается с почти постоянным интервалом. Вот что я пробовал до сих пор:
Использование 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?
Существуют ли в Unity какие-либо другие подходы, которые могут обеспечить высокоточную синхронизацию без чрезмерного потребления ресурсов ЦП?< /п>

Подробнее здесь: https://stackoverflow.com/questions/791 ... -precision
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»