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

Goodbye specular lighting stuff

For a while Gratuitous Space Battles 2 had a separate ‘lighting’ layer for ships that was used to pull off a few effects. This meant a ship hull might come with a color layer, a normal map, a specular layer, an illumination layer and a hulk layer. And those ship graphics are 4x the size of before, so they are 32bit color 1024square dds files. Those get pretty big, and with at least 40-50 new ships, suddenly the game is getting awkward to throw builds about with on my crappy rural broadband…

Luckily, after a bit of chin-stroking and going to-and-fro with the ship artist, we now don’t need that specular layer at all. It was fairly redundant, it was effectively being used as a separate ‘foreground lighting’ layer. It turns out I don’t really need that, I can just re-use the color layer. It’s a bit of a complex engine because it does a normal-mapped 3d thing, but also has lights that can be controlled separately to the foreground (ambient) lighting and also the normal-mapped directional lighting. This allows me to have all kinds of cool effects such as ‘dark’ battles where you can only see lasers and lights from ships, and also to have bright nebulas with everything glowing.

Of course, the minute I changed the code, everything else stopped working. First shadows stopped rendering entirely, then they worked, but I lost control of illumination brightness for ship lights. A whole lot of head scratching and debugging later and I am back where I started, but now the specular layer is irrelevant. That simplifies and speeds up the toolchain too, which is a very welcome bonus.

I’m only a few fighter-hulls away from being able to put together some battles with all-new in-game graphics and taking some screenshots for real, although the planets are still placeholder, and the explosions and particle effects all need re-doing. Still, progress is progress.

Unrelated, I’m off to see the nice people at Valve tomorrow for a UK meeting with developers.. Should be interesting

A whole new world of stats addiction

I’m a statistics addict. They say the first step is acknowledging that you have a problem. I used to spend a disproportionate time studying google analytics data. (I don’t do it so much now, but I do check it around game releases etc.) I also spend a disproportionate amount of time studying exchange rates and share prices. (how do i know this? well i have stats showing me…). I also keep banging on about my favorite profiler, aqtime, or pix. And of course if you have played my games, you may be aware of the fact that I’m the guy who turned just ‘being in your twenties’ into a game of statistics management.

Clearly I have that sort of sheldon-cooperesque geeky mind. I also have a scary memory for some things (not for all stuff, sadly).

So it is with fear, and excitement and mixed emotions that I discover I can get the latest nvidia nsight profiling stuff running for GSB2. Now I can have an entire new program full of charts and graphs and stats and data about what each atom in the video card is doing at each picosecond of every frame in my game…

IO really need to chill out about performance and just work on the game. I tend to work in debug build, which is very slow, and panic a lot, and then (as I just did) toggle to release, detonate an entire fleet of cruisers in 2560 res, and realize the frame rate is still just dandy, and then relax a bit.

Of course, I’ll still be blogging about performance and code a lot, as I love it. i just need to hit my rescuetime targets for the day first, as the stats say I need to get back to my code now…

Positech Games needs artists (as contractors)

Right, I need to get my act together and get some artwork commissioned. I need some good 2D artists, maybe 1, maybe two. Maybe the person I need is YOU or someone you know. I need some artists to work on Gratuitous Space Battles 2. If you haven’t heard of it before, it’s a space strategy game with really gratuitous explosions and effects, and lots and lots of exploding spaceships and lasers. Here is the website for the original game, and here is the placeholder for the new one.

I already have my spaceship and GUI artist chosen, but what I also need are some planets and nebulas.  Are you a decent planet/nebula artist? I’m talking about the kind of thing seen in games like Eve Online, or actually any really high quality decent space game. I want very high quality stuff, not 20 minutes fiddling with difference clouds in photoshop. I like billowing nebulas, really colorful stuff, stuff like those awesome hubble pictures…

hub

I need them as 4096 square jpgs. yeah that’s BIG, and yes jpg’s are lossy,. but I can deal with it. I probably need the original source as bitmaps or PSD files anyway… And I need about 10-12 of them, depending on cost. They all need to be totallyt original compositions, not something anyone has seen before. They need to have no stars in them (parallax starfields are added by the game). They also need to show some pretty cool variety. I may add bloom effects on top of them. I don’t care *how* they are made, they might be painted from scratch with a tablet, they might be composed algorithmically from fractal art programs, they might incldue some amazing blending of real life cloud sources, and will probably be some combination of all of the above. They just need to be fucking cool.

And also…

I need planets. I’ll probably paste these onto the nebulas in-game, using cunning parallax scrolling which is a new technique that has just been invented. I want some very cool planets, like city-planet of coruscant from Return of the Jedi (below), or some really amazing gas giant, or a planet with lots of wacky rings. Go nuts! These can be smaller, maybe I need some 1024 ones, and some 512 ones. And again, they have to be original, and awesome.

corus

I’m not looking for an employee, that involves tax and lawyers. I’m looking for a freelance contract artist. We never need to meet, of course you can work on these from home, to a deadline I’ll set, but I’m fairly flexible. I can pay you by wire transfer, and normally pay in dollars, but that’s negotiable too (especially if you are British). I pay reliably and on time, ask anyone. The only other restrictions are:

