Improve performance of R8Loader.

The repeated small stream reads of ReadUInt16 generate a lot of overhead. Instead, consume the data in a single ReadBytes call and then unpack within the same buffer.
This commit is contained in:
RoosterDragon
2024-03-09 09:46:33 +00:00
committed by Gustas
parent 00a23e6c11
commit 519db10f61

View File

@@ -13,6 +13,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using OpenRA.Graphics;
using OpenRA.Primitives;
@@ -139,17 +140,12 @@ namespace OpenRA.Mods.D2k.SpriteLoaders
Data = new byte[width * height * 4];
Type = SpriteFrameType.Bgra32;
unsafe
var data = MemoryMarshal.Cast<byte, uint>(Data);
s.ReadBytes(Data.AsSpan()[..(Data.Length / 2)]);
for (var i = width * height - 1; i >= 0; i--)
{
fixed (byte* bd = &Data[0])
{
var data = (uint*)bd;
for (var i = 0; i < width * height; i++)
{
var packed = s.ReadUInt16();
data[i] = (uint)((0xFF << 24) | ((packed & 0x7C00) << 9) | ((packed & 0x3E0) << 6) | ((packed & 0x1f) << 3));
}
}
var packed = Data[i * 2 + 1] << 8 | Data[i * 2];
data[i] = (uint)((0xFF << 24) | ((packed & 0x7C00) << 9) | ((packed & 0x3E0) << 6) | ((packed & 0x1f) << 3));
}
}
else
@@ -166,9 +162,11 @@ namespace OpenRA.Mods.D2k.SpriteLoaders
s.ReadUInt32();
Palette = new uint[256];
for (var i = 0; i < 256; i++)
var palette = MemoryMarshal.Cast<uint, byte>(Palette);
s.ReadBytes(palette[..(palette.Length / 2)]);
for (var i = 255; i >= 0; i--)
{
var packed = s.ReadUInt16();
var packed = palette[i * 2 + 1] << 8 | palette[i * 2];
Palette[i] = (uint)((0xFF << 24) | ((packed & 0x7C00) << 9) | ((packed & 0x3E0) << 6) | ((packed & 0x1f) << 3));
}