| ▲ | cherryteastain 5 hours ago | ||||||||||||||||
Not an expert in game development, but I'd say the issue with C++ coroutines (and 'colored' async functions in general) is that the whole call stack must be written to support that. From a practical perspective, that must in turn be backed by a multithreaded event loop to be useful, which is very difficult to write performantly and correctly. Hence, most people end up using coroutines with something like boost::asio, but you can do that only if your repo allows a 'kitchen sink' library like Boost in the first place. | |||||||||||||||||
| ▲ | spacechild1 2 hours ago | parent | next [-] | ||||||||||||||||
> that must in turn be backed by a multithreaded event loop to be useful Why? You can just as well execute all your coroutines on a single thread. Many networking applications are doing fine with just use a single ASIO thread. Another example: you could write game behavior in C++ coroutines and schedule them on the thread that handles the game logic. If you want to wait for N seconds inside the coroutine, just yield it as a number. When the scheduler resumes a coroutine, it receives the delta time and then reschedules the coroutine accordingly. This is also a common technique in music programming languages to implement musical sequencing (e.g. SuperCollider) | |||||||||||||||||
| ▲ | pjc50 4 hours ago | parent | prev | next [-] | ||||||||||||||||
Much of the original motivation for async was for single threaded event loops. Node and Python, for example. In C# it was partly motivated by the way Windows handles a "UI thread": if you're using the native Windows controls, you can only do so from one thread. There's quite a bit of machinery in there (ConfigureAwait) to control whether your async routine is run on the UI thread or on a different worker pool thread. In a Unity context, the engine provides the main loop and the developer is writing behaviors for game entities. | |||||||||||||||||
| ▲ | spacechild1 5 hours ago | parent | prev | next [-] | ||||||||||||||||
ASIO is also available outside of boost! https://github.com/chriskohlhoff/asio | |||||||||||||||||
| |||||||||||||||||
| ▲ | inetknght 2 hours ago | parent | prev [-] | ||||||||||||||||
> From a practical perspective, that must in turn be backed by a multithreaded event loop to be useful Multithreaded? Nope. You can do C++ coroutines just fine in a single-threaded context. Event loop? Only if you're wanting to do IO in your coroutines and not block other coroutines while waiting for that IO to finish. > most people end up using coroutines with something like boost::asio Sure. But you don't have to. Asio is available without the kitchen sink: https://think-async.com/Asio/ Coroutines are actually really approachable. You don't need boost::asio, but it certainly makes it a lot easier. I recommend watching Daniela Engert's 2022 presentation, Contemporary C++ in Action: https://www.youtube.com/watch?v=yUIFdL3D0Vk | |||||||||||||||||