Zig Structs of Arrays (2024) (andreashohmann.com)

100 points by Tomte 4 days ago

smallstepforman 4 hours ago

The GPU loves arrays of structures AoS, since all vertex data fits in its triangle assembly cache. Once given to the GPU, the software side doesnt really care for all vertex parameters so this optimisation is pointless. Only relavent when you have instance rendering (leaves, grass) but then you only need an array of vec3’s, not the other parameters so back to normal arrays.

Meanwhile, game engines need operator overloading for adding/multiplying vectors (spatial transforms, lighting, physics) and core zig design philosophy prevents operator overloading.

Blind leading the blind. Disclaimer - I do professional rendering engines.

the__alchemist 15 minutes ago

> Meanwhile, game engines need operator overloading for adding/multiplying vectors (spatial transforms, lighting, physics) and core zig design philosophy prevents operator overloading.

This is a frustrating decision. My use cases for low level languages overlap closely with my use cases for vectors (etc) with operator overloading. It was one of the first things which put a bad taste in my mouth about Zig.

Ciantic 44 minutes ago

Rust should (eventually) support arrays of structures via compile-time reflection: https://fnordig.de/2026/03/25/rust-reflection-and-a-multi-ar...

smj-edison 23 minutes ago

I didn't realize compile time reflection was back on track, that's really exciting!

geysersam 3 hours ago

Genuine question: why do you think game engines need operator overloading? I mean, what's wrong with generic functions like add, multiply, dot etc.

hmry 2 hours ago

Why have operators at all?

  x = x.add(step.mul(2)).mod(width)
Or in C

  x = imod(iadd(x, imul(step, 2)), width)
vs

  x = (x + 2*step) % width
For me the answer is very simple: Operators make it easier to read the code which makes it easier to spot bugs. It also makes it easier to turn formulas from textbooks into code.

If 50% of the code you're working with is using vectors and matrices, not having operators for those parts is quite annoying.

Note that you can have vector operators without overloading, e.g. Odin has built in vector and matrix types.

But personally I think it's better to give the user more power instead of only letting the compiler author pick which types to allow operators on. Like how Java overloads + but only on the String class. Why do they get to do it, but not me?

applfanboysbgon an hour ago

dnautics an hour ago

Decabytes an hour ago

aaaashley 3 hours ago

Not GP, but I've written game engines and rendering engines. Vector operations are just common enough that having to write `.mul` every time is a huge pain, especially when you put many of them together for a large formula. Compare:

(physics_data.velocity + omega * change) * frame_delta_time

to

physics_data.velocity.add(omega.mul(change)).mul(frame_delta_time)

We learn to read and think about math a certain way, which is incompatible with Zig. Also, Zig's design philosophy of "reading code over writing code" is incompatible with the kind of small modification-test-cycles required when doing games, and creative programming in general. So Zig is sort of DOA anyway for that kind of thing.

But I've been using Zig for non-game projects and it's been fantastic, so definitely not "Blind leading the blind" for the overall language design, imo.

smj-edison 2 hours ago

awesan 4 hours ago

Zig is adding native vectors including operator support, there are some recent issues/prs about this topic.

The general technique of SoA is pretty useful both in games and other applications, but of course I cannot speak to the specific use-case you are describing.

nvme0n1p1 3 hours ago

Zig vectors force data into SIMD registers even if that would make the code slower. They're a specialty type. You should only reach for vectors if you would have used SIMD intrinsics in C for example.

e4m2 3 hours ago

beepbooptheory 4 hours ago

So is the argument that any SoA is pointless? Or just for GPU stuff? Because this isn't really talking about all that one way or another.

Also does one really need operator overloading? That feels a little strong. I've gotten by with functions just fine.. Does that make the GPU not like me Mr. wise engineer?

Sweepi 6 hours ago

OT: I just spend a few minutes searching for the source of the "Not all CPU operations are created equal" slide of the linked presentation (Andrew Kelley - Practical DOD), its here:

https://6it.dev/blog/infographics-operation-costs-in-cpu-clo...

skywal_l 5 hours ago

You URL seems KO, an alternative I found: https://x.com/chessMan786/status/1879092981892067383/photo/1

hiccuphippo 4 hours ago

trymas 5 hours ago

Slightly related recent HN post: https://news.ycombinator.com/item?id=48382382

binaryturtle 4 hours ago

I'm just seeing a "410 Gone" error on the linked site (same happens to the parent URL too).

ArneCode 4 hours ago

Works for me

binaryturtle 4 hours ago

Still the same. I guess it's some sort of wild anti-bot stuff basing on the user agent?

/edit

Yes, as confirmed with cURL, using my browser's "User Agent": 410 blocked. Using some other "User Agent" and it passes along the data. Pretty silly, IMHO.

Thaxll 5 hours ago

This is what games do with ECS.

nejam 3 hours ago

Jfpe?

nejam 3 hours ago

Jdoemhoe