diff --git a/OpenRA.FileFormats/Graphics/VqaReader.cs b/OpenRA.FileFormats/Graphics/VqaReader.cs index d6cb32198e7a..ec66fbdcfca7 100644 --- a/OpenRA.FileFormats/Graphics/VqaReader.cs +++ b/OpenRA.FileFormats/Graphics/VqaReader.cs @@ -253,23 +253,28 @@ public void DecodeVQFR(BinaryReader reader) } } - public int[,] FrameData() + int cachedFrame; + public int[,] FrameData { get { - for (var y = 0; y < blocks.Y; y++) - for (var x = 0; x < blocks.X; x++) - { - var px = origData[x + y*blocks.X]; - var mod = origData[x + (y + blocks.Y)*blocks.X]; - for (var j = 0; j < blockHeight; j++) - for (var i = 0; i < blockWidth; i++) - { - var cbfi = (mod*256 + px)*8 + j*blockWidth + i; - byte color = (mod == 0x0f) ? px : cbf[cbfi]; - frameData[y*blockHeight + j, x*blockWidth + i] = palette[color]; - } - } + if (cachedFrame != currentFrame) + { + cachedFrame = currentFrame; + for (var y = 0; y < blocks.Y; y++) + for (var x = 0; x < blocks.X; x++) + { + var px = origData[x + y*blocks.X]; + var mod = origData[x + (y + blocks.Y)*blocks.X]; + for (var j = 0; j < blockHeight; j++) + for (var i = 0; i < blockWidth; i++) + { + var cbfi = (mod*256 + px)*8 + j*blockWidth + i; + byte color = (mod == 0x0f) ? px : cbf[cbfi]; + frameData[y*blockHeight + j, x*blockWidth + i] = palette[color]; + } + } + } return frameData; - } + }} int NextPowerOf2(int v) { diff --git a/OpenRA.Game/Widgets/VqaPlayerWidget.cs b/OpenRA.Game/Widgets/VqaPlayerWidget.cs index ea79d8280f37..d0a59c90d3ac 100644 --- a/OpenRA.Game/Widgets/VqaPlayerWidget.cs +++ b/OpenRA.Game/Widgets/VqaPlayerWidget.cs @@ -51,7 +51,7 @@ public override void DrawInner(World world) Sound.PlayRaw(video.AudioData); nextFrame = 0; - videoSprite.sheet.Texture.SetData(video.FrameData()); + videoSprite.sheet.Texture.SetData(video.FrameData); first = false; } @@ -59,7 +59,7 @@ public override void DrawInner(World world) { video.AdvanceFrame(); if (nextFrame == video.CurrentFrame) - videoSprite.sheet.Texture.SetData(video.FrameData()); + videoSprite.sheet.Texture.SetData(video.FrameData); } Game.Renderer.RgbaSpriteRenderer.DrawSprite(videoSprite, new int2(RenderBounds.X,RenderBounds.Y), "chrome");