LifePlay-Revival/Tools/AuditAssets.py

70 lines
3.3 KiB
Python
Raw Permalink Normal View History

# Audit d'optimisation (lot O0) : inventaire de /Game par le registre d'assets, sans charger les assets.
# Lecture seule. Pour chaque asset : paquet, classe, taille du fichier, tags du registre (dimensions,
# compression, triangles, LOD, Nanite...), nombre de paquets qui le referencent (durs et souples).
#
# Usage :
# UnrealEditor-Cmd.exe <projet> -run=pythonscript -script="<projet>/Tools/AuditAssets.py" -unattended -nopause -nosplash
# Sortie : Saved/Audit/assets.jsonl (une ligne JSON par asset)
import json
import os
import unreal
out_dir = os.path.join(unreal.Paths.project_saved_dir(), "Audit")
os.makedirs(out_dir, exist_ok=True)
out_path = os.path.join(out_dir, "assets.jsonl")
registry = unreal.AssetRegistryHelpers.get_asset_registry()
registry.search_all_assets(True)
assets = registry.get_assets_by_path("/Game", recursive=True)
hard = unreal.AssetRegistryDependencyOptions(include_soft_package_references=False, include_hard_package_references=True,
include_searchable_names=False, include_soft_management_references=False,
include_hard_management_references=False)
soft = unreal.AssetRegistryDependencyOptions(include_soft_package_references=True, include_hard_package_references=False,
include_searchable_names=False, include_soft_management_references=False,
include_hard_management_references=False)
content_dir = unreal.Paths.convert_relative_path_to_full(unreal.Paths.project_content_dir())
def package_file(package):
rel = str(package)[len("/Game/"):]
for ext in (".uasset", ".umap"):
p = os.path.join(content_dir, rel + ext)
if os.path.exists(p):
return p
return None
count = 0
with open(out_path, "w", encoding="utf-8") as f:
for a in assets:
package = a.package_name
path = package_file(package)
size = os.path.getsize(path) if path else -1
if path:
ubulk = path[:-len(".uasset")] + ".ubulk" if path.endswith(".uasset") else None
if ubulk and os.path.exists(ubulk):
size += os.path.getsize(ubulk)
tags = {}
for key in ("Dimensions", "Format", "CompressionSettings", "LODGroup", "SRGB", "NeverStream", "MipGenSettings",
"Triangles", "Vertices", "LODs", "Materials", "NaniteEnabled", "ApproxSize", "Sections",
"MorphTargets", "Bones", "Skeleton", "BlendMode", "ShadingModel", "TwoSided", "Duration",
"NumFrames", "SequenceLength", "ParentClass", "NativeParentClass"):
v = a.get_tag_value(key)
if v is not None and v != "" and v != "None":
tags[key] = str(v)
refs_hard = registry.get_referencers(package, hard) or []
refs_soft = registry.get_referencers(package, soft) or []
rec = {
"package": str(package),
"class": str(a.asset_class_path.asset_name),
"size": size,
"tags": tags,
"refs_hard": len([r for r in refs_hard if str(r) != str(package)]),
"refs_soft": len([r for r in refs_soft if str(r) != str(package)]),
}
f.write(json.dumps(rec, ensure_ascii=False) + "\n")
count += 1
unreal.log_warning("AuditAssets : {} assets -> {}".format(count, out_path))