Skip to content

[Audit][Medium] GpuBlockBuffer.getSlotForChunk uses O(n) linear scan instead of O(1) hash lookup #739

Description

@MichaelFisher1997

🔍 Module Scanned

(automated audit scan)

📝 Summary

The and functions perform O(n) linear scans through a hashmap's entries to find a chunk by its coordinates. For a buffer supporting up to 16,384 chunks, this causes significant performance degradation during GPU meshing operations where neighbor chunk slots are queried repeatedly.

📍 Location

  • File:
  • Function/Scope: (line 131) and (line 99)

🔴 Severity: Medium

  • Medium: Performance degradation, missing error handling, suboptimal patterns

💥 Impact

During GPU compute meshing in , four neighbor chunk slots are queried per chunk via . Each query performs a full linear scan through up to 16,384 hashmap entries. With hundreds of chunks per frame, this creates a measurable bottleneck in the meshing pipeline.

🔎 Evidence

The underlying storage is which stores as the value. To find a slot by chunk coordinates requires iterating all entries - even though the hashmap is already indexed by slot (a simple usize).

Compare with at line 151 which correctly uses the hashmap's built-in lookup:

🛠️ Proposed Fix

Replace the with two hashmaps:

    • keep as-is (maps slot → chunk coords)
    • NEW (maps chunk coords → slot)

Then in :

And in :

And in total used free shared buff/cache available
Mem: 16373460 1459352 7665044 51264 7655004 14914108
Swap: 3145724 0 3145724:

✅ Acceptance Criteria

  • All unit tests in pass
  • performs a single hashmap lookup (O(1)) instead of iterating all entries (O(n))
  • performs a single hashmap lookup instead of iterating all entries
  • Memory overhead is minimal: one additional usize per allocated chunk slot
  • The fix has been verified with Zig 0.16.0 + SDL3 Dev Environment
    Compiler: 0.16.0
    assets/shaders/vulkan/ui.frag
    assets/shaders/vulkan/shadow.frag
    assets/shaders/vulkan/ssao_blur.frag
    assets/shaders/vulkan/ui_tex.vert
    assets/shaders/vulkan/lpv_inject.comp
    assets/shaders/vulkan/taa.frag
    assets/shaders/vulkan/ui_tex.frag
    assets/shaders/vulkan/bloom_downsample.vert
    assets/shaders/vulkan/bloom_upsample.vert
    assets/shaders/vulkan/debug_shadow.vert
    assets/shaders/vulkan/fxaa.vert
    assets/shaders/vulkan/post_process.vert
    assets/shaders/vulkan/shadow.vert
    assets/shaders/vulkan/sky.vert
    assets/shaders/vulkan/ssao.vert
    assets/shaders/vulkan/taa.vert
    assets/shaders/vulkan/terrain.vert
    assets/shaders/vulkan/ui.vert
    assets/shaders/vulkan/ui_tex.vert
    assets/shaders/vulkan/water.vert
    assets/shaders/vulkan/bloom_downsample.frag
    assets/shaders/vulkan/bloom_upsample.frag
    assets/shaders/vulkan/debug_shadow.frag
    assets/shaders/vulkan/fxaa.frag
    assets/shaders/vulkan/g_pass.frag
    assets/shaders/vulkan/post_process.frag
    assets/shaders/vulkan/shadow.frag
    assets/shaders/vulkan/sky.frag
    assets/shaders/vulkan/ssao.frag
    assets/shaders/vulkan/ssao_blur.frag
    assets/shaders/vulkan/taa.frag
    assets/shaders/vulkan/terrain.frag
    assets/shaders/vulkan/terrain_debug.frag
    assets/shaders/vulkan/ui.frag
    assets/shaders/vulkan/ui_tex.frag
    assets/shaders/vulkan/water.frag
    assets/shaders/vulkan/culling.comp
    assets/shaders/vulkan/depth_pyramid.comp
    assets/shaders/vulkan/lpv_inject.comp
    assets/shaders/vulkan/lpv_propagate.comp
    assets/shaders/vulkan/mesh.comp
    assets/shaders/vulkan/ssao.frag
    assets/shaders/vulkan/ssao.vert
    assets/shaders/vulkan/taa.vert
    assets/shaders/vulkan/sky.frag
    assets/shaders/vulkan/water.vert
    assets/shaders/vulkan/debug_shadow.vert
    assets/shaders/vulkan/debug_shadow.frag
    assets/shaders/vulkan/culling.comp
    assets/shaders/vulkan/depth_pyramid.comp
    assets/shaders/vulkan/shadow.vert
    assets/shaders/vulkan/g_pass.frag
    assets/shaders/vulkan/sky.vert
    assets/shaders/vulkan/terrain.vert
    assets/shaders/vulkan/ui.vert
    assets/shaders/vulkan/water.frag
    assets/shaders/vulkan/lpv_propagate.comp
    assets/shaders/vulkan/mesh.comp
    assets/shaders/vulkan/terrain.frag

📚 References

  • defined in with proper hash/eq implementation
  • in Zig standard library provides O(1) average-case lookup
  • GPU meshing occurs in where neighbor slot lookups are frequent

Metadata

Metadata

Assignees

No one assigned

    Labels

    automated-auditIssues found by automated opencode audit scansbugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions