diff --git a/benchmarks/graphics/after-4080.json b/benchmarks/graphics/after-4080.json new file mode 100644 index 0000000000..223449dd8c --- /dev/null +++ b/benchmarks/graphics/after-4080.json @@ -0,0 +1,546 @@ +{ + "label": "after-4080", + "date": "2026-10-13", + "commit": "9006566b", + "host": "ludodesktop", + "offscreen": true, + "seed": "1234", + "flight_seconds": 12.0, + "scenes": { + "village": { + "from": [ + -960.0, + 125.0, + 80.0 + ], + "to": [ + -960.0, + 125.0, + 272.0 + ], + "pitch": 35.0 + }, + "forest": { + "from": [ + -1100.0, + 120.0, + -560.0 + ], + "to": [ + -1100.0, + 120.0, + -368.0 + ], + "pitch": 25.0 + }, + "ocean": { + "from": [ + -300.0, + 85.0, + -420.0 + ], + "to": [ + -300.0, + 85.0, + -228.0 + ], + "pitch": 10.0 + }, + "mountain": { + "from": [ + 560.0, + 260.0, + 860.0 + ], + "to": [ + 752.0, + 260.0, + 860.0 + ], + "pitch": 30.0 + } + }, + "distances": { + "8": { + "renderer": { + "backend": "Vulkan", + "drawn_sections": 133, + "gpu": "NVIDIA GeForce RTX 4080", + "present_mode": "Immediate", + "size": [ + 1280, + 720 + ], + "uploaded_bytes": 941908352 + }, + "village": { + "avg_fps": 2409.179688612205, + "cpu": { + "avg_ms": 0.41004928978864236, + "max_ms": 18.15971565246582, + "p50_ms": 0.2718150019645691, + "p95_ms": 0.7112299799919128, + "p99_ms": 1.316559076309204 + }, + "frames": 28910, + "gpu": { + "avg_ms": 0.09866036293994015, + "max_ms": 0.25088000297546387, + "p50_ms": 0.08806400001049042, + "p95_ms": 0.1740799993276596, + "p99_ms": 0.19968000054359436 + }, + "low_1pct_fps": 160.80638022914025, + "max_ms": 18.175312042236328, + "p50_ms": 0.2760099768638611, + "p95_ms": 0.7161250114440918, + "p99_ms": 1.4078609943389893, + "phases_avg_ms": { + "prepare": 0.20953580908804606, + "render": 0.12439006986512069, + "tick": 0.05299293669455945, + "update": 0.023244019639293335 + }, + "seconds": 11.999935138359666, + "slow_phases_avg_ms": { + "prepare": 0.4052206484151298, + "render": 0.41893499056840766, + "tick": 5.252727109792939, + "update": 0.0936474929949076 + } + }, + "forest": { + "avg_fps": 1099.4635681039538, + "cpu": { + "avg_ms": 0.9003613499442573, + "max_ms": 23.31729507446289, + "p50_ms": 0.6657320261001587, + "p95_ms": 0.9898859858512878, + "p99_ms": 9.592857360839844 + }, + "frames": 13194, + "gpu": { + "avg_ms": 0.2639814413552015, + "max_ms": 3.0013439655303955, + "p50_ms": 0.2549760043621063, + "p95_ms": 0.3553279936313629, + "p99_ms": 0.37171199917793274 + }, + "low_1pct_fps": 82.87026130908886, + "max_ms": 27.990703582763672, + "p50_ms": 0.6705269813537598, + "p95_ms": 1.0082690715789795, + "p99_ms": 9.64776611328125, + "phases_avg_ms": { + "prepare": 0.571024256178027, + "render": 0.12442494783992657, + "tick": 0.1706307831885292, + "update": 0.03442592136820218 + }, + "seconds": 12.000397632777691, + "slow_phases_avg_ms": { + "prepare": 0.7136096191225629, + "render": 0.43175565880356415, + "tick": 10.713303016893791, + "update": 0.05390534066651581 + } + }, + "ocean": { + "avg_fps": 687.0806476294383, + "cpu": { + "avg_ms": 1.4490217101725757, + "max_ms": 29.75178337097168, + "p50_ms": 0.9425880312919617, + "p95_ms": 1.6511069536209106, + "p99_ms": 15.603099822998047 + }, + "frames": 8245, + "gpu": { + "avg_ms": 0.3711021953564546, + "max_ms": 1.5022079944610596, + "p50_ms": 0.3665919899940491, + "p95_ms": 0.43827199935913086, + "p99_ms": 0.4679679870605469 + }, + "low_1pct_fps": 47.486143092805435, + "max_ms": 29.770263671875, + "p50_ms": 0.947784960269928, + "p95_ms": 1.6628600358963013, + "p99_ms": 15.621638298034668, + "phases_avg_ms": { + "prepare": 0.8449565766073126, + "render": 0.1554101111230668, + "tick": 0.3840128544967872, + "update": 0.06481705411812297 + }, + "seconds": 12.000046906352043, + "slow_phases_avg_ms": { + "prepare": 1.2885668083845851, + "render": 0.45316039797771407, + "tick": 19.216593845781073, + "update": 0.08380924088947744 + } + }, + "mountain": { + "avg_fps": 343.77852072094186, + "cpu": { + "avg_ms": 1.5961282111390964, + "max_ms": 22.24184799194336, + "p50_ms": 0.8254669904708862, + "p95_ms": 11.660508155822754, + "p99_ms": 14.398658752441406 + }, + "frames": 4113, + "gpu": { + "avg_ms": 0.3449904050323872, + "max_ms": 2.9040639400482178, + "p50_ms": 0.3338240087032318, + "p95_ms": 0.43724799156188965, + "p99_ms": 0.5171200037002563 + }, + "low_1pct_fps": 29.95597087331344, + "max_ms": 33.422760009765625, + "p50_ms": 0.8299460411071777, + "p95_ms": 33.33942413330078, + "p99_ms": 33.37727355957031, + "phases_avg_ms": { + "prepare": 0.7147062004496516, + "render": 0.14707977256612884, + "tick": 0.6855548198381525, + "update": 0.04897363143349227 + }, + "seconds": 11.96409825539589, + "slow_phases_avg_ms": { + "prepare": 0.8949875491006034, + "render": 0.6183000469491595, + "tick": 14.63794419879005, + "update": 0.8699657806594457 + } + } + }, + "16": { + "renderer": { + "backend": "Vulkan", + "drawn_sections": 0, + "gpu": "NVIDIA GeForce RTX 4080", + "present_mode": "Immediate", + "size": [ + 1280, + 720 + ], + "uploaded_bytes": 16462208 + }, + "village": { + "avg_fps": 1041.3622747953375, + "cpu": { + "avg_ms": 0.9549695556642304, + "max_ms": 26.009796142578125, + "p50_ms": 0.4810290038585663, + "p95_ms": 2.5506999492645264, + "p99_ms": 9.879941940307617 + }, + "frames": 12496, + "gpu": { + "avg_ms": 0.22781361336253403, + "max_ms": 1.7469439506530762, + "p50_ms": 0.18534399569034576, + "p95_ms": 0.6113280057907104, + "p99_ms": 0.809984028339386 + }, + "low_1pct_fps": 64.04348583959742, + "max_ms": 26.032779693603516, + "p50_ms": 0.48582199215888977, + "p95_ms": 2.5584940910339355, + "p99_ms": 9.892412185668945, + "phases_avg_ms": { + "prepare": 0.37678885421859964, + "render": 0.3450905326050295, + "tick": 0.1742891420732452, + "update": 0.0590072420405441 + }, + "seconds": 11.999666496902703, + "slow_phases_avg_ms": { + "prepare": 1.4649118003845214, + "render": 1.1414484503269196, + "tick": 12.881806396484375, + "update": 0.11011978423595428 + } + }, + "forest": { + "avg_fps": 316.2068527731055, + "cpu": { + "avg_ms": 3.154168446387541, + "max_ms": 26.147607803344727, + "p50_ms": 2.2156569957733154, + "p95_ms": 12.254712104797363, + "p99_ms": 17.7707462310791 + }, + "frames": 3795, + "gpu": { + "avg_ms": 0.7502970771905776, + "max_ms": 2.599936008453369, + "p50_ms": 0.7239680290222168, + "p95_ms": 1.3158400058746338, + "p99_ms": 1.3772799968719482 + }, + "low_1pct_fps": 49.59272936233826, + "max_ms": 26.164094924926758, + "p50_ms": 2.222438097000122, + "p95_ms": 12.270298957824707, + "p99_ms": 17.786956787109375, + "phases_avg_ms": { + "prepare": 1.5666706890613822, + "render": 0.7056146899387927, + "tick": 0.7469899302897249, + "update": 0.13521884845002838 + }, + "seconds": 12.001637430429458, + "slow_phases_avg_ms": { + "prepare": 1.9408628783727948, + "render": 1.194917630208166, + "tick": 16.762235842253034, + "update": 0.24904731876756014 + } + }, + "ocean": { + "avg_fps": 385.09978163469907, + "cpu": { + "avg_ms": 2.589322079316407, + "max_ms": 18.984909057617188, + "p50_ms": 2.0551369190216064, + "p95_ms": 8.740593910217285, + "p99_ms": 11.559625625610352 + }, + "frames": 4622, + "gpu": { + "avg_ms": 0.6778284030938654, + "max_ms": 2.398207902908325, + "p50_ms": 0.7833600044250488, + "p95_ms": 0.9431040287017822, + "p99_ms": 1.511423945426941 + }, + "low_1pct_fps": 71.97424221133898, + "max_ms": 19.0070858001709, + "p50_ms": 2.061105966567993, + "p95_ms": 8.753417015075684, + "p99_ms": 11.577004432678223, + "phases_avg_ms": { + "prepare": 1.3568510900633204, + "render": 0.7359144338432817, + "tick": 0.41578289517198963, + "update": 0.0810434000275639 + }, + "seconds": 12.002084188103677, + "slow_phases_avg_ms": { + "prepare": 1.6523635336693296, + "render": 1.2426407299143203, + "tick": 10.818658037388579, + "update": 0.16372418847489864 + } + }, + "mountain": { + "avg_fps": 219.70895893367268, + "cpu": { + "avg_ms": 3.098228604710274, + "max_ms": 23.518693923950195, + "p50_ms": 2.0422279834747314, + "p95_ms": 10.511551856994629, + "p99_ms": 16.436803817749023 + }, + "frames": 2634, + "gpu": { + "avg_ms": 0.9377313036310374, + "max_ms": 9.588735580444336, + "p50_ms": 0.8488960266113281, + "p95_ms": 0.9728000164031982, + "p99_ms": 3.4201600551605225 + }, + "low_1pct_fps": 29.957383952355947, + "max_ms": 33.38852310180664, + "p50_ms": 2.0481808185577393, + "p95_ms": 33.341556549072266, + "p99_ms": 33.377445220947266, + "phases_avg_ms": { + "prepare": 1.3405477057013806, + "render": 0.8202416233113071, + "tick": 0.8190081106798682, + "update": 0.11872799601335143 + }, + "seconds": 11.988587141752243, + "slow_phases_avg_ms": { + "prepare": 1.648652986243919, + "render": 1.7585702317732352, + "tick": 14.372832368921351, + "update": 1.0560209235107456 + } + } + }, + "32": { + "renderer": { + "backend": "Vulkan", + "drawn_sections": 212, + "gpu": "NVIDIA GeForce RTX 4080", + "present_mode": "Immediate", + "size": [ + 1280, + 720 + ], + "uploaded_bytes": 255897088 + }, + "village": { + "avg_fps": 48.3055081533635, + "cpu": { + "avg_ms": 9.376506657416572, + "max_ms": 861.2249145507812, + "p50_ms": 3.0502548217773438, + "p95_ms": 32.94725036621094, + "p99_ms": 74.04153442382812 + }, + "frames": 1271, + "gpu": { + "avg_ms": 1.7700931664342303, + "max_ms": 20.69094467163086, + "p50_ms": 1.2410880327224731, + "p95_ms": 7.598080158233643, + "p99_ms": 15.925248146057129 + }, + "low_1pct_fps": 0.761712600806078, + "max_ms": 14330.3583984375, + "p50_ms": 3.071429967880249, + "p95_ms": 33.099002838134766, + "p99_ms": 75.7547378540039, + "phases_avg_ms": { + "prepare": 1.518610580008767, + "render": 1.6828305973582713, + "tick": 5.15484752775804, + "update": 1.020680267595335 + }, + "seconds": 26.31169919514656, + "slow_phases_avg_ms": { + "prepare": 0.9654910931220422, + "render": 3.5708756630237284, + "tick": 196.6683132465069, + "update": 14.971596607795128 + } + }, + "forest": { + "avg_fps": 27.53318156189366, + "cpu": { + "avg_ms": 40.13187835841161, + "max_ms": 1166.3994140625, + "p50_ms": 6.5535569190979, + "p95_ms": 63.877315521240234, + "p99_ms": 1108.11865234375 + }, + "frames": 271, + "gpu": { + "avg_ms": 2.297342118961785, + "max_ms": 22.554624557495117, + "p50_ms": 0.7065600156784058, + "p95_ms": 7.245823860168457, + "p99_ms": 9.055232048034668 + }, + "low_1pct_fps": 0.8848759980013957, + "max_ms": 1166.4168701171875, + "p50_ms": 6.675865173339844, + "p95_ms": 59.150550842285156, + "p99_ms": 1108.134521484375, + "phases_avg_ms": { + "prepare": 2.83869483858017, + "render": 2.5961379855321343, + "tick": 33.04425997872419, + "update": 1.6535338119387186 + }, + "seconds": 9.842669267654419, + "slow_phases_avg_ms": { + "prepare": 2.766425689061483, + "render": 4.919464270273845, + "tick": 1112.3431803385417, + "update": 10.057182629903158 + } + }, + "ocean": { + "avg_fps": 67.01857611699128, + "cpu": { + "avg_ms": 14.669945189483148, + "max_ms": 113.66764068603516, + "p50_ms": 4.473541736602783, + "p95_ms": 51.374263763427734, + "p99_ms": 94.75230407714844 + }, + "frames": 802, + "gpu": { + "avg_ms": 2.9074973299021734, + "max_ms": 22.526975631713867, + "p50_ms": 1.8206720352172852, + "p95_ms": 8.869888305664062, + "p99_ms": 11.596799850463867 + }, + "low_1pct_fps": 10.111656570136391, + "max_ms": 113.68443298339844, + "p50_ms": 4.488469123840332, + "p95_ms": 51.39033508300781, + "p99_ms": 94.76870727539062, + "phases_avg_ms": { + "prepare": 2.4291724538862556, + "render": 2.242118674918006, + "tick": 9.334139847333992, + "update": 0.6651962902814967 + }, + "seconds": 11.966831384181976, + "slow_phases_avg_ms": { + "prepare": 2.7512698968251548, + "render": 3.2687110900878906, + "tick": 90.47323608398438, + "update": 2.3865103986528187 + } + }, + "mountain": { + "avg_fps": 28.70327462003782, + "cpu": { + "avg_ms": 16.062305691622306, + "max_ms": 67.72319793701172, + "p50_ms": 10.215509414672852, + "p95_ms": 45.747154235839844, + "p99_ms": 63.64399337768555 + }, + "frames": 345, + "gpu": { + "avg_ms": 8.470281650363535, + "max_ms": 21.519359588623047, + "p50_ms": 8.845312118530273, + "p95_ms": 15.868927955627441, + "p99_ms": 17.557504653930664 + }, + "low_1pct_fps": 15.182693348952107, + "max_ms": 67.74352264404297, + "p50_ms": 33.36533737182617, + "p95_ms": 46.64082336425781, + "p99_ms": 63.65925979614258, + "phases_avg_ms": { + "prepare": 0.8729904708654984, + "render": 3.4296869785889337, + "tick": 8.941314909811826, + "update": 2.8190046198558116 + }, + "seconds": 12.01953451538086, + "slow_phases_avg_ms": { + "prepare": 0.8918330073356628, + "render": 4.432150959968567, + "tick": 50.667978286743164, + "update": 9.854933142662048 + } + } + } + }, + "load_before": [ + 1.86328125, + 2.111328125, + 3.9072265625 + ], + "load_after": [ + 8.4560546875, + 5.08544921875, + 4.68798828125 + ] +} diff --git a/benchmarks/graphics/after-lavapipe.json b/benchmarks/graphics/after-lavapipe.json new file mode 100644 index 0000000000..946f1c27a7 --- /dev/null +++ b/benchmarks/graphics/after-lavapipe.json @@ -0,0 +1,546 @@ +{ + "label": "after-lavapipe", + "date": "2026-10-13", + "commit": "9006566b", + "host": "ludodesktop", + "offscreen": false, + "seed": "1234", + "flight_seconds": 12.0, + "scenes": { + "village": { + "from": [ + -960.0, + 125.0, + 80.0 + ], + "to": [ + -960.0, + 125.0, + 272.0 + ], + "pitch": 35.0 + }, + "forest": { + "from": [ + -1100.0, + 120.0, + -560.0 + ], + "to": [ + -1100.0, + 120.0, + -368.0 + ], + "pitch": 25.0 + }, + "ocean": { + "from": [ + -300.0, + 85.0, + -420.0 + ], + "to": [ + -300.0, + 85.0, + -228.0 + ], + "pitch": 10.0 + }, + "mountain": { + "from": [ + 560.0, + 260.0, + 860.0 + ], + "to": [ + 752.0, + 260.0, + 860.0 + ], + "pitch": 30.0 + } + }, + "distances": { + "8": { + "renderer": { + "backend": "Vulkan", + "drawn_sections": 156, + "gpu": "llvmpipe (LLVM 21.1.8, 256 bits)", + "present_mode": "Mailbox", + "size": [ + 1600, + 1000 + ], + "uploaded_bytes": 1278284288 + }, + "village": { + "avg_fps": 58.3354572261441, + "cpu": { + "avg_ms": 11.363309368576322, + "max_ms": 36.24496841430664, + "p50_ms": 13.213258743286133, + "p95_ms": 19.535802841186523, + "p99_ms": 24.83148956298828 + }, + "frames": 700, + "gpu": { + "avg_ms": 13.518205827985492, + "max_ms": 34.97639083862305, + "p50_ms": 13.195829391479492, + "p95_ms": 18.039182662963867, + "p99_ms": 23.378856658935547 + }, + "low_1pct_fps": 31.312386939419746, + "max_ms": 36.36259078979492, + "p50_ms": 16.02706527709961, + "p95_ms": 21.249738693237305, + "p99_ms": 29.130090713500977, + "phases_avg_ms": { + "prepare": 0.2306461141364915, + "render": 9.720663217795746, + "tick": 1.3112367039202113, + "update": 0.10169148096282567 + }, + "seconds": 11.99956310081482, + "slow_phases_avg_ms": { + "prepare": 0.35282185673713684, + "render": 25.05345916748047, + "tick": 3.1022580585309436, + "update": 0.38026727948869976 + } + }, + "forest": { + "avg_fps": 41.90001789962103, + "cpu": { + "avg_ms": 18.045572770611635, + "max_ms": 36.546627044677734, + "p50_ms": 20.543725967407227, + "p95_ms": 30.5231990814209, + "p99_ms": 34.017364501953125 + }, + "frames": 504, + "gpu": { + "avg_ms": 21.35815803588383, + "max_ms": 36.23066329956055, + "p50_ms": 19.825437545776367, + "p95_ms": 29.274858474731445, + "p99_ms": 33.32203674316406 + }, + "low_1pct_fps": 20.022920779459263, + "max_ms": 99.08029174804688, + "p50_ms": 22.576229095458984, + "p95_ms": 32.772239685058594, + "p99_ms": 36.67753982543945, + "phases_avg_ms": { + "prepare": 0.22351377572686898, + "render": 16.234788014183916, + "tick": 1.4387834655649459, + "update": 0.14943464463281017 + }, + "seconds": 12.028634479522704, + "slow_phases_avg_ms": { + "prepare": 0.2705736731489499, + "render": 32.015567461649574, + "tick": 2.741411516830946, + "update": 0.3076988315830628 + } + }, + "ocean": { + "avg_fps": 60.413862302111134, + "cpu": { + "avg_ms": 10.874024665643429, + "max_ms": 29.430055618286133, + "p50_ms": 12.944002151489258, + "p95_ms": 17.997587203979492, + "p99_ms": 25.568126678466797 + }, + "frames": 725, + "gpu": { + "avg_ms": 12.736994123787715, + "max_ms": 28.143625259399414, + "p50_ms": 12.234904289245605, + "p95_ms": 15.61594295501709, + "p99_ms": 24.476089477539062 + }, + "low_1pct_fps": 34.82401357005238, + "max_ms": 33.36631393432617, + "p50_ms": 16.01299476623535, + "p95_ms": 18.74709701538086, + "p99_ms": 26.6020565032959, + "phases_avg_ms": { + "prepare": 0.4042872669162421, + "render": 9.401332649341946, + "tick": 0.9126873913477977, + "update": 0.15663292961387798 + }, + "seconds": 12.000557030677795, + "slow_phases_avg_ms": { + "prepare": 0.3962315060198307, + "render": 26.506223678588867, + "tick": 0.0020812499860767275, + "update": 0.5454612672328949 + } + }, + "mountain": { + "avg_fps": 37.77761368324693, + "cpu": { + "avg_ms": 11.491443304826092, + "max_ms": 34.474151611328125, + "p50_ms": 13.871685981750488, + "p95_ms": 20.351163864135742, + "p99_ms": 23.77434539794922 + }, + "frames": 453, + "gpu": { + "avg_ms": 14.109076927302953, + "max_ms": 35.115882873535156, + "p50_ms": 13.555350303649902, + "p95_ms": 18.336809158325195, + "p99_ms": 30.865131378173828 + }, + "low_1pct_fps": 27.343844611059406, + "max_ms": 39.0676155090332, + "p50_ms": 33.33863830566406, + "p95_ms": 33.36062240600586, + "p99_ms": 34.297752380371094, + "phases_avg_ms": { + "prepare": 0.22927819613457778, + "render": 9.350584785242217, + "tick": 1.7383085893987211, + "update": 0.17420387428015405 + }, + "seconds": 11.991228556632995, + "slow_phases_avg_ms": { + "prepare": 0.2908208012580872, + "render": 25.648976135253907, + "tick": 1.9043863375205548, + "update": 0.7624145835638046 + } + } + }, + "16": { + "renderer": { + "backend": "Vulkan", + "drawn_sections": 0, + "gpu": "llvmpipe (LLVM 21.1.8, 256 bits)", + "present_mode": "Mailbox", + "size": [ + 1600, + 1000 + ], + "uploaded_bytes": 36807552 + }, + "village": { + "avg_fps": 20.701493975921895, + "cpu": { + "avg_ms": 31.808356682459515, + "max_ms": 74.47195434570312, + "p50_ms": 41.86561584472656, + "p95_ms": 56.75548553466797, + "p99_ms": 73.00084686279297 + }, + "frames": 249, + "gpu": { + "avg_ms": 40.500388481140135, + "max_ms": 67.22461700439453, + "p50_ms": 40.38219451904297, + "p95_ms": 50.01243209838867, + "p99_ms": 62.00723648071289 + }, + "low_1pct_fps": 8.83914293384798, + "max_ms": 133.2972869873047, + "p50_ms": 47.37559509277344, + "p95_ms": 61.3382682800293, + "p99_ms": 74.61792755126953, + "phases_avg_ms": { + "prepare": 0.30830518620081215, + "render": 25.584145257750667, + "tick": 5.116575629957185, + "update": 0.8002672145165592 + }, + "seconds": 12.028117404937744, + "slow_phases_avg_ms": { + "prepare": 0.3641819953918457, + "render": 44.77838750680288, + "tick": 6.285618623097737, + "update": 22.415442685286205 + } + }, + "forest": { + "avg_fps": 18.118065350089793, + "cpu": { + "avg_ms": 36.827518428137545, + "max_ms": 85.7597427368164, + "p50_ms": 49.536197662353516, + "p95_ms": 62.31198501586914, + "p99_ms": 66.591064453125 + }, + "frames": 218, + "gpu": { + "avg_ms": 47.82228247616269, + "max_ms": 76.9173355102539, + "p50_ms": 46.98957824707031, + "p95_ms": 57.49673843383789, + "p99_ms": 69.92066192626953 + }, + "low_1pct_fps": 11.528998473378772, + "max_ms": 93.62928009033203, + "p50_ms": 53.71598434448242, + "p95_ms": 66.69908905029297, + "p99_ms": 80.71000671386719, + "phases_avg_ms": { + "prepare": 0.29564340877423595, + "render": 30.678313442326466, + "tick": 4.647872053591402, + "update": 1.206680115073099 + }, + "seconds": 12.032189739227295, + "slow_phases_avg_ms": { + "prepare": 0.37793900569279987, + "render": 66.15962092081706, + "tick": 5.583541075388591, + "update": 1.5741689602533977 + } + }, + "ocean": { + "avg_fps": 8.272097120557788, + "cpu": { + "avg_ms": 96.70907358733974, + "max_ms": 208.84027099609375, + "p50_ms": 89.04510498046875, + "p95_ms": 169.3397979736328, + "p99_ms": 208.84027099609375 + }, + "frames": 98, + "gpu": { + "avg_ms": 57.298700176939676, + "max_ms": 66.62165832519531, + "p50_ms": 57.89077377319336, + "p95_ms": 65.73504638671875, + "p99_ms": 66.62165832519531 + }, + "low_1pct_fps": 4.785729156618201, + "max_ms": 208.95457458496094, + "p50_ms": 140.0601348876953, + "p95_ms": 178.57022094726562, + "p99_ms": 208.95457458496094, + "phases_avg_ms": { + "prepare": 3.3946731230434106, + "render": 34.994675042982, + "tick": 57.14290783599932, + "update": 1.177816742536973 + }, + "seconds": 11.847056262969971, + "slow_phases_avg_ms": { + "prepare": 7.7776899337768555, + "render": 70.36097717285156, + "tick": 128.46734619140625, + "update": 2.2351090908050537 + } + }, + "mountain": { + "avg_fps": 11.65883600782651, + "cpu": { + "avg_ms": 56.6912090659987, + "max_ms": 107.11215209960938, + "p50_ms": 77.04230499267578, + "p95_ms": 97.60908508300781, + "p99_ms": 104.08527374267578 + }, + "frames": 141, + "gpu": { + "avg_ms": 70.81221792731486, + "max_ms": 96.33728790283203, + "p50_ms": 69.16046905517578, + "p95_ms": 86.61634063720703, + "p99_ms": 92.56858825683594 + }, + "low_1pct_fps": 4.93309783391495, + "max_ms": 216.64273071289062, + "p50_ms": 81.59197235107422, + "p95_ms": 104.20377349853516, + "p99_ms": 188.7820281982422, + "phases_avg_ms": { + "prepare": 0.31791428133105554, + "render": 45.35119773817401, + "tick": 9.391353438086544, + "update": 1.6317692605104852 + }, + "seconds": 12.093831657409668, + "slow_phases_avg_ms": { + "prepare": 0.348672017455101, + "render": 86.63534545898438, + "tick": 13.065274715423584, + "update": 5.5503233671188354 + } + } + }, + "32": { + "renderer": { + "backend": "Vulkan", + "drawn_sections": 119, + "gpu": "llvmpipe (LLVM 21.1.8, 256 bits)", + "present_mode": "Mailbox", + "size": [ + 1600, + 1000 + ], + "uploaded_bytes": 222619264 + }, + "village": { + "avg_fps": 5.310476400246329, + "cpu": { + "avg_ms": 111.2176975607872, + "max_ms": 224.16696166992188, + "p50_ms": 76.4469985961914, + "p95_ms": 218.82273864746094, + "p99_ms": 224.16696166992188 + }, + "frames": 64, + "gpu": { + "avg_ms": 121.35315322875977, + "max_ms": 171.11207580566406, + "p50_ms": 125.45780944824219, + "p95_ms": 166.71322631835938, + "p99_ms": 171.11207580566406 + }, + "low_1pct_fps": 3.59762228435401, + "max_ms": 277.96136474609375, + "p50_ms": 192.1078338623047, + "p95_ms": 232.86318969726562, + "p99_ms": 277.96136474609375, + "phases_avg_ms": { + "prepare": 0.524940284434706, + "render": 56.89460512250662, + "tick": 38.0364211499691, + "update": 15.762759290635586 + }, + "seconds": 12.051649452209473, + "slow_phases_avg_ms": { + "prepare": 0.5129500031471252, + "render": 147.3928985595703, + "tick": 62.813438415527344, + "update": 13.448556900024414 + } + }, + "forest": { + "avg_fps": 3.899515654388116, + "cpu": { + "avg_ms": 155.46855975211935, + "max_ms": 270.7467041015625, + "p50_ms": 83.60679626464844, + "p95_ms": 268.6576843261719, + "p99_ms": 270.7467041015625 + }, + "frames": 47, + "gpu": { + "avg_ms": 192.77972445280656, + "max_ms": 225.69723510742188, + "p50_ms": 189.4962615966797, + "p95_ms": 217.36190795898438, + "p99_ms": 225.69723510742188 + }, + "low_1pct_fps": 3.3773198460417087, + "max_ms": 296.0927734375, + "p50_ms": 259.49017333984375, + "p95_ms": 283.4007568359375, + "p99_ms": 296.0927734375, + "phases_avg_ms": { + "prepare": 0.5114446409205173, + "render": 99.58217374821926, + "tick": 43.03971359577585, + "update": 12.336258025879555 + }, + "seconds": 12.052778900146484, + "slow_phases_avg_ms": { + "prepare": 0.5626839995384216, + "render": 208.71124267578125, + "tick": 53.47932052612305, + "update": 7.994467258453369 + } + }, + "ocean": { + "avg_fps": 2.9455219461811217, + "cpu": { + "avg_ms": 287.98993862376494, + "max_ms": 464.7646484375, + "p50_ms": 286.4447326660156, + "p95_ms": 444.6121520996094, + "p99_ms": 464.7646484375 + }, + "frames": 34, + "gpu": { + "avg_ms": 116.96576734270369, + "max_ms": 158.26394653320312, + "p50_ms": 106.45819854736328, + "p95_ms": 158.1454620361328, + "p99_ms": 158.26394653320312 + }, + "low_1pct_fps": 2.151113067092828, + "max_ms": 464.8756103515625, + "p50_ms": 315.1367492675781, + "p95_ms": 456.3304138183594, + "p99_ms": 464.8756103515625, + "phases_avg_ms": { + "prepare": 4.395756518139558, + "render": 69.52432030789993, + "tick": 206.13154108384077, + "update": 7.93927874284632 + }, + "seconds": 11.542945739746093, + "slow_phases_avg_ms": { + "prepare": 4.144052982330322, + "render": 166.14959716796875, + "tick": 285.5132751464844, + "update": 8.958683967590332 + } + }, + "mountain": { + "avg_fps": 3.983176689759444, + "cpu": { + "avg_ms": 171.41208145466257, + "max_ms": 413.8367919921875, + "p50_ms": 164.3318328857422, + "p95_ms": 360.7731628417969, + "p99_ms": 413.8367919921875 + }, + "frames": 47, + "gpu": { + "avg_ms": 166.80018520355225, + "max_ms": 304.8785400390625, + "p50_ms": 143.19728088378906, + "p95_ms": 275.3953552246094, + "p99_ms": 304.8785400390625 + }, + "low_1pct_fps": 2.418344167836982, + "max_ms": 413.5060729980469, + "p50_ms": 230.7030029296875, + "p95_ms": 365.4028625488281, + "p99_ms": 413.5060729980469, + "phases_avg_ms": { + "prepare": 0.496992789684458, + "render": 94.4349257743105, + "tick": 61.33542941478973, + "update": 15.14569672117842 + }, + "seconds": 11.799627197265625, + "slow_phases_avg_ms": { + "prepare": 0.4748440086841583, + "render": 312.3215637207031, + "tick": 86.37409973144531, + "update": 14.667168617248535 + } + } + } + }, + "load_before": [ + 8.4560546875, + 5.08544921875, + 4.68798828125 + ], + "load_after": [ + 10.98291015625, + 7.201171875, + 5.5615234375 + ] +} diff --git a/docs/graphics.md b/docs/graphics.md index b5c0db010d..c2f8675a9c 100644 --- a/docs/graphics.md +++ b/docs/graphics.md @@ -46,6 +46,46 @@ vscreen is a headless compositor whose frames are software-rendered (lavapipe), Two tools find where a slow frame goes: `HORIZON_SPIKES=MS` prints the timed spans (ticks by system, streaming, uploads, saving, renderer) of every frame slower than MS milliseconds, and a frame-pointer build (`RUSTFLAGS="-C force-frame-pointers=yes"`) profiles with `perf record --call-graph fp`. +## Results + +Baseline `27a32cc3` (main) against `9006566b`, the same full run (render distances 8, 16 then 32 in one fresh world), on ludodesktop. + +RTX 4080, `--offscreen` (`benchmarks/graphics/baseline-4080.json`, `after-4080.json`): + +| RD | scene | avg FPS | 1% low FPS | p99 ms | CPU ms/frame | GPU ms/frame | +| --- | --- | --- | --- | --- | --- | --- | +| 8 | village | 363 → 2409 | 21.6 → 160.8 | 37 → 1 | 2.7 → 0.4 | 0.42 → 0.10 | +| 8 | forest | 613 → 1099 | 49.6 → 82.9 | 10 → 10 | 1.6 → 0.9 | 0.40 → 0.26 | +| 8 | ocean | 323 → 687 | 5.4 → 47.5 | 33 → 16 | 2.7 → 1.4 | 0.24 → 0.37 | +| 8 | mountain | 28 → 344 | 7.4 → 30.0 | 111 → 33 | 12.4 → 1.6 | 0.46 → 0.34 | +| 16 | village | 8 → 1041 | 2.4 → 64.0 | 409 → 10 | 138.3 → 1.0 | 3.59 → 0.23 | +| 16 | forest | 28 → 316 | 0.5 → 49.6 | 159 → 18 | 37.9 → 3.2 | 2.68 → 0.75 | +| 16 | ocean | 59 → 385 | 10.5 → 72.0 | 85 → 12 | 16.8 → 2.6 | 1.96 → 0.68 | +| 16 | mountain | 27 → 220 | 7.8 → 30.0 | 109 → 33 | 20.2 → 3.1 | 7.14 → 0.94 | +| 32 | village | 4 → 48 | 2.6 → 0.8 | 387 → 76 | 244.2 → 9.4 | 10.36 → 1.77 | +| 32 | forest | 8 → 28 | 3.7 → 0.9 | 261 → 1108 | 118.7 → 40.1 | 15.90 → 2.30 | +| 32 | ocean | 2 → 67 | 1.6 → 10.1 | 626 → 95 | 424.8 → 14.7 | 9.48 → 2.91 | +| 32 | mountain | 3 → 29 | 2.5 → 15.2 | 407 → 64 | 300.5 → 16.1 | 9.73 → 8.47 | + +lavapipe on vscreen, CPU-rendered (`baseline-lavapipe.json`, `after-lavapipe.json`); at 16 and 32 chunks most of the frame is software rasterisation, which no change here touches: + +| RD | scene | avg FPS | 1% low FPS | p99 ms | CPU ms/frame | GPU ms/frame | +| --- | --- | --- | --- | --- | --- | --- | +| 8 | village | 16 → 58 | 6.6 → 31.3 | 134 → 29 | 48.2 → 11.4 | 26.73 → 13.52 | +| 8 | forest | 20 → 42 | 9.9 → 20.0 | 95 → 37 | 31.0 → 18.0 | 37.27 → 21.36 | +| 8 | ocean | 28 → 60 | 1.5 → 34.8 | 181 → 27 | 25.7 → 10.9 | 18.86 → 12.74 | +| 8 | mountain | 27 → 38 | 11.2 → 27.3 | 75 → 34 | 22.5 → 11.5 | 23.76 → 14.11 | +| 16 | village | 11 → 21 | 4.2 → 8.8 | 227 → 75 | 69.2 → 31.8 | 49.04 → 40.50 | +| 16 | forest | 12 → 18 | 5.7 → 11.5 | 137 → 81 | 58.4 → 36.8 | 56.45 → 47.82 | +| 16 | ocean | 8 → 8 | 2.6 → 4.8 | 385 → 209 | 98.4 → 96.7 | 71.51 → 57.30 | +| 16 | mountain | 6 → 12 | 3.1 → 4.9 | 321 → 189 | 124.9 → 56.7 | 95.47 → 70.81 | +| 32 | village | 3 → 5 | 2.0 → 3.6 | 497 → 278 | 345.6 → 111.2 | 85.50 → 121.35 | +| 32 | forest | 2 → 4 | 1.5 → 3.4 | 656 → 296 | 354.8 → 155.5 | 201.54 → 192.78 | +| 32 | ocean | 3 → 3 | 1.2 → 2.2 | 849 → 465 | 330.8 → 288.0 | 113.80 → 116.97 | +| 32 | mountain | 3 → 4 | 1.8 → 2.4 | 570 → 414 | 325.2 → 171.4 | 104.99 → 166.80 | + +Render distance 32 still has long stalls in the forest and village flights: the slowest frames are game ticks (mob AI bursts as chunks load, and thousands of dropped items piling up in some chunks, which the sequential run accumulates), not rendering. Results swing between runs on the shared desktop; the probe runs during the work saw RD 32 forest from 15 to 335 FPS depending on what the world had accumulated. + ## What changed The baseline was CPU-bound everywhere: on the RTX 4080 the GPU spent 0.2 to 16 ms per frame, the CPU 2 to 425.