WhatsLaggin report (manual)  31.2 s recorded, ended 2026-10-23 03:15:02
Minecraft 1.20.1, Forge 47.4.20, 462 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.10.1.261008
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 Solas Shader V3.7b.zip
World minecraft:overworld, 1 entities loaded

VERDICT
  129 fps average (7.78 ms per frame), 1% low 103 fps, 0.1% low 90 fps.
  GPU-BOUND: 6.01 ms of each frame (77%) is the CPU waiting for the GPU. The CPU part is only 1.77 ms.
  Optimising mod code on the render thread will not raise FPS until the GPU load drops.
  No stutters over 23 ms.

WHAT TO FIX (ranked by time lost per second of play)
  1. [gpu] GPU-bound: 77% of every frame is spent waiting on the GPU
       The CPU finishes its part of a frame in 1.77 ms and then waits 6.01 ms in glfwSwapBuffers for the GPU.
       GPU time for the frame's draw calls: p50 7.08 ms, p95 8.19 ms (timer queries).
       Cutting CPU work (mods below) will NOT raise FPS until GPU load drops.
       Biggest GPU levers: shader pack 'Solas Shader V3.7b.zip' (lower its shadow/volumetric settings), render distance (12), resolution (3440x1440), graphics mode (fancy)
  2. [world] minecraft:player (entity render) costs 43 ms every second
       4,008 calls, 334 us each, worst 1.15 ms at 2527, 68, 778
  3. [cpu] oculus costs 0.32 ms per frame on the render thread
       18% of render-thread CPU time, mostly in world, 35% in its own code (rest is vanilla/library code it called)
       42%  LevelRenderer.iris$renderTerrainShadows:16196 [mixin handler from net.irisshaders.iris.mixin.MixinLevelRenderer]   <- LevelRenderer.renderLevel:1155
               hot: net.irisshaders.iris.shadows.ShadowRenderer.renderPlayerEntity:687 (16%), executing ASMEventHandler.invoke:55 (8.3%)
       15%  LevelRenderer.iris$beginLevelRender:16171 [mixin handler from net.irisshaders.iris.mixin.MixinLevelRenderer]   <- LevelRenderer.renderLevel:1149
               hot: net.irisshaders.iris.gl.framebuffer.GlFramebuffer.bind:85 (16%), executing GL30C.glBindFramebuffer (18%)
       13%  LevelRenderer.iris$beginTranslucents:16334 [mixin handler from net.irisshaders.iris.mixin.MixinLevelRenderer]   <- LevelRenderer.renderLevel:1370
               hot: net.irisshaders.batchedentityrendering.impl.BufferSegmentRenderer.drawInner:24 (12%), executing GL43C.glCopyImageSubData (9.1%)
       no FPS gain while GPU-bound, but it adds to frame-time spikes
  4. [cpu] embeddium costs 0.22 ms per frame on the render thread
       13% of render-thread CPU time, mostly in world, 59% in its own code (rest is vanilla/library code it called)
       80%  me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer.drawChunkLayer:284   <- LevelRenderer.renderChunkLayer:40702
               hot: me.jellysquid.mods.sodium.client.render.chunk.DefaultChunkRenderer.fillCommandBuffer:165 (34%), executing GL32C.nglMultiDrawElementsBaseVertex (28%)
       11%  me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer.setupTerrain:227   <- LevelRenderer.setupRender:40729
               hot: me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager.scheduleTranslucencyUpdates:172 (30%), executing Long2ReferenceOpenHashMap$MapIterator.nextEntry:662 (5.0%)
       no FPS gain while GPU-bound, but it adds to frame-time spikes
  5. [cpu] xaeroworldmap costs 0.17 ms per frame on the render thread
       9.6% of render-thread CPU time, mostly in no phase, 40% in its own code (rest is vanilla/library code it called)
       100%  xaero.map.events.ClientEventsForge.renderTick:32   <- Minecraft.runTick:1148
               hot: xaero.map.MapWriter.loadPixel:752 (29%), executing BlockAndTintGetter.getBrightness:15 (19%)
       no FPS gain while GPU-bound, but it adds to frame-time spikes
  6. [cpu] entity_model_features costs 0.14 ms per frame on the render thread
       8.0% of render-thread CPU time, mostly in world, 88% in its own code (rest is vanilla/library code it called)
       96%  traben.entity_model_features.models.parts.EMFModelPartVanilla.render:116   <- AgeableListModel.lambda$renderToBuffer$2:62
               hot: traben.entity_model_features.models.animation.math.asm.ASMParser.lambda$compileOrNull$0:162 (61%), executing EMF_ASM_Parsed_156.eval (61%)
       no FPS gain while GPU-bound, but it adds to frame-time spikes
  7. [cpu] gnetum costs 0.074 ms per frame on the render thread
       4.2% of render-thread CPU time, mostly in hud, 39% in its own code (rest is vanilla/library code it called)
       98%  ForgeGui.gnetum$render$mixinextras$bridge$64 [mixin wrapOperation from me.decce.gnetum.mixins.ForgeGuiMixin]   <- GameRenderer.render:945
               hot: ForgeGui.gnetum$postEvent:3130 [mixin merged from me.decce.gnetum.mixins.ForgeGuiMixin] (38%), executing ASMEventHandler.invoke:55 (21%)
       no FPS gain while GPU-bound, but it adds to frame-time spikes
  8. [cpu] collections_of_optimizations costs 0.062 ms per frame on the render thread
       3.6% of render-thread CPU time, mostly in client tick, 74% in its own code (rest is vanilla/library code it called)
       32%  ClientLevel.coo$planDisplayTick:25091 [mixin wrapMethod from com.misanthropy.collections_of_optimizations.mixin.subtleeffects.MixinClientLevelDisplayTick]   <- ClientLevel.animateTick [mixin handler from einstein.subtle_effects.mixin.client.ClientLevelMixin]
               hot: com.misanthropy.collections_of_optimizations.core.SubtleEffectsDisplayTick.run:161 (38%), executing Level.getGameTime:729 (25%)
       10%  BiomeManager.coo$cacheQuartLookup:1065 [mixin redirect from com.misanthropy.collections_of_optimizations.mixin.vanilla.MixinBiomeManagerQuartCache]   <- BiomeManager.getNoiseBiomeAtQuart:97
               executing LevelReader.getNoiseBiome:59 (60%)
       8.0%  Holder$Reference.coo$numberedContains:1037 [mixin redirect from com.misanthropy.collections_of_optimizations.mixin.vanilla.MixinHolderReferenceTagNumbers]   <- Holder$Reference.is:162
               hot: com.misanthropy.collections_of_optimizations.core.TagNumberSet.has:72 (100%), executing Arrays.binarySearch0 (100%)
       no FPS gain while GPU-bound, but it adds to frame-time spikes

