Важно для любого, кто исследует эту сложную тему в Unity,
не забудьте увидеть еще один вопрос, который я задал, который поднял связанные ключевые вопросы:
В частности, в Unity "куда" буквально возвращается ожидание?
Для специалистов по С# Unity является однопоточным 1
Распространено делать вычисления и тому подобное в другом потоке.
Когда вы что-то делаете в другом потоке, вы часто используете async/wait, поскольку все хорошие программисты на С# говорят, что это простой способ сделать это!
void TankExplodes() {
ShowExplosion(); .. ordinary Unity thread
SoundEffects(); .. ordinary Unity thread
SendExplosionInfo(); .. it goes to another thread. let use 'async/wait'
}
using System.Net.WebSockets;
async void SendExplosionInfo() {
cws = new ClientWebSocket();
try {
await cws.ConnectAsync(u, CancellationToken.None);
...
Scene.NewsFromServer("done!"); // class function to go back to main tread
}
catch (Exception e) { ... }
}
Итак, когда вы делаете это, вы делаете все "как обычно", когда запускаете поток более обычным способом в Unity/С# (так, используя Thread или что-то еще, или позволяете родному плагину делать это или ОС, или что-то еще дело может быть).
Все отлично работает.
Будучи хромым программистом Unity, который знает достаточно С#, чтобы добраться до конца дня, я всегда предполагал, что вышеприведенный шаблон async/await буквально запускает другой поток.
Фактически, приведенный выше код буквально запускает другой поток, или С#/.NET использует какой-то другой подход для решения задач, когда вы используете шаблон natty async/wait?
Может быть, он работает иначе или конкретно в движке Unity по сравнению с "использованием С# вообще"? (ИДК?)
Обратите внимание, что в Unity то, является ли это потоком, кардинально влияет на то, как вы будете обрабатывать следующие шаги. Отсюда и вопрос.
Проблема: я понимаю, что есть много дискуссий о том, "ждет ли поток", но, (1) я никогда не видел, чтобы это обсуждалось/отвечалось в настройках Unity (это имеет какое-то значение? IDK?) (2) я просто никогда видел четкий ответ!
1 Некоторые вспомогательные вычисления (например, физика и т.д.) Выполняются в других потоках, но фактический "движок игры на основе фреймов" - это один чистый поток. (Невозможно каким-либо образом "получить доступ" к потоку фрейма основного двигателя: при программировании, скажем, собственного плагина или какого-либо вычисления в другом потоке, вы просто оставляете маркеры и значения для компонентов в потоке фрейма двигателя для просмотра и использовать, когда они запускают каждый кадр.)