WhatsLaggin report (manual)  10.6 s recorded, ended 2026-10-05 18:24:34
Minecraft 1.20.1, Forge 47.4.20, 482 mods, Java 17.0.8 OpenJDK 64-Bit Server VM, max heap 10.0 GB
GPU AMD Radeon RX 9070 XT (ATI Technologies Inc.), OpenGL 4.6.0 Core Profile Context 26.8.1.260810
CPU 16x AMD Ryzen 7 7800X3D 8-Core Processor, 16 threads, 31.4 GB RAM
Video 3440x1440 fullscreen @180 Hz, vsync off, fps limit unlimited, render distance 12, simulation 7, graphics fancy, shaders ComplementaryReimagined_r5.5.1 + EuphoriaPatches_1.6.8
World minecraft:overworld, 122 entities loaded

VERDICT
  391 fps average (2.56 ms per frame), 1% low 243 fps, 0.1% low 174 fps.
  GPU-BOUND: 1.62 ms of each frame (63%) is the CPU waiting for the GPU. The CPU part is only 0.94 ms.
  Optimising mod code on the render thread will not raise FPS until the GPU load drops.
  No stutters over 20 ms.

WHAT TO FIX (ranked by time lost per second of play)
  1. [gpu] GPU-bound: 63% of every frame is spent waiting on the GPU
       The CPU finishes its part of a frame in 0.94 ms and then waits 1.62 ms in glfwSwapBuffers for the GPU.
       GPU time for the frame's draw calls: p50 2.29 ms, p95 2.62 ms (timer queries).
       Cutting CPU work (mods below) will NOT raise FPS until GPU load drops.
       Biggest GPU levers: shader pack 'ComplementaryReimagined_r5.5.1 + EuphoriaPatches_1.6.8' (lower its shadow/volumetric settings), render distance (12), resolution (3440x1440), graphics mode (fancy)
  2. [cpu] oculus costs 0.21 ms per frame on the render thread
       23% of render-thread CPU time, mostly in world, 45% in its own code (rest is vanilla/library code it called)
       28%  LevelRenderer.iris$beginTranslucents:14834 [mixin handler from net.irisshaders.iris.mixin.MixinLevelRenderer]   <- LevelRenderer.renderLevel:1370
               hot: net.irisshaders.iris.pathways.HandRenderer.renderSolid:96 (17%), executing GL20C.glUseProgram (6.3%)
       16%  LevelRenderer.iris$beginLevelRender:14671 [mixin handler from net.irisshaders.iris.mixin.MixinLevelRenderer]   <- LevelRenderer.renderLevel:1149
               hot: net.irisshaders.iris.uniforms.custom.cached.CachedUniform.evaluateTo:92 (11%), executing Entity.getEyePosition:1518 (7.4%)
       16%  LevelRenderer.iris$renderTerrainShadows:14696 [mixin handler from net.irisshaders.iris.mixin.MixinLevelRenderer]   <- LevelRenderer.renderLevel:1155
               hot: net.irisshaders.iris.shadows.ShadowRenderer.renderShadows:467 (7.4%), executing EventBus.invoke (7.4%)
       no FPS gain while GPU-bound, but it adds to frame-time spikes
  3. [cpu] entity_model_features costs 0.11 ms per frame on the render thread
       12% of render-thread CPU time, mostly in world, 100% in its own code (rest is vanilla/library code it called)
       100%  traben.entity_model_features.models.parts.EMFModelPartVanilla.render:116   <- ModelPart.render:109
               hot: traben.entity_model_features.models.animation.math.asm.ASMParser.lambda$compileOrNull$0:162 (71%), executing EMF_ASM_Parsed_283.eval (71%)
       no FPS gain while GPU-bound, but it adds to frame-time spikes
  4. [cpu] gnetum costs 0.052 ms per frame on the render thread
       5.6% of render-thread CPU time, mostly in hud, 28% in its own code (rest is vanilla/library code it called)
       100%  ForgeGui.gnetum$render$mixinextras$bridge$65 [mixin wrapOperation from me.decce.gnetum.mixins.ForgeGuiMixin]   <- GameRenderer.render:945
               hot: ForgeGui.gnetum$postEvent:3631 [mixin merged from me.decce.gnetum.mixins.ForgeGuiMixin] (40%), executing ASMEventHandler.invoke:55 (19%)
       no FPS gain while GPU-bound, but it adds to frame-time spikes
  5. [cpu] embeddium costs 0.045 ms per frame on the render thread
       4.8% of render-thread CPU time, mostly in world, 43% in its own code (rest is vanilla/library code it called)
       46%  me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer.drawChunkLayer:259   <- LevelRenderer.renderChunkLayer:38702
               hot: me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass.startDrawing:62 (35%), executing JNI.callPV (18%)
       16%  LevelRenderer.renderCloudsFast:6112 [mixin handler from me.jellysquid.mods.sodium.mixin.features.render.world.clouds.WorldRendererMixin]   <- LevelRenderer.renderClouds:1900
               hot: me.jellysquid.mods.sodium.client.render.immediate.CloudRenderer.renderIris:1166 (17%), executing VertexBuffer._drawWithShader:128 (17%)
       11%  me.jellysquid.mods.sodium.client.util.sorting.VertexSorters$AbstractVertexSorter.sort:27   <- BufferBuilder.putSortedQuadIndices:6098
               hot: me.jellysquid.mods.sodium.client.util.sorting.MergeSort.mergeSort:85 (75%)
       no FPS gain while GPU-bound, but it adds to frame-time spikes
  6. [cpu] xaeroworldmap costs 0.023 ms per frame on the render thread
       2.5% of render-thread CPU time, mostly in no phase, 74% in its own code (rest is vanilla/library code it called)
       100%  xaero.map.events.ClientEventsForge.renderTick:32   <- Minecraft.runTick:1148
               hot: xaero.map.MapProcessor.onRenderProcess:521 (32%), executing ClientChunkCache.getChunk:30 (11%)
       no FPS gain while GPU-bound, but it adds to frame-time spikes
  7. [cpu] punchy costs 0.023 ms per frame on the render thread
       2.5% of render-thread CPU time, mostly in world, 63% in its own code (rest is vanilla/library code it called)
       79%  ItemInHandRenderer.punchy$renderFirstPersonModel:1160 [mixin handler from punchy.mixin.client.ItemInHandRendererMixin]   <- ItemInHandRenderer.m_109314_$mixinextras$wrapped$87
               hot: punchy.client.render.ToolTuning.resolveCustomModelData:1591 (20%), executing Object2ObjectOpenHashMap.get:316 (13%)
       16%  punchy.platform.ForgeClientPlatform.onClientTick:109   <- Minecraft.tick:1875
               hot: punchy.client.animation.PoseHandler.resolveTimelineSpeed:1942 (33%), executing Pattern.compile (33%)
       5.3%  LevelRenderer.punchy$renderReleasedItemParticles:11107 [mixin handler from punchy.mixin.client.LevelRendererMixin]   <- LevelRenderer.renderLevel:1427
       no FPS gain while GPU-bound, but it adds to frame-time spikes

