Unity: как приостановить выполнение до тех пор, пока функция не завершится, чтобы не пропускать кадры

Я пишу игру/программу, которая каждые несколько секунд должна записывать много данных на жесткий диск - это занимает несколько секунд и, естественно, приводит к зависанию игры на это время.

Однако, когда игра возобновляется после завершения записи, игра пропускает несколько кадров.

Мне нужно, чтобы Unity пропускал абсолютно никаких кадров что бы то ни было. Как я могу заставить Unity Engine остановить выполнение до полного завершения записи, чтобы при его возобновлении не было пропущено ни одного кадра?


Чтобы обеспечить некоторый контекст, я делаю снимок экрана в каждом кадре, сохраняя их как Texture2D в очереди. Когда в очереди более 100 кадров Texture2D, я записываю их на диск в формате PNG и очищаю очередь.

Я хочу приостановить рендеринг/выполнение, пока происходит запись, чтобы вывод (один) был бесшовным.


person Ben Hayward    schedule 25.02.2016    source источник
comment
Если это приводит к зависанию игры во время выполнения этой функции, то почему бы не использовать другой поток для выполнения этой функции, чтобы он не останавливал основной поток? Многопоточность.   -  person Martin Dawson    schedule 25.02.2016
comment
Потому что это позволит продолжать рендеринг, пока данные записываются на диск. В моем конкретном контексте я хочу, чтобы выполнение полностью приостанавливалось, пока записываются PNG, а затем возобновлялось, как только оно заканчивалось. Я не хочу, чтобы он выполнял/захватывал кадры при попытке записи на диск, потому что захват выполняется значительно быстрее, чем запись.   -  person Ben Hayward    schedule 25.02.2016
comment
Но почему вы ждете, чтобы написать? Почему ты не пишешь, когда сохраняешь? По одному.   -  person Everts    schedule 25.02.2016
comment
Кстати, то, что вы пытаетесь сделать, очень и очень сложно. Вы получите любые простые готовые ответы, Бен — извините за плохие новости :/   -  person Fattie    schedule 25.02.2016


Ответы (1)


Вы можете установить для timeScale значение 0, чтобы Animation и FixedUpdate не вызывались.

Что касается обновления, вам нужно будет добавить некоторые проверки:

void Update()
{
    if(Manager.cleaningTexture == true){ return; }
    // Rest of the code
}
person Everts    schedule 25.02.2016
comment
Я пробовал именно это, но это не совсем сработало. Он все еще пропускает кадр или два. Не совсем уверен, что понимаю, как оператор If помогает предотвратить выполнение? - person Ben Hayward; 25.02.2016
comment
Вы не можете остановить обновления, это просто невозможно. FixedUpdate можно пропустить, если timeScale равен 0. Оператор if предотвращает выполнение любого кода при обновлении, если происходит очистка. Когда вы начнете очистку, вы установите флажок. Затем, когда флаг установлен, обновление пропускается. Но его все равно нужно вызывать, вы не можете этого предотвратить. - person Everts; 25.02.2016
comment
Спасибо, fafase, теперь я это понимаю. В итоге я записал PNG на диск в отдельном потоке. Кажется, это работает довольно хорошо, несмотря на то, что я думал, что это была неправильная идея. - person Ben Hayward; 26.02.2016
comment
@BenHayward, вы использовали пакет помощи потоку (есть несколько, в основном называемые такими вещами, как Loom и т. Д.) ... - person Fattie; 26.02.2016
comment
@JoeBlow В конце концов, я получил ответ из ответов Unity — answers.unity3d.com/questions/1147247/. Я создал сопрограмму, которая, несмотря на мое первоначальное понимание, записывает один кадр на диск сразу после его создания. Я использовал Time.captureFramerate, чтобы заставить единство выполняться только после записи. Работает отлично, кадры не пропускаются. - person Ben Hayward; 26.02.2016