Пример #1
0
    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();
        }
    }
Пример #2
0
    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();
        }
    }