FRAMES
  4,123 frames   p50 2.62 ms   p95 3.01 ms   p99 3.74 ms   worst 7.79 ms
  per frame:  tasks 0.009 ms  client tick 0.11 ms  render 0.78 ms  present 1.62 ms  other 0.044 ms
  inside those:  swap 1.62 ms  world 0.63 ms  hud 0.11 ms  screen 0.022 ms
  client tick: 2.07 ms per tick, 20.0 ticks per second
  GPU busy per frame (timer queries): p50 2.29 ms   p95 2.62 ms   p99 2.65 ms

RENDER THREAD CPU BY MOD (sampled; excludes GPU wait, fps limiter and blocked time)
  2,111 samples: CPU work 37%, GPU wait 63%, limiter 0.0%, blocked on other threads 0.0%
  mods caused 83% of render-thread CPU work, vanilla/forge/driver the rest
  17% of CPU work is inside OpenGL calls (driver work or a GPU sync), mostly glUseProgram; the mod that made the call is charged for it below
  ms/frame  share  own   mod                          mostly in
  0.21 ms   23%    45%   oculus                       world
  0.11 ms   12%    100%  entity_model_features        world
  0.099 ms  10%    86%   minecraft (vanilla)          world
  0.057 ms  6.1%   100%  forge (loader, events)       world
  0.052 ms  5.6%   28%   gnetum                       hud
  0.045 ms  4.8%   43%   embeddium                    world
  0.023 ms  2.5%   74%   xaeroworldmap                no phase
  0.023 ms  2.5%   63%   punchy                       world
  0.023 ms  2.5%   26%   immediatelyfast              hud
  0.021 ms  2.2%   88%   xaerominimap                 client tick
  0.018 ms  1.9%   6.7%  asyncparticles               world
  0.018 ms  1.9%   53%   collections_of_optimizations world
  0.016 ms  1.7%   46%   xaerolib                     hud
  0.013 ms  1.4%   100%  fancymenu                    world
  0.012 ms  1.3%   60%   brute_force_culling_revived  client tick
  0.20 ms   67 more below 0.5% each

