Game Design, Programming and running a one-man games business…

Lazy Execution in games (pseudocode)

I’ve been testing a bit of a worst case situation for the battle screen in the game where there are just TONS of fighters, and they all have contrails and running lights and you try to see as many of them as possible onscreen.

Not surprisingly the game chugs pretty slowly during that. I’ve been looking at ways to speed the rendering up and have realised something I haven’t been doing enough of is lazy execution.

So what is lazy execution in non coding terms?

Imagine your program is designed to tell a robot how to cook (hey why not?). You might have a bit of code that says “Go to the fridge and grab some butter”. That involves a ton of steps, it would involve moving towards the fridge, locating the door, opening the door, removing the butter, etc.

So what you probably do is write some code like this:

FetchItemFromFridge(item)
{
Find fridge
Open Door
Take Item(item)
Close Door
}

And all is lovely and wonderful. Now later on in the programs development you realise you need to do that a lot of items, so your code in another area of the game looks like this:

FetchItemFromFridge(butter);
FetchItemFromFridge(milk);
FetchItemFromFridge(ketchup)

Weird recipe huh? Anyway. this sort of code gets written a lot, especially on big games, because the guy writing the fetchitem code is a different guy to the one writing the recipe code. Often recipe-coder has no idea what happens inside the fetchitem code, so he can’t see any reason to not call it multiple times.

Of course, the sensible re-written code is this:

Find fridge
Open Door
TakeItem(butter)
TakeItem(milk)
TakeItem(ketchup)
Close Door

Now the downside is, that’s a pain to code, because you need to be aware of the circumstances and write code in each case to handle it. This is what lazy execution solves.

Lazy execution means that when I write the code that says “open door”, I don’t actually open the door at all. I just make a mental note that someone wanted the door opened, for reasons we can only speculate about. The good news is, if someone else asks to open the door immediately afterwards, I don’t need to do anything at all.

The real ‘action’ happens when someone calls the ‘takeitem’ code. At that point, the clever lazy stuff says “whoah! you cant take an item without the door being open, I better open that now. At this point, the previous instructions that had been ignored actually get put into action.

The drawback is that the fridge door close needs to be lazy too, which would impact on your carbon emissions :D

Obviously its more complex than that. Incidentally, this is how a lot of directx works. When you call SetRenderState or SetTexture, sod all happens. It only actually does anything if you render something.

The really good news about using lazy code, is that you can optimise anyway all redundancy. In my case the pseudo code causing some issues was stuff like this:

LockVertexBuffer
for each particle
CopyToVertexBuffer
UnlockVertexBuffer

By making the Lock() lazy, the lock is never called (nor is unlock) in cases where no particle needs to be drawn. On big maps, with most of them off screen, this is quite common.

Light Of Altair

I don’t normally blog about other indie games, I find most of them to be a bit too casual and cuddly for my liking, but I just added a new game to the ones I sell through positech.co.uk and I think it might appeal to any of you who are following gratuitousspacebattles.

This is it:

When I tried the demo, I ended up playing it for much longer than I assumed I would. Give it a go.

Linky here:

Light Of Altair

Made me laugh (copyright debate)

In one of the embarrasing and frankly depressing ‘debates’ on copyright over at piracy-friendly slashdot, I spotted this gem (when discussing copyright on books):

Books: Anyone can write anything anywhere that everyone everywhere can read all instantly, why should anyone be paid for doing what anyone can do from the smallest child to the oldest altzheimers victim.

Which is just laughably insulting and stupid, but someone has already replied with this pithy remark:

The smallest child to the oldest Alzheimer’s victim could design a bridge, too. That doesn’t mean I’d want to drive over it. Are you really suggesting that author’s shouldn’t be paid?

I think gradually over the years more and more people are losing patience with the hardcore anti-copyright zealots. I’m all for campaigns against invasive DRM or sticking up for fair use rights, but its when people insist that the fact that the first mickey mouse cartoon is under copyright still, that we must live in a fascist state that it frustrates me.

I’m reading churchills war diaries (about a billion pages long), and am currently on the rise of Hitler. It puts into perspective all the modern rich western kids cries about freedom of speech and fascism that is apparently just preventing you downloading torrents of the latest Hollywood movies. Free speech is very vital, precious, and worth dying for. To use it in connection with torrenting movies and games is frankly insulting to everyone who fought and died to defend free speech.

Bah!

Gratuitous Deployment Interface

I’ve just made a change to the games deployment-screen UI, so I thought I might as well share it’s current look: (click to enlarge)

I used to have an icon ‘picker’ on the right hand side when you loaded an un-deployed fleet, and you had to drag and drop the ships into position on the left hand side. This was a bodge and tedious with huge fleets and big monitors.

Now the game will auto-deploy the fleet as you load it, and then you can slide them around and fine tune it. This is the same sort of system used by the Total War games, and I think it works much better. I’ve spent a few days working on some heavy duty re-organising of code for it to render faster, and things are much much more efficient now. Even with bazillions fo ships and things going zap everywhere, it seems to run pretty well. My next big challenge is getting it to run on my laptop…

Any thoughts on the design?

Back to optimising

So the fullscreen / windowed toggling is still shaky, but the game now runs in both windows and fullscreen and in pretty much any resolution, including my own 1920×1200 res. Listening to music from star wars whilst testing the game fullscreen at that res with a big battle is a flipping joy.

I’m in ‘lets minimise the number of textures used’ mode. Even at the start of a battle before much fighting, I have this, and it’s not pretty. (click to enlarge).

The problem is the running lights use a different ‘blend mode’ so putting them in the same texture as the ship saves me nothing :(. Lots to think about here. SetTexture() can be pretty slow, and you ideally don’t want to be doing hundreds of them every frame. Of course, in games programming, everything is a compromise. The good news is I’m only using up 70% of the CPU to do this stuff, given a minimum 60 FPS.