102 lines
3.3 KiB
GDScript
102 lines
3.3 KiB
GDScript
extends Node
|
|
|
|
## VRAM/Texture Memory Measurement Tool
|
|
## Add this as an autoload to measure memory usage at startup
|
|
|
|
var measurements := {}
|
|
var start_time := 0.0
|
|
|
|
func _ready():
|
|
start_time = Time.get_ticks_msec()
|
|
|
|
# Initial measurement (before anything loads)
|
|
_record_measurement("initial")
|
|
|
|
# Wait for scene tree to be ready
|
|
await get_tree().process_frame
|
|
_record_measurement("after_tree_ready")
|
|
|
|
# Wait for main scene to fully load
|
|
await get_tree().process_frame
|
|
_record_measurement("after_main_scene_loaded")
|
|
|
|
# Give textures time to upload to GPU
|
|
await get_tree().process_frame
|
|
await get_tree().process_frame
|
|
_record_measurement("after_gpu_upload")
|
|
|
|
# Print final report
|
|
await get_tree().process_frame
|
|
_print_report()
|
|
|
|
func _record_measurement(label: String):
|
|
var elapsed_ms = Time.get_ticks_msec() - start_time
|
|
var tex_mem = Performance.get_monitor(Performance.VIEWER_TEXTURE_MEMORY)
|
|
var obj_count = Performance.get_monitor(Performance.OBJECT_COUNT)
|
|
var node_count = Performance.get_monitor(Performance.OBJECT_NODE_COUNT)
|
|
|
|
measurements[label] = {
|
|
"elapsed_ms": elapsed_ms,
|
|
"texture_memory_bytes": tex_mem,
|
|
"texture_memory_mb": tex_mem / (1024.0 * 1024.0),
|
|
"object_count": obj_count,
|
|
"node_count": node_count
|
|
}
|
|
|
|
print("[%.2f ms] %s: VRAM=%.2f MB, Objects=%d, Nodes=%d" % [
|
|
elapsed_ms / 1000.0,
|
|
label,
|
|
tex_mem / (1024.0 * 1024.0),
|
|
obj_count,
|
|
node_count
|
|
])
|
|
|
|
func _print_report():
|
|
print("\n" + "=" * 60)
|
|
print("VRAM USAGE REPORT")
|
|
print("=" * 60)
|
|
|
|
var total_elapsed = Time.get_ticks_msec() - start_time
|
|
|
|
for label in measurements:
|
|
var m = measurements[label]
|
|
print("\n[%s]" % label)
|
|
print(" Elapsed: %.3f s" % (m.elapsed_ms / 1000.0))
|
|
print(" Texture Memory: %.2f MB (%.2f KB)" % [m.texture_memory_mb, m.texture_memory_bytes / 1024.0])
|
|
print(" Object Count: %d" % m.object_count)
|
|
print(" Node Count: %d" % m.node_count)
|
|
|
|
print("\n" + "=" * 60)
|
|
print("TOTAL STARTUP TIME: %.3f s" % (total_elapsed / 1000.0))
|
|
print("=" * 60)
|
|
|
|
# Save to file if we have write access
|
|
var file_path = "user://vram_measurement_%s.txt" % Time.get_datetime_string_from_system(false, true).replace(":", "-")
|
|
var file = FileAccess.open(file_path, FileAccess.WRITE)
|
|
if file:
|
|
file.store_string("VRAM Measurement Report\n")
|
|
file.store_string("Generated: %s\n\n" % Time.get_datetime_string_from_system())
|
|
for label in measurements:
|
|
var m = measurements[label]
|
|
file.store_string("[%s]\n" % label)
|
|
file.store_string(" Elapsed: %.3f s\n" % (m.elapsed_ms / 1000.0))
|
|
file.store_string(" Texture Memory: %.2f MB\n" % m.texture_memory_mb)
|
|
file.store_string(" Object Count: %d\n" % m.object_count)
|
|
file.store_string(" Node Count: %d\n\n" % m.node_count)
|
|
file.close()
|
|
print("\nReport saved to: %s" % file_path)
|
|
|
|
## Call this manually at any point to get current VRAM usage
|
|
func get_current_vram_mb() -> float:
|
|
return Performance.get_monitor(Performance.VIEWER_TEXTURE_MEMORY) / (1024.0 * 1024.0)
|
|
|
|
## Get detailed breakdown
|
|
func get_memory_stats() -> Dictionary:
|
|
return {
|
|
"texture_memory_mb": get_current_vram_mb(),
|
|
"object_count": Performance.get_monitor(Performance.OBJECT_COUNT),
|
|
"node_count": Performance.get_monitor(Performance.OBJECT_NODE_COUNT),
|
|
"physics_objects_2d": Performance.get_monitor(Performance.PHYSICS_2D_OBJECT_COUNT),
|
|
"physics_objects_3d": Performance.get_monitor(Performance.PHYSICS_3D_OBJECT_COUNT),
|
|
}
|