FRAMES
  4,007 frames   p50 7.80 ms   p95 9.04 ms   p99 9.31 ms   worst 14 ms
  per frame:  tasks 0.019 ms  client tick 0.20 ms  render 1.33 ms  present 6.01 ms  other 0.22 ms
  inside those:  swap 6.01 ms  world 1.12 ms  hud 0.18 ms  screen 0.002 ms
  client tick: 1.29 ms per tick, 20.0 ticks per second
  GPU busy per frame (timer queries): p50 7.08 ms   p95 8.19 ms   p99 8.65 ms
  GPU time per pass (mean per frame, each pass also holds what mods drew at the stage before it):
    0.15 ms  2.2%  sky and frame setup   (p95 0.16 ms)
    4.30 ms  60%  solid terrain   (p95 4.98 ms)
    0.000 ms  <0.1%  cutout mipped terrain   (p95 0.002 ms)
    0.000 ms  <0.1%  cutout terrain   (p95 0.002 ms)
    0.037 ms  0.5%  entities   (p95 0.13 ms)
    0.000 ms  <0.1%  block entities   (p95 0.004 ms)
    1.17 ms  16%  translucent terrain   (p95 1.51 ms)
    0.000 ms  <0.1%  tripwire   (p95 0.003 ms)
    0.011 ms  0.2%  particles   (p95 0.059 ms)
    0.000 ms  <0.1%  weather and clouds   (p95 0.002 ms)
    1.12 ms  16%  end of level render   (p95 1.36 ms)
    0.000 ms  <0.1%  hand and post effects   (p95 0.002 ms)
    0.078 ms  1.1%  hud   (p95 0.26 ms)
    0.23 ms  3.3%  screens and rest of frame   (p95 0.93 ms)

RENDER THREAD CPU BY MOD (sampled; excludes GPU wait, fps limiter and blocked time)
  6,235 samples: CPU work 23%, GPU wait 77%, limiter 0.0%, blocked on other threads 0.0%
  mods caused 90% of render-thread CPU work, vanilla/forge/driver the rest
  16% of CPU work is inside OpenGL calls (driver work or a GPU sync), mostly glMultiDrawElementsBaseVertex; the mod that made the call is charged for it below
  ms/frame  share  own   mod                          mostly in
  0.32 ms   18%    35%   oculus                       world
  0.22 ms   13%    59%   embeddium                    world
  0.17 ms   9.6%   40%   xaeroworldmap                no phase
  0.14 ms   8.0%   88%   entity_model_features        world
  0.099 ms  5.6%   100%  forge (loader, events)       world
  0.079 ms  4.5%   84%   minecraft (vanilla)          world
  0.074 ms  4.2%   39%   gnetum                       hud
  0.062 ms  3.6%   74%   collections_of_optimizations client tick
  0.046 ms  2.6%   43%   linggango_tweaks             client tick
  0.041 ms  2.4%   61%   immediatelyfast              world
  0.029 ms  1.6%   70%   punchy                       world
  0.026 ms  1.5%   24%   entity_texture_features      world
  0.026 ms  1.5%   29%   asyncparticles               world
  0.025 ms  1.4%   60%   mahoutsukai                  world
  0.021 ms  1.2%   29%   create                       client tick
  0.37 ms   101 more below 0.5% each

HOT PATHS (where each mod's render-thread time goes; SRG names translated; <- = called from)
  oculus  0.32 ms/frame, 18%
    42%   LevelRenderer.iris$renderTerrainShadows:16196 [mixin handler from net.irisshaders.iris.mixin.MixinLevelRenderer]  <- LevelRenderer.renderLevel:1155
          hot net.irisshaders.iris.shadows.ShadowRenderer.renderPlayerEntity:687 16%
          executing ASMEventHandler.invoke:55 8.3%
    15%   LevelRenderer.iris$beginLevelRender:16171 [mixin handler from net.irisshaders.iris.mixin.MixinLevelRenderer]  <- LevelRenderer.renderLevel:1149
          hot net.irisshaders.iris.gl.framebuffer.GlFramebuffer.bind:85 16%
          executing GL30C.glBindFramebuffer 18%
    13%   LevelRenderer.iris$beginTranslucents:16334 [mixin handler from net.irisshaders.iris.mixin.MixinLevelRenderer]  <- LevelRenderer.renderLevel:1370
          hot net.irisshaders.batchedentityrendering.impl.BufferSegmentRenderer.drawInner:24 12%
          executing GL43C.glCopyImageSubData 9.1%
  embeddium  0.22 ms/frame, 13%
    80%   me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer.drawChunkLayer:284  <- LevelRenderer.renderChunkLayer:40702
          hot me.jellysquid.mods.sodium.client.render.chunk.DefaultChunkRenderer.fillCommandBuffer:165 34%
          executing GL32C.nglMultiDrawElementsBaseVertex 28%
    11%   me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer.setupTerrain:227  <- LevelRenderer.setupRender:40729
          hot me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager.scheduleTranslucencyUpdates:172 30%
          executing Long2ReferenceOpenHashMap$MapIterator.nextEntry:662 5.0%
  xaeroworldmap  0.17 ms/frame, 9.6%
    100%  xaero.map.events.ClientEventsForge.renderTick:32  <- Minecraft.runTick:1148
          hot xaero.map.MapWriter.loadPixel:752 29%
          executing BlockAndTintGetter.getBrightness:15 19%
  entity_model_features  0.14 ms/frame, 8.0%
    96%   traben.entity_model_features.models.parts.EMFModelPartVanilla.render:116  <- AgeableListModel.lambda$renderToBuffer$2:62
          hot traben.entity_model_features.models.animation.math.asm.ASMParser.lambda$compileOrNull$0:162 61%
          executing EMF_ASM_Parsed_156.eval 61%
  minecraft (vanilla)  0.079 ms/frame, 4.5%, hottest vanilla methods:
    6.3%  LevelChunk$BoundTickingBlockEntity.tick:688  <- me.decce.ixeris.RenderThreadStarter.run:39
    6.3%  LevelChunk$BoundTickingBlockEntity.getPos:719  <- me.decce.ixeris.RenderThreadStarter.run:39
    6.3%  LevelRenderer.renderSky:1868  <- me.decce.ixeris.RenderThreadStarter.run:39
          executing Unsafe.allocateInstance 25%
  gnetum  0.074 ms/frame, 4.2%
    98%   ForgeGui.gnetum$render$mixinextras$bridge$64 [mixin wrapOperation from me.decce.gnetum.mixins.ForgeGuiMixin]  <- GameRenderer.render:945
          hot ForgeGui.gnetum$postEvent:3130 [mixin merged from me.decce.gnetum.mixins.ForgeGuiMixin] 38%
          executing ASMEventHandler.invoke:55 21%
  collections_of_optimizations  0.062 ms/frame, 3.6%
    32%   ClientLevel.coo$planDisplayTick:25091 [mixin wrapMethod from com.misanthropy.collections_of_optimizations.mixin.subtleeffects.MixinClientLevelDisplayTick]  <- ClientLevel.animateTick [mixin handler from einstein.subtle_effects.mixin.client.ClientLevelMixin]
          hot com.misanthropy.collections_of_optimizations.core.SubtleEffectsDisplayTick.run:161 38%
          executing Level.getGameTime:729 25%
    10%   BiomeManager.coo$cacheQuartLookup:1065 [mixin redirect from com.misanthropy.collections_of_optimizations.mixin.vanilla.MixinBiomeManagerQuartCache]  <- BiomeManager.getNoiseBiomeAtQuart:97
          executing LevelReader.getNoiseBiome:59 60%
    8.0%  Holder$Reference.coo$numberedContains:1037 [mixin redirect from com.misanthropy.collections_of_optimizations.mixin.vanilla.MixinHolderReferenceTagNumbers]  <- Holder$Reference.is:162
          hot com.misanthropy.collections_of_optimizations.core.TagNumberSet.has:72 100%
          executing Arrays.binarySearch0 100%
  linggango_tweaks  0.046 ms/frame, 2.6%
    19%   com.misanthropy.linggango.linggango_tweaks.foliage.particle.FallingLeafParticle.render:158  <- ParticleEngine.render:3248
          hot com.misanthropy.linggango.linggango_tweaks.foliage.particle.Billboard.vertex:45 100%
          executing VertexConsumer.uv2:55 14%
    11%   snownee.jade.util.ClientProxy.lambda$init$0:113  <- ForgeGui.gnetum$postEvent:3138 [mixin merged from me.decce.gnetum.mixins.ForgeGuiMixin]
          hot snownee.jade.overlay.DisplayHelper.drawGradientRect:255 50%
          executing VertexConsumer.color:47 50%
    11%   com.misanthropy.linggango.linggango_tweaks.client.DynamicCrosshairHandler.onRenderCrosshair:205  <- ForgeGui.gnetum$postEvent:3130 [mixin merged from me.decce.gnetum.mixins.ForgeGuiMixin]
          executing BufferUploader._drawWithShader:33 25%

MEMORY AND GC
  allocated 1.7 GB (56 MB/s, exact, all threads), max heap 10.0 GB
  by mod (JFR samples scaled to each thread's exact allocation; 98% of bytes covered):
    8 MB/s    14%    minecraft (vanilla)       263 samples
        10%  Block.getSoundType -> CallbackInfoReturnable
        9.2%  BlockBehaviour$BlockStateBase.getLightBlock -> CallbackInfoReturnable
        8.2%  VertexConsumer.putBulkData:81 -> DirectByteBuffer
    6 MB/s    9.9%   embeddium                 194 samples
        15%  me.jellysquid.mods.sodium.client.render.chunk.lists.ChunkRenderList.<init>:17 -> [B
        9.6%  me.jellysquid.mods.sodium.client.render.chunk.compile.tasks.ChunkBuilderMeshingTask.execute:137 -> Iterators$9
        9.0%  me.jellysquid.mods.sodium.client.render.chunk.lists.ChunkRenderList.<init>:14 -> [B
    5 MB/s    9.5%   radium                    61 samples
        85%  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
    5 MB/s    8.3%   oculus                    43 samples
        9.3%  net.irisshaders.iris.shadows.ShadowRenderer.renderPlayerEntity:687 -> CallbackInfo
        7.0%  net.irisshaders.iris.pipeline.IrisRenderingPipeline.setPhase:811 -> String
        7.0%  net.irisshaders.iris.gl.uniform.FloatUniform.update:26 -> 882079309
    3 MB/s    6.2%   entity_model_features     32 samples
        31%  traben.entity_model_features.models.animation.math.EMFMath.getEntityVariable:99 -> Float
        25%  traben.entity_model_features.models.animation.math.EMFMath.setEntityVariable:92 -> Float
        12%  traben.entity_model_features.models.parts.EMFModelPart.renderLikeVanilla:363 -> Matrix3f
    3 MB/s    4.4%   punchy                    23 samples
        13%  punchy.client.state.SpearStateMachine.isSpearChargeType:373 -> [I
        8.7%  punchy.client.state.WalkOnWaterStateMachine.evaluateTrigger:737 -> BlockPos
    2 MB/s    2.7%   entity_texture_features   14 samples
        29%  traben.entity_texture_features.features.state.ETFEntityRenderStateViaReference.cacheEntityNBTForState:194 -> CompoundTag
        21%  traben.entity_texture_features.features.state.ETFEntityRenderStateViaReference.cacheEntityNBTForState:194 -> Optional
        7.1%  traben.entity_texture_features.features.state.ETFEntityRenderStateViaReference.cacheEntityNBTForState:194 -> DataResult
    1 MB/s    2.5%   gnetum                    13 samples
        15%  me.decce.gnetum.PassManager.cachingDisabled -> 906115446
        15%  ForgeGui.gnetum$renderLayers:3062 [mixin merged from me.decce.gnetum.mixins.ForgeGuiMixin] -> 1780001914
        15%  ForgeGui.gnetum$invokeWrapperSafe:3154 [mixin merged from me.decce.gnetum.mixins.ForgeGuiMixin] -> 256190418
    1 MB/s    2.3%   asyncparticles            628 samples
        17%  ParticleEngine.lambda$tickTail$3:13672 [mixin merged from forge.fun.qu_an.minecraft.asyncparticles.client.mixin.core.particle.gpu_acceleration.MixinParticleEngine] -> LocalDoubleRefImpl
        16%  forge.fun.qu_an.minecraft.asyncparticles.client.util.IterationSafeArrayList.listIterator:163 -> IterationSafeArrayList$ListItr
        13%  ParticleEngine.lambda$tickTail$3:13672 [mixin merged from forge.fun.qu_an.minecraft.asyncparticles.client.mixin.core.particle.gpu_acceleration.MixinParticleEngine] -> AABB
    1 MB/s    1.9%   immediatelyfast           10 samples
        20%  net.raphimc.immediatelyfast.feature.core.BatchableBufferSource.lambda$addNewFallbackBuffer$1:188 -> [J
        20%  net.raphimc.immediatelyfast.feature.core.BatchableBufferSource.<init>:53 -> [J
        10.0%  net.raphimc.immediatelyfast.feature.core.BatchableBufferSource.endBatch:133 -> ReferenceLinkedOpenHashSet$SetIterator

INTEGRATED SERVER (single player; this is world lag, not FPS)
  624 ticks, mspt mean 1.76 ms, p50 1.64 ms, p95 2.69 ms, worst 3.05 ms, 0 over 50 ms
    0.25 ms/tick  14%    minecraft (vanilla)       
    0.25 ms/tick  14%    ars_n_spells              com.otectus.arsnspells.events.ArsManaCalcHandler.onManaRegenCalc:95
    0.13 ms/tick  7.1%   irons_spellbooks          io.redspace.ironsspellbooks.player.ClientPlayerEvents.onClientEntityTick:111
    0.13 ms/tick  7.1%   ftbquests                 dev.ftb.mods.ftbquests.FTBQuestsEventHandler.playerTick:166
    0.13 ms/tick  7.1%   enigmaticlegacy           com.aizistral.enigmaticlegacy.handlers.EnigmaticEventHandler.onPlayerTick:1047
    0.13 ms/tick  7.1%   armageddon_mod            net.mcreator.armageddonmod.procedures.ElveniteArmorPreventionProcedureProcedure.onPlayerTick:33
    0.13 ms/tick  7.1%   curios                    top.theillusivec4.curios.common.capability.CurioInventoryCapability$CurioInventoryWrapper.findCurios:201
    0.13 ms/tick  7.1%   architectury              dev.architectury.event.forge.EventHandlerImplCommon.event:75

THREADS (exact CPU per thread group; 'runs' = what JFR saw executing on it)
  the game used 0.39 of 16 cores, whole machine 12% busy
  cores  n    allocated   group                            runs
  0.23   1    1.2 GB      Render thread                    xaeroworldmap 26%, entity_model_features 17%, collections_of_optimizations 7.3%
  0.04   10   173 MB      Chunk Render Task Executor ##    embeddium 35%, minecraft 33%, oculus 21%
  0.03   1    41 MB       JFR Event Stream #               no JFR samples (idle or native)

ENTITIES, BLOCK ENTITIES, SCREENS (exact timings; per second of recording)
  entity render:
    43 ms/s    128/s    334 us   minecraft:player                            worst 1.15 ms at 2527, 68, 778
  entity tick:
    7.24 ms/s  20/s     362 us   minecraft:player                            worst 0.73 ms at 2527, 68, 778

JVM AND I/O
  class loads over 1 ms: 0 (0 ms), on the render/server thread 0 (0 ms)
  log output: 0.1 lines/s
  exceptions thrown: 1.9/s, top: 2.0/s  NoDiscordClientException from optimized_rpc at dev.firstdark.rpc.exceptions.NoDiscordClientException.<init>:12

MOD VERSIONS (mods named in the findings)
  oculus 1.8.5;  embeddium 0.3.32-beta.113-dirty+mc1.20.1;  xaeroworldmap 1.46.0;  
  entity_model_features 3.3.11;  gnetum 2.5.1+1.20.1-forge;  collections_of_optimizations 5.5;  

RECORDING
  stack sampler every 5 ms: 6,235 render-thread, 14 server-thread samples (server only while ticking)
  JFR on (cpu, allocation, locks, file io, class loading, safepoints, exceptions): 416 CPU samples, 2,540 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
