Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion GameWorld/View3D/Services/SkeletonAnimationLookUpHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,8 @@ void FileDiscovered(byte[] byteChunk, PackFileContainer container, string fullPa
"animations\\battle\\humanoid13b\\golgfag\\docking\\hu13b_golgfag_docking_armed_02.anim",
"animations\\battle\\humanoid13\\ogre\\rider\\hq3b_stonehorn_wb\\sword_and_crossbow\\missile_action\\crossbow\\hu13_hq3b_swc_rider1_shoot_back_crossbow_01.anim",
"animations\\battle\\humanoid13\\ogre\\rider\\hq3b_stonehorn_wb\\sword_and_crossbow\\missile_action\\crossbow\\hu13_hq3b_swc_rider1_reload_crossbow_01.anim",
"animations\\battle\\humanoid13\\ogre\\rider\\hq3b_stonehorn_wb\\sword_and_crossbow\\missile_action\\crossbow\\hu13_hq3b_sp_rider1_shoot_ready_crossbow_01.anim"
"animations\\battle\\humanoid13\\ogre\\rider\\hq3b_stonehorn_wb\\sword_and_crossbow\\missile_action\\crossbow\\hu13_hq3b_sp_rider1_shoot_ready_crossbow_01.anim",
"animations\\battle\\humanoid01c\\sayl_staff_and_skull\\stand\\props\\hu1c_sayl_staff_and_skull_staff_stand_idle_02.anim"
};
if (brokenFiles.Contains(fullPath))
{
Expand Down
148 changes: 80 additions & 68 deletions Shared/SharedCore/ErrorHandling/PackFileLog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,122 +3,134 @@

namespace Shared.Core.ErrorHandling
{
public class CompressionStats
public class CompressionInformation(long diskSize = 0, long uncompressedSize = 0)
{
public long DiskSize { get; set; }
public long UncompressedSize { get; set; }
public long DiskSize { get; set; } = diskSize;
public long UncompressedSize { get; set; } = uncompressedSize;

public CompressionStats(long diskSize = 0, long uncompressedSize = 0)
public void Add(CompressionInformation compressionInformation)
{
DiskSize = diskSize;
UncompressedSize = uncompressedSize;
}

public void Add(CompressionStats stat)
{
DiskSize += stat.DiskSize;
UncompressedSize += stat.UncompressedSize;
DiskSize += compressionInformation.DiskSize;
UncompressedSize += compressionInformation.UncompressedSize;
}
}

public static class PackFileLog
{
private static readonly ILogger s_logger = Logging.CreateStatic(typeof(PackFileLog));

public static Dictionary<CompressionFormat, CompressionStats> GetCompressionStats(PackFileContainer container)
public static Dictionary<CompressionFormat, CompressionInformation> GetCompressionInformation(PackFileContainer container)
{
var stats = new Dictionary<CompressionFormat, CompressionStats>();
var compressionInformation = new Dictionary<CompressionFormat, CompressionInformation>();

foreach (var packFile in container.FileList.Values)
{
if (packFile.DataSource is PackedFileSource source)
{
var format = source.IsCompressed
? source.CompressionFormat
: CompressionFormat.None;

if (!stats.TryGetValue(format, out var totals))
var compressionFormat = source.IsCompressed ? source.CompressionFormat : CompressionFormat.None;
if (!compressionInformation.TryGetValue(compressionFormat, out var totals))
{
totals = new CompressionStats();
stats[format] = totals;
totals = new CompressionInformation();
compressionInformation[compressionFormat] = totals;
}

totals.DiskSize += source.Size;
totals.UncompressedSize += source.IsCompressed ? source.UncompressedSize : 0L;
}
}

return stats;
return compressionInformation;
}

public static void LogPackCompression(PackFileContainer container)
{
var stats = GetCompressionStats(container);
var compressionInformation = GetCompressionInformation(container);
var totalFiles = container.FileList.Count;
var packSizeFmt = FormatSize(container.OriginalLoadByteSize);
var packSize = FormatSize(container.OriginalLoadByteSize);

var loadingPart = $"Loading {container.Name}.pack ({totalFiles} files, {packSize})";

var loadingPart = $"Loading {container.Name}.pack ({totalFiles} files, {packSizeFmt})";
var fileCountsByCompressionFormat = new Dictionary<CompressionFormat, int>();
var fileTypeCountsByCompressionFormat = new Dictionary<CompressionFormat, Dictionary<string, int>>();

var fileCounts = new Dictionary<CompressionFormat, int>();
foreach (var pf in container.FileList.Values)
foreach (var packFile in container.FileList.Values)
{
if (pf.DataSource is PackedFileSource src)
if (packFile.DataSource is not PackedFileSource packedFileSource)
continue;

var compressionFormat = packedFileSource.IsCompressed ? packedFileSource.CompressionFormat : CompressionFormat.None;

if (!fileCountsByCompressionFormat.TryGetValue(compressionFormat, out var fileCount))
fileCountsByCompressionFormat[compressionFormat] = 1;
else
fileCountsByCompressionFormat[compressionFormat] = fileCount + 1;

var fileType = string.IsNullOrWhiteSpace(packFile.Extension) ? "no_extension" : packFile.Extension;

if (!fileTypeCountsByCompressionFormat.TryGetValue(compressionFormat, out var fileTypeCounts))
{
var fmt = src.IsCompressed
? src.CompressionFormat
: CompressionFormat.None;

if (!fileCounts.TryGetValue(fmt, out var cnt))
fileCounts[fmt] = 1;
else
fileCounts[fmt] = cnt + 1;
fileTypeCounts = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
fileTypeCountsByCompressionFormat[compressionFormat] = fileTypeCounts;
}

if (!fileTypeCounts.TryGetValue(fileType, out var fileTypeCount))
fileTypeCounts[fileType] = 1;
else
fileTypeCounts[fileType] = fileTypeCount + 1;
}

var segments = stats
.OrderBy(kvp => kvp.Key)
.Select(kvp =>
var segments = new List<string>();

foreach (var compressionEntry in compressionInformation.OrderBy(compressionEntry => compressionEntry.Key))
{
var compressionFormat = compressionEntry.Key;
var count = fileCountsByCompressionFormat.TryGetValue(compressionFormat, out var fileCount)? fileCount : 0;
var diskSize = FormatSize(compressionEntry.Value.DiskSize);

var fileSizes = compressionFormat == CompressionFormat.None
? $"Disk Size: {diskSize}"
: $"Disk Size: {diskSize}, Uncompressed Size: {FormatSize(compressionEntry.Value.UncompressedSize)}";

var fileTypes = string.Empty;
if (fileTypeCountsByCompressionFormat.TryGetValue(compressionFormat, out var fileTypeCounts) && fileTypeCounts.Count > 0)
{
var fmt = kvp.Key;
var count = fileCounts.TryGetValue(fmt, out var c) ? c : 0;
var disk = FormatSize(kvp.Value.DiskSize);
var fileTypeSegments = new List<string>();

if (fmt == CompressionFormat.None)
return $"{fmt}: {count} files, {disk} (Disk Size)";
foreach (var fileTypeEntry in fileTypeCounts.OrderBy(fileTypeEntry => fileTypeEntry.Key, StringComparer.OrdinalIgnoreCase))
fileTypeSegments.Add($"{fileTypeEntry.Key} ({fileTypeEntry.Value})");

var unc = FormatSize(kvp.Value.UncompressedSize);
return $"{fmt}: {count} files, {disk} (Disk Size), {unc} (Uncompressed Size)";
})
.ToList();
fileTypes = $": {string.Join(", ", fileTypeSegments)}";
}

segments.Add($"{compressionFormat} ({count} files, {fileSizes}){fileTypes}");
}

var compressionPart = $"File Compression – {string.Join(" | ", segments)}";
s_logger.Here().Information($"{loadingPart} | {compressionPart}");
s_logger.Here().Information($"{loadingPart} | {string.Join(" | ", segments)}");
}

public static void LogPacksCompression(IDictionary<CompressionFormat, CompressionStats> globalStats)
public static void LogPacksCompression(IDictionary<CompressionFormat, CompressionInformation> allCompressionInformation)
{
var segments = globalStats
.OrderBy(kvp => kvp.Key)
.Select(kvp =>
{
var format = kvp.Key;
var diskFormatted = FormatSize(kvp.Value.DiskSize);
var segments = new List<string>();

if (format == CompressionFormat.None)
return $"{format}: {diskFormatted} (Disk Size)";
foreach (var compressionEntry in allCompressionInformation.OrderBy(compressionEntry => compressionEntry.Key))
{
var compressionFormat = compressionEntry.Key;
var diskSize = FormatSize(compressionEntry.Value.DiskSize);

var uncompressedFormatted = FormatSize(kvp.Value.UncompressedSize);
return $"{format}: {diskFormatted} (Disk Size), {uncompressedFormatted} (Uncompressed Size)";
})
.ToList();
if (compressionFormat == CompressionFormat.None)
{
segments.Add($"{compressionFormat}: {diskSize} (Disk Size)");
continue;
}

var totalDisk = globalStats.Values.Sum(stat => stat.DiskSize);
var totalUncompressed = globalStats.Values.Sum(stat => stat.UncompressedSize);
var uncompressedSize = FormatSize(compressionEntry.Value.UncompressedSize);
segments.Add($"{compressionFormat}: {diskSize} (Disk Size), {uncompressedSize} (Uncompressed Size)");
}

var totalDiskFormatted = FormatSize(totalDisk);
var totalUncompressedFormatted = FormatSize(totalUncompressed);
var totalDiskSize = FormatSize(allCompressionInformation.Values.Sum(compressionInformation => compressionInformation.DiskSize));
var totalUncompressedSize = FormatSize(allCompressionInformation.Values.Sum(compressionInformation => compressionInformation.UncompressedSize));

var totalSegment = $"Total: {totalDiskFormatted} (Disk Size), {totalUncompressedFormatted} (Uncompressed Size)";
var totalSegment = $"Total: {totalDiskSize} (Disk Size), {totalUncompressedSize} (Uncompressed Size)";
var summary = string.Join(" | ", segments.Append(totalSegment));

s_logger.Here().Information($"Size of compressed files in all packs by format - {summary}");
Expand Down
6 changes: 3 additions & 3 deletions Shared/SharedCore/PackFiles/PackFileContainerLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ private static void AddFolderContentToPackFile(PackFileContainer container, stri
}

var packList = new List<PackFileContainer>();
var packsCompressionStats = new ConcurrentDictionary<CompressionFormat, CompressionStats>();
var packsCompressionStats = new ConcurrentDictionary<CompressionFormat, CompressionInformation>();

Parallel.ForEach(allCaPackFiles, packFilePath =>
{
Expand All @@ -124,11 +124,11 @@ private static void AddFolderContentToPackFile(PackFileContainer container, stri
packList.Add(pack);

PackFileLog.LogPackCompression(pack);
var packCompressionStats = PackFileLog.GetCompressionStats(pack);
var packCompressionStats = PackFileLog.GetCompressionInformation(pack);
foreach (var kvp in packCompressionStats)
{
if (!packsCompressionStats.TryGetValue(kvp.Key, out var existingStats))
packsCompressionStats[kvp.Key] = new CompressionStats(kvp.Value.DiskSize, kvp.Value.UncompressedSize);
packsCompressionStats[kvp.Key] = new CompressionInformation(kvp.Value.DiskSize, kvp.Value.UncompressedSize);
else
existingStats.Add(kvp.Value);
}
Expand Down
3 changes: 0 additions & 3 deletions Shared/SharedCore/Shared.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,8 @@

<!-- Libs to override stuff that gives error related to monogame-->
<PackageReference Include="Libuv" Version="1.10.0" />
<PackageReference Include="System.IO.FileSystem" Version="4.3.0" />
<PackageReference Include="System.Net.NameResolution" Version="4.3.0" />
</ItemGroup>


<ItemGroup>
<Using Include="Serilog" />
</ItemGroup>
Expand Down
Loading