Prepper and handler thread rendering.

I had an idea not long ago, whilst watching a lowely tv show. I sat at my desk and pondered a thought , a solution to a problem I sought. ok poems over.

I sat down and was thinking of methods of optimising code on modern multicore computers specifically for rendering large amounts of objects such as that in an enaconadodecahedron . The idea I came up with was to create two threads , the first being the main game thread and the second being a “Handler” thread.

What would happen is the prepper thread would run through all render tasks that had to be performed and write them to an array that the Handler thread read. When the prepper had started it would tell the Handler to begin reading the array. When the prepper thread had finished it would wait for the Handler to complete its task or for further optimisation check how far the handler is and designate some tasks to the prepper thread. Of course this would require lots of careful coding to make sure both threads were in sync at the end and that the handler did skip infront of the prepper and not render stuff.

(If I understand this correctly) this is something I do for my current game I’m working on.

I have a thread that’s responsible for building a ByteBuffer for a chunk. That thread is responsible for determining face visibility, how lighting affects the faces, etc. Once the ByteBuffer is ready to be loaded to the VBO it’s put on a queue which the main rendering thread reads every iteration.

So essentially my code is organized like this.

Main Thread

  1. Rebuild chunks? Place on queue for Build Thread
  2. Any built chunks? Take ByteBuffer and update appropriate VBO

Build Thread

  1. Wait for chunk to build
  2. Build chunk to ByteBuffers
  3. Place ByteBuffers on queue for Main Thread

This only works nicely because the building part is done in such a way that it doesn’t modify any game state information… AND if a chunk is being built while it’s modified the building process for that chunk is restarted. For every block I do a simple check to see whether the chunk has changed since I started (just a simple volatile boolean flag).