HOT PATHS (where each mod's render-thread time goes; SRG names translated; <- = called from)
  oculus  0.21 ms/frame, 23%
    28%   LevelRenderer.iris$beginTranslucents:14834 [mixin handler from net.irisshaders.iris.mixin.MixinLevelRenderer]  <- LevelRenderer.renderLevel:1370
          hot net.irisshaders.iris.pathways.HandRenderer.renderSolid:96 17%
          executing GL20C.glUseProgram 6.3%
    16%   LevelRenderer.iris$beginLevelRender:14671 [mixin handler from net.irisshaders.iris.mixin.MixinLevelRenderer]  <- LevelRenderer.renderLevel:1149
          hot net.irisshaders.iris.uniforms.custom.cached.CachedUniform.evaluateTo:92 11%
          executing Entity.getEyePosition:1518 7.4%
    16%   LevelRenderer.iris$renderTerrainShadows:14696 [mixin handler from net.irisshaders.iris.mixin.MixinLevelRenderer]  <- LevelRenderer.renderLevel:1155
          hot net.irisshaders.iris.shadows.ShadowRenderer.renderShadows:467 7.4%
          executing EventBus.invoke 7.4%
  entity_model_features  0.11 ms/frame, 12%
    100%  traben.entity_model_features.models.parts.EMFModelPartVanilla.render:116  <- ModelPart.render:109
          hot traben.entity_model_features.models.animation.math.asm.ASMParser.lambda$compileOrNull$0:162 71%
          executing EMF_ASM_Parsed_283.eval 71%
  minecraft (vanilla)  0.099 ms/frame, 10%, hottest vanilla methods:
    17%   Entity.shouldRender:1562  <- me.decce.ixeris.RenderThreadStarter.run:39
    12%   ClientChunkCache.getChunk:30  <- ClientLevel.asyncparticles_animateTick:21586 [mixin wrapMethod from forge.fun.qu_an.minecraft.asyncparticles.client.mixin.core.animate_tick.MixinClientLevel_AnimateTick]
    8.6%  LevelRenderer.renderLevel  <- me.decce.ixeris.RenderThreadStarter.run:39
  gnetum  0.052 ms/frame, 5.6%
    100%  ForgeGui.gnetum$render$mixinextras$bridge$65 [mixin wrapOperation from me.decce.gnetum.mixins.ForgeGuiMixin]  <- GameRenderer.render:945
          hot ForgeGui.gnetum$postEvent:3631 [mixin merged from me.decce.gnetum.mixins.ForgeGuiMixin] 40%
          executing ASMEventHandler.invoke:55 19%
  embeddium  0.045 ms/frame, 4.8%
    46%   me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer.drawChunkLayer:259  <- LevelRenderer.renderChunkLayer:38702
          hot me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass.startDrawing:62 35%
          executing JNI.callPV 18%
    16%   LevelRenderer.renderCloudsFast:6112 [mixin handler from me.jellysquid.mods.sodium.mixin.features.render.world.clouds.WorldRendererMixin]  <- LevelRenderer.renderClouds:1900
          hot me.jellysquid.mods.sodium.client.render.immediate.CloudRenderer.renderIris:1166 17%
          executing VertexBuffer._drawWithShader:128 17%
    11%   me.jellysquid.mods.sodium.client.util.sorting.VertexSorters$AbstractVertexSorter.sort:27  <- BufferBuilder.putSortedQuadIndices:6098
          hot me.jellysquid.mods.sodium.client.util.sorting.MergeSort.mergeSort:85 75%
  xaeroworldmap  0.023 ms/frame, 2.5%
    100%  xaero.map.events.ClientEventsForge.renderTick:32  <- Minecraft.runTick:1148
          hot xaero.map.MapProcessor.onRenderProcess:521 32%
          executing ClientChunkCache.getChunk:30 11%
  punchy  0.023 ms/frame, 2.5%
    79%   ItemInHandRenderer.punchy$renderFirstPersonModel:1160 [mixin handler from punchy.mixin.client.ItemInHandRendererMixin]  <- ItemInHandRenderer.m_109314_$mixinextras$wrapped$87
          hot punchy.client.render.ToolTuning.resolveCustomModelData:1591 20%
          executing Object2ObjectOpenHashMap.get:316 13%
    16%   punchy.platform.ForgeClientPlatform.onClientTick:109  <- Minecraft.tick:1875
          hot punchy.client.animation.PoseHandler.resolveTimelineSpeed:1942 33%
          executing Pattern.compile 33%
    5.3%  LevelRenderer.punchy$renderReleasedItemParticles:11107 [mixin handler from punchy.mixin.client.LevelRendererMixin]  <- LevelRenderer.renderLevel:1427
  immediatelyfast  0.023 ms/frame, 2.5%
    21%   Gui.endBatching:15209 [mixin handler from net.raphimc.immediatelyfast.injection.mixins.hud_batching.MixinInGameHud]  <- Gui.renderCrosshair:392
          hot net.raphimc.immediatelyfast.feature.core.BatchableBufferSource.endBatch:135 100%
          executing GL20C.glUseProgram 25%
    16%   ChatComponent.endBatching:4595 [mixin handler from net.raphimc.immediatelyfast.injection.mixins.hud_batching.MixinChatHud]  <- ChatComponent.render:168
          hot net.raphimc.immediatelyfast.feature.core.BatchableBufferSource.endBatch:135 33%
          executing GL20C.glUseProgram 33%
    16%   net.raphimc.immediatelyfast.feature.core.BatchableBufferSource.endBatch:116  <- xaero.hud.minimap.player.tracker.PlayerTrackerMinimapElementRenderer.postRender:82
          hot net.raphimc.immediatelyfast.feature.core.BatchableBufferSource.endLastBatch:95 33%
          executing RenderStateShard.setupRenderState:37 33%

MEMORY AND GC
  allocated 1.2 GB (117 MB/s, exact, all threads), max heap 10.0 GB
  by mod (JFR samples scaled to each thread's exact allocation; 96% of bytes covered):
    18 MB/s   15%    minecraft (vanilla)       110 samples
        8.2%  EntityRenderDispatcher.shouldRender:127 -> CallbackInfoReturnable
        7.2%  SortedArraySet.iterator:192 -> SortedArraySet$ArrayIterator
        7.2%  NaturalSpawner.spawnCategoryForPosition:136 -> BlockPos$MutableBlockPos
    14 MB/s   12%    oculus                    39 samples
        10%  net.irisshaders.batchedentityrendering.impl.SegmentedBufferBuilder.getSegments:64 -> Vector3f
        10%  net.irisshaders.iris.pipeline.IrisRenderingPipeline.setPhase:811 -> String
        10%  LevelRenderer.batchedentityrendering$sortEntityList:7626 [mixin localvar from net.irisshaders.batchedentityrendering.mixin.MixinLevelRenderer_EntityListSorting] -> Object;
    11 MB/s   9.2%   radium                    34 samples
        43%  CompoundTag.useFasterCollection:1129 [mixin modify from me.jellysquid.mods.lithium.mixin.alloc.nbt.NbtCompoundMixin] -> Object;
        10%  CompoundTag.useFasterCollection:1129 [mixin modify from me.jellysquid.mods.lithium.mixin.alloc.nbt.NbtCompoundMixin] -> Object2ObjectOpenHashMap
        8.7%  me.jellysquid.mods.lithium.common.util.collections.HashedReferenceList.<init>:21 -> Object;
    7 MB/s    5.9%   punchy                    19 samples
        11%  punchy.config.PunchyConfig.findBlacklistMatch:698 -> HashMap$Node;
        11%  punchy.client.render.ResourcePackItemTransformResolver.resolve:47 -> [B
        5.3%  punchy.config.PunchyTuningConfig.copyGroupEntry:7286 -> [C
    5 MB/s    4.3%   immediatelyfast           14 samples
        14%  net.raphimc.immediatelyfast.feature.core.BatchableBufferSource.endBatch:135 -> BufferBuilder$DrawState
        14%  net.raphimc.immediatelyfast.feature.core.BatchableBufferSource.getOrCreateBufferBuilder -> CallbackInfoReturnable
        14%  net.raphimc.immediatelyfast.feature.batching.RenderSystemState.current:26 -> RenderSystemState
    5 MB/s    4.3%   gnetum                    14 samples
        43%  me.decce.gnetum.PassManager.cachingDisabled -> 443040018
        14%  me.decce.gnetum.PassManager.cachingDisabled -> 1248680071
        7.1%  ForgeGui.lambda$gnetum$renderLayers$7:3567 [mixin merged from me.decce.gnetum.mixins.ForgeGuiMixin] -> Matrix3f
    5 MB/s    4.1%   embeddium                 25 samples
        15%  me.jellysquid.mods.sodium.client.util.sorting.VertexSorters$AbstractVertexSorter.mergeSort:31 -> [F
        15%  BufferBuilder.onFormatChanged:5580 [mixin handler from me.jellysquid.mods.sodium.mixin.core.render.immediate.consumer.BufferBuilderMixin] -> SodiumBufferBuilder
        15%  me.jellysquid.mods.sodium.client.render.chunk.ChunkRenderMatrices.from:11 -> Matrix4f
    5 MB/s    4.0%   entity_model_features     13 samples
        62%  traben.entity_model_features.models.animation.math.EMFMath.getEntityVariable:99 -> Float
        38%  traben.entity_model_features.models.animation.math.EMFMath.setEntityVariable:92 -> Float
    3 MB/s    2.6%   alexscaves                9 samples
        24%  com.github.alexmodguy.alexscaves.client.event.ClientEvents.lambda$calculateBiomeFogColor$5:936 -> Vec3
        21%  Entity.ac_collide:51746 [mixin handler from com.github.alexmodguy.alexscaves.mixin.EntityMixin] -> ArrayList
        12%  com.github.alexmodguy.alexscaves.client.event.ClientEvents.lambda$calculateBiomeWaterFogColor$6:947 -> Vec3
    3 MB/s    2.2%   asyncparticles            100 samples
        28%  forge.fun.qu_an.minecraft.asyncparticles.client.core.particle.gpu_acceleration.IParticleRenderer.prepareShader:30 -> String
        21%  ParticleEngine.lambda$tickTail$3:11686 [mixin merged from forge.fun.qu_an.minecraft.asyncparticles.client.mixin.core.particle.gpu_acceleration.MixinParticleEngine] -> LocalDoubleRefImpl
        20%  ParticleEngine.lambda$tickTail$3:11686 [mixin merged from forge.fun.qu_an.minecraft.asyncparticles.client.mixin.core.particle.gpu_acceleration.MixinParticleEngine] -> AABB

INTEGRATED SERVER (single player; this is world lag, not FPS)
  211 ticks, mspt mean 5.90 ms, p50 5.77 ms, p95 7.67 ms, worst 10 ms, 0 over 50 ms
    2.08 ms/tick  35%    minecraft (vanilla)       
    0.44 ms/tick  7.4%   forge (loader, events)    
    0.36 ms/tick  6.0%   radium                    EntitySectionStorage.forEachInBox:562 [mixin handler from me.jellysquid.mods.lithium.mixin.entity.fast_retrieval.SectionedEntityCacheMixin]
    0.22 ms/tick  3.7%   linggango_tweaks          com.misanthropy.linggango.linggango_tweaks.tweak.gate.MobStages.onPotentialSpawns:130
    0.19 ms/tick  3.2%   eeeabsmobs                com.eeeab.eeeabsmobs.sever.entity.mob.relicron.EntityRelicAnnihilator.tick:333
    0.16 ms/tick  2.8%   pehkui                    Entity.pehkui$tick:34737 [mixin handler from virtuoel.pehkui.mixin.EntityMixin]
    0.16 ms/tick  2.8%   servercore                NaturalSpawner.servercore$fastBiomeLookup:2025 [mixin redirect from me.wesley1808.servercore.mixin.optimizations.biome_lookups.NaturalSpawnerMixin]
    0.16 ms/tick  2.8%   curios                    top.theillusivec4.curios.common.capability.CurioInventoryCapability$CurioInventoryWrapper.findFirstCurio:181

THREADS (exact CPU per thread group; 'runs' = what JFR saw executing on it)
  the game used 0.66 of 16 cores, whole machine 19% busy
  cores  n    allocated   group                            runs
  0.38   1    836 MB      Render thread                    entity_model_features 32%, minecraft 9.0%, punchy 7.5%
  0.12   1    325 MB      Server thread                    minecraft 26%, radium 7.4%
  0.09   1    47 MB       JFR Event Stream #               no JFR samples (idle or native)

ENTITIES, BLOCK ENTITIES, SCREENS (exact timings; per second of recording)
  entity tick:
    7.47 ms/s  20/s     373 us   minecraft:player                            worst 0.68 ms at 665, 193, -1746
    3.82 ms/s  260/s    15 us    ars_nouveau:starbuncle                      worst 0.13 ms at 707, 67, -1651
    1.63 ms/s  80/s     20 us    ars_nouveau:whirlisprig                     worst 0.16 ms at 621, 69, -1684
  server entity tick:
    8.30 ms/s  249/s    33 us    eeeabsmobs:relic_observer                   worst 0.21 ms at 897, -8, -1040
    4.96 ms/s  193/s    26 us    eeeabsmobs:relic_ripper                     worst 0.23 ms at 886, 1, -1041
    4.65 ms/s  119/s    39 us    ars_nouveau:whirlisprig                     worst 0.17 ms at 633, 65, -1806
    4.15 ms/s  235/s    18 us    alexsmobs:bison                             worst 0.18 ms at 632, 64, -1765
    3.90 ms/s  119/s    33 us    minecraft:creeper                           worst 0.19 ms at 661, 69, -1735
    3.52 ms/s  112/s    31 us    terramity:green_fairy                       worst 0.31 ms at 692, 69, -1733
  server block entity tick:
    2.86 ms/s  11,999/s 0 us     minecraft:sculk_sensor                      worst 0.10 ms at 775, -49, -1235
    1.14 ms/s  3,961/s  0 us     minecraft:sculk_catalyst                    worst 0.053 ms at 770, 0, -1272
  screen:
    8.65 ms/s  95/s     91 us    net.minecraft.client.gui.screens.ChatScreen worst 0.45 ms

JVM AND I/O
  class loads over 1 ms: 0 (0 ms), on the render/server thread 0 (0 ms)
  log output: 0.0 lines/s
  exceptions thrown: 142.9/s, top: 74.3/s  ClassNotFoundException from tooltipoverhaul at Screen.to$emiRecord:5826 [mixin handler from dev.xylonity.tooltipoverhaul.mixin.ScreenRecorderMixin]

MOD VERSIONS (mods named in the findings)
  oculus 1.8.3;  entity_model_features 3.3.10;  gnetum 2.5.1+1.20.1-forge;  
  embeddium 0.3.32-beta.102-dirty+mc1.20.1;  xaeroworldmap 1.46.0;  punchy 2.8c;  

RECORDING
  stack sampler every 5 ms: 2,111 render-thread, 216 server-thread samples (server only while ticking)
  JFR on (cpu, allocation, locks, file io, class loading, safepoints, exceptions): 238 CPU samples, 755 allocation samples
  method names: SRG ids translated to Mojang names; mixin handlers are charged to the mod whose mixin injected them
  'own' = share of a mod's time spent in its own classes; the rest is vanilla or library code it called
