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:
@@ -13,6 +13,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
using OpenRA.Primitives;
|
using OpenRA.Primitives;
|
||||||
|
|
||||||
@@ -139,17 +140,12 @@ namespace OpenRA.Mods.D2k.SpriteLoaders
|
|||||||
Data = new byte[width * height * 4];
|
Data = new byte[width * height * 4];
|
||||||
Type = SpriteFrameType.Bgra32;
|
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 packed = Data[i * 2 + 1] << 8 | Data[i * 2];
|
||||||
{
|
data[i] = (uint)((0xFF << 24) | ((packed & 0x7C00) << 9) | ((packed & 0x3E0) << 6) | ((packed & 0x1f) << 3));
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -166,9 +162,11 @@ namespace OpenRA.Mods.D2k.SpriteLoaders
|
|||||||
s.ReadUInt32();
|
s.ReadUInt32();
|
||||||
|
|
||||||
Palette = new uint[256];
|
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));
|
Palette[i] = (uint)((0xFF << 24) | ((packed & 0x7C00) << 9) | ((packed & 0x3E0) << 6) | ((packed & 0x1f) << 3));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user