- Home /
How expensive are coroutines on iPhone?
I've recently discovered coroutines, which make a sequence of events, separated by time for instance, easy to do, or allows me to delay a bit of script logic very easily - i.e. play the animation 5 seconds from now. I'm developing for iOS however, so I'm wondering whether coroutines are a good idea on iOS or are they likely to quickly impact performance?
I really don't want to have to start writing lots of state machines in the Update() method - are coroutines really just handling that boilerplate for me? If I yield return StartCoroutine() am I creating some heavy weight object? What about returning new WaitForSeconds() objects?
I appreciate this might be quite a tough question to answer 'off the top of your head', so I guess I am looking for; either someone who has some metrics; someone 'in the know'; or perhaps someone writing for iOS who is using them and has had either a good or bad experience as a result and is willing to share! :)
Thanks in advance H
Answer by Eric5h5 · Aug 01, 2011 at 12:05 AM
Coroutines are faster than running state machines in Update.
It's the difference between checking what do to each frame before doing it, and being told when to do something and doing it.
For more in-depth info, read this article. http://altdevblogaday.com/2011/07/07/unity3d-coroutines-in-detail/
That's a great article. Not only does that explain how coroutines work, but it also elaborates on what exactly the yield keyword does. Anyone working with .Net, also outside Unity, can benefit from that.
@Bovine: I wouldn't have answered the question definitively like that if I didn't have experience in this area. ;) Update isn't magic; it also has overhead (plus it runs every frame whether you need it to or not).
@Bovine, from past experience, simply calling Update()
is slower than running a coroutine. Unity calls all your Update()'s through some reflection/indirection that makes the method call alone more expensive.
@Bovine: No, Apple dropped the "native code" thing last year, that's all.
Answer by kayy · Sep 05, 2013 at 11:21 AM
2 years later but maybe interesting for others:
Using Unity 3.5.7 on my old iPhone 4 I did some profiling. As others stated, coroutines are almost for free, but the profiler revealed that instantiating a YieldInstruction
could take a measurable amount of time.
So I replaced all:
while (myBool) {
// do something
yield return new WaitForEndOfFrame(); // 0.2 - 2 ms every frame
}
by
YieldInstruction yieldInstruction = new WaitForEndOfFrame ();
while (myBool) {
// do something
yield return yieldInstruction; // no impact
}
This is interesting info. I've had problems with Coroutines having unreasonable amounts of performance overhead. They might be faster than Update() but I'm not sure they would be faster than Invoke("") or changing state based on events.
Answer by vxssmatty · Aug 03, 2011 at 03:17 AM
They are a great things and should definitely be used and exploited, they save performance if used correctly.
Have a read up on; http://unity3d.com/support/documentation/ScriptReference/index.Coroutines_26_Yield.html
I've read the help but it doesn't talk about the cost of starting a coroutine, nesting them and of returning new objects such as WaitForSeconds(). It also doesn't mention the impact on different platforms - specifically mobile!