static IEnumerator MakeGifRoutine(List <RenderTexture> textures, float frameLength, Stream output, bool closeWhenDone) { Game.instance.canRecord = false; var gifEncoder = new Gif.Components.AnimatedGifEncoder(); gifEncoder.SetQuality(10); gifEncoder.SetRepeat(0); gifEncoder.SetDelay((int)(frameLength * 1000)); gifEncoder.Start(output); int w = textures[0].width; int h = textures[0].height; var tex = new Texture2D(w, h, TextureFormat.ARGB32, false, true); var imageStart = new ManualResetEvent(false); Gif.Components.Image image = null; bool done = false; bool processed = false; var worker = new Thread(() => { while (!done) { imageStart.WaitOne(); imageStart.Reset(); gifEncoder.AddFrame(image); processed = true; } }); worker.Start(); for (int picCount = 0; picCount < textures.Count; picCount++) { var tempTex = textures[picCount]; RenderTexture.active = tempTex; tex.ReadPixels(new Rect(0, 0, w, h), 0, 0); RenderTexture.ReleaseTemporary(tempTex); image = new Gif.Components.Image(tex); processed = false; imageStart.Set(); while (!processed) { yield return(null); } } Game.instance.canRecord = true; done = true; textures.Clear(); gifEncoder.Finish(); DestroyImmediate(tex); output.Flush(); if (closeWhenDone) { output.Close(); } }
static IEnumerator MakeGifRoutine(List<RenderTexture> textures, float frameLength, Stream output, bool closeWhenDone) { var gifEncoder = new Gif.Components.AnimatedGifEncoder(); gifEncoder.SetQuality(10); gifEncoder.SetRepeat(0); gifEncoder.SetDelay((int)(frameLength * 1000)); gifEncoder.Start(output); int w = textures[0].width; int h = textures[0].height; var tex = new Texture2D(w,h, TextureFormat.ARGB32, false, true); var imageStart = new ManualResetEvent(false); Gif.Components.Image image = null; bool done = false; bool processed = false; var worker = new Thread(() => { while (!done) { imageStart.WaitOne(); imageStart.Reset(); gifEncoder.AddFrame(image); processed = true; } }); worker.Start(); for (int picCount = 0; picCount < textures.Count; picCount++) { var tempTex = textures[picCount]; RenderTexture.active = tempTex; tex.ReadPixels(new Rect(0, 0, w, h), 0, 0); RenderTexture.ReleaseTemporary(tempTex); image = new Gif.Components.Image(tex); processed = false; imageStart.Set(); while (!processed) { yield return null; } } done = true; textures.Clear(); gifEncoder.Finish(); DestroyImmediate(tex); output.Flush(); if (closeWhenDone) { output.Close(); } }