1) You must be at least18 years old (otherwise it gets tricky from a legal; POV).

2) You must not be working under a contract that could enforce ownership of your work. ie: if you are currently working for a games company, you need a cast-iron contract that states you can work for me in your spare time and that they don’t have any claim to your work. You *will* have to sign a contract to this effect.

Do you know the people I want? ARE you the person/people I want? Pls email me at cliff AT positech.co.uk. Pls feel free to send links to portfolios of similar work. I don’t want someone who has never drawn a planet or nebula before. i need to be able to see just how AWESOME you are.

And if you work in games, please tweet/share this to anyone who you think may be interested! Cheers!

Redesigning formation orders in GSB2

Formation orders in GSB sucked a bit. You had to select a ship, then a target and basically the order was ‘stay at this position relative to that ship’. This sucks in two different ways. Firstly, it means if the ‘target’ ship gets destroyed, the formation is instantly abandoned (yikes). Secondly, it is laborious to set up 32 ships into a formation.

The new system for GSB2 is simpler. You group select a bunch of ships and then add a formation order in one go. They then attempt to stay relative to each other, regardless who gets destroyed. Internally, the ships ‘elect’ a command ship, that has ‘free-will’ and the other ships will try to stay in relative position to that ship. That ship getting destroyed or tractored results in a new election. So far so good, and certainly better when it comes to ship destruction and setting-up GUI. However, it leads me to question a few things. Take this formation (coder art!)

form1

Just a simple line of 6 ships where randomly I’ve made the blue one the commander. If the commander heads to the right, then all is well. However, if he heads at an angle what do the ships do? Should they stay relative to the ship in absolute world terms, or in relative to the lead ships-angle terms? in other words, do we wheel?

form2

Obviously the two different behaviors are vastly different. It also brings up the topic of what to do if the command ship decides to retreat when damaged, does the formation follow? what if it’s just 1 damaged frigate… I’#m guessing they leave the formation at this point. In my mind, the reason behind formations is to keep ships trogether in the sense that they should be able to cover each other in terms of support, and shooting down incoming missiles etc. With that in mind, I reckon it would make sense to always elect the biggest ship as the commander, where viable.  Theoretically you could have a super-slow ship with the entire fleet locked into formation with it, effectively preventing anyone from moving.

What do you think? do I ignore angles and stick to world space, or pivot? and will the system of commander elections work ok? For reference, this is how fighter squadrons already work in GSB 1.

 

Reading back from GPU memory in directx9

Yeah you read that right, I’m reading back from the card. yes, I feel kinda dirty. What am I talking about? (skip this is you are gfx coders…)

***generally speaking games create ‘textures’ in memory on the graphics card, so the data is actually stored there. We write data *to* the card, and then we forget about it. We tell the card to draw chunks of that data to the screen, and it does so. What you never do, is read back *from* that same data. In other words, you draw stuff to the screen, but have no way of actually looking *at* the screen from back where you generally are in CPU / RAM land. The reason for this is everyone understands this to be slow, and there are very few reasons to do it***

I have some technique, the details of which I won’t bore you with, which requires me to draw the scene in a certain way, then blur that scene, and then check the color value of specific pixels. I cannot find any way to do this without reading back from the video card. I should say this is for Gratuitous Space Battles 2.

Theoretically, I could maintain an system-memory only version of the scene, render to it there, blur it, and read from it without ever touching the card GPU or card RAM. This would mean no sneaky using that video card bus to do any data transfer. The problem is, I suspect this would be slower. The GPU is good at blurring, and rendering, and in fact, all of the data I draw to the scene is in gfx loaded in the cards RAM. Make no bones about it, I have to compose this scene on the card, in card RAM. And if I want to access specific pixel colors, I need to get that data back.

So what I’m doing now is a call to GetRenderTargetData to grab the data and stick it into a system memory texture I created earlier specifically for this purpose. BTW did I mention I have to do this every frame? Once there I call LockRect() on the whole texture, and then quickly zip through my list of points, then UnLock() as soon as I can. So what happens?

Well if I look at the contention analysis in Visual Studio, it shows me that this calls a lot of thread blocking. It’s pretty much all of the thread blocking. This is clearly sub-optimal. But if I look at the actual game running in 1920×1200 res in FRAPS, the whole thing runs at a consistent 59-60 FPS. My video card is an Nvidia Geforce GTX 670. In other words, it really isn’t a problem. Am I over-reacting to what was once a taboo, and now is not? Are people calling LockRect() on textures just for giggles these days? Is my engine sufficiently meek that it leaves plenty of spare room in each frame to put up with this clunky technique?

I’ve also considered that I may be screwing up by doing this close to the end of a frame (sadly this is a requirement of my engine, unless I let a certain effect *lag* a frame). If it happened mid-frame I suspect the thread-blocking that prevents the end frame Present() wouldn’t be so bad. Sadly I can’t move it.

I’ve also wondered if a series of smaller LockRects() that don’t fill the screen might be quicker, but I doubt it, I think it’s the mere lockiness, not the area of memory that matters. I can easily allow the effect to be toggled under options BTW, so if it is a frame-rate killer for some people, they can just turn it off.