Split heavy operation using coroutine
Hello everyone, I am trying to perform a JPEG encoding on a large texture2D, which takes quite a long time, resulting on a freeze on the frame where the operation is performed. Because it is a Unity component, I cannot perform this on a background thread, it has to be executed on the main thread. I have heared about Coroutines and how it can pause the execution of an operation and resume on the next frame, but I am having a hard time understanding how this can be done when the blocking operation is occuring in only one line of code.
Here is my coroutine so far :
IEnumerator TextureToJpeg()
{
int lastEncodedId = 0;
EncodedFrameData efd = new EncodedFrameData();
byte[] encodedFrameBuffer = null;
do
{
if (lastEncodedId != lastTextureId)
{
lastEncodedId = lastTextureId;
encodedFrameBuffer = texture.EncodeToJPG();
yield return 0;
efd.RefreshData(width, height, encodedFrameBuffer);
PublishEncodedFrame(efd);
encodedFramesCounter += 1;
}
}
while (doEncoding);
}
Here, the blocking operation is
encodedFrameBuffer = texture.EncodeToJPG();
Where texture is a Texture2D. What I would like to do is to pause the execution of this method at the end of the frame, and resume it where it was stopped on the next frame. In other words I would like to split the execution of this line on multiple frames. Can anybody inform me if this is even possible, or if this whole instruction has to be executed on one frame only (which may be logical after all). I am also not sure of the yield type I used. I also tried a WaitForSeconds, which did not resulted in a better outcome.
I don't know if I did make myself clear, I am of course ready to give you as much more information as necessary.
Your answer
Follow this Question
Related Questions
Unit Production Queue Display 0 Answers
Why is a gameobject moves at start? 0 Answers
Problem with particle effects and detonating bombs 0 Answers
Do I need a Coroutine to handle acceleration? 0 Answers
Why doesn't the object appear? 2 Answers