Welcome back followers of fearsome!
This week we are attending PAX-Dev and PAX! We still wanted to adhere to our weekly dev-blog schedule, so we’re blogging live right now. Jesse is sitting next to me making a quick turtle drawing on his new Samsung Slate computer. Here it is:
We’ve submitted the first Shellrazer update last week, but we haven’t heard anything from Apple yet. The first update is mostly a bug-fix update. We’ve fixed a ton of small annoyances, and hopefully made a few screens a bit more clear. We also added the universe screen where you can see the original island, and a future island under construction. We’ve been working on the next island last week, and we will continue after we get back from PAX, and it will be awesome!
We’re doing a talk tomorrow (Thursday) at PAX Dev about the visual design docs we used for Shellrazer, and why written design docs suck. If you’re at PAX Dev, our talk starts at 3:30 in the Fifth Ave room. Come check it out!
To finish off this week’s short devblog, here are some pictures of us at PAX.
Jesse honing his cave-man drawing skills:
Shane playing pinball:
Jesse (Jouste) playing Joust:
Me playing some pinball:
That’s it for this week, keep those turtle cannons blasting!
Welcome back followers of the fearsome!
Since Jesse’s still a bit hung over from his birthday party last night, I (Nick) will be typing this weeks dev-blog. It’ll be programmer talk, but since Jesse can draw the turtle with his eyes closed now, he did manage to spruce up this post with an awesome turtle drawing.
I’ll be talking about loading screens. There are many games on iOS that have long loading screens, and every time I see them I wonder why. Some people I’ve met at the Full Indie meetup have told me that the iPhone is very slow to load data from. In my experience this couldn’t be further from the truth. It’s one of the fastest loading devices I’ve ever worked with! So, in order to possibly help out a few fellow developers remove those long-ass loading screens, I’ll give you some information on how I load data into our game. Note that this information is totally useless if you use Unity, but if you have your own engine (yea! rock on!), this info could make things a lot easier and faster!
There are different ways to load data from a disk. The most common method is to fopen a file on disk, and use fread to get the data from it. On consoles with DVD drives a common trick to speed up loading is to compress the data on the disk, and unpack it at load time in a separate thread. When loading compressed data, you often end up with a memory buffer to load the compressed data into, and another memory buffer to unpack the data to, and then possibly another memory buffer to store the data after you’ve loaded it. (The last step depends on if you load in place and fix up pointers, another common trick, but that’s for another time). In my experience, allocating extra memory, or using extra CPU to load the data is quite undesirable on mobile devices. I tried using our console engine approach of loading and unzipping data, but it was extremely slow. Then I read a post by Carmack (which I can’t seem to find in my bookmarks.. argh) about how he uses a function called mmap in Rage for iOS. You should learn everything you can about this function as soon as possible. Here’s a wiki page to get you started: http://en.wikipedia.org/wiki/Mmap
So what does mmap do? mmap can map an entire file into a virtual memory address. It doesn’t load any data, it just reserves a memory address that you can access, at which point it will load the data on demand. So all you do is access the data through a pointer and data will get loaded behind the scenes (without having to go outside the kernel, speeding up thing considerably!). The trick is that no memory is actually allocated for this, except for possibly a bit of cache memory. Doesn’t that sound pretty weird and magical? That’s because it is.
So how do we use this in Shellrazer? We pack all of our data files (thousands of them) into one large archive file at compile time. The archive file is nothing other than a list of file-names with their offsets in the archive, and the data for each file. All the data is uncompressed so that I don’t need to uncompress data when I want to access it. (By the way, if your game is a gigabyte in size, this may not be desirable for your users, but that’s another story) When I need to get some data from a file, I simply look in the list of files, get the offset inside the archive, and return a pointer to the mmapped archive plus the offset. Then I can just start using the pointer and read from it as if you’re reading from any memory location. If I have texture data I just pass this pointer straight to OpenGL, so it can do it’s thing to load the texture. It’s super easy to use, it works all the time, and it’s crazy fast.
In fact, when I first put this method in, I was shocked at how fast it was. According to a few tests I did I was streaming in data at a rate of 300Mb per second. The data in our game loaded so fast that the loading screen I added was barely visible. In fact, I had to make the loading screen stay on screen artificially for at least 0.3 seconds, otherwise it looked like a bug.
After these tests I altered the way our game handles data. I keep a few things in memory at all times, such as the main font bitmap, and a few other commonly used bitmaps. Everything else gets swapped in and out of memory, depending on the currently active UI-screen. When the game switches to a new UI screen, the old screen first transitions to our little loading indicator for about 0.2 seconds, then all the data gets flushed from memory, all the required data for the new screen gets loaded into memory, and the new screen transitions in for about 0.2 seconds. If you take a look at Shellrazer, every time you see a black screen with a little white rotating icon in the bottom right, that’s our loading screen, and in almost all of those cases, over 30Mb of data is loaded between two screens, plus it has about 0.4 seconds of artificial delay. Also, when our game goes into the background, I flush out all of the resources we use, and we reload these when the app goes to the foreground again, all of which takes less than half a second. Pretty speedy!
Now, as for application size, Apple has the 50Mb restriction on downloadable over 3G vs Wifi. Our archive file is 60Mb though. Well, the good news is that all data files get compressed by the Apple installer, so our download size for Shellrazer is only 31Mb. Problem solved. :)
Alright, I think that’s all I have to say about how to speed up your loading times. I probably missed a bunch of things, so if you have any questions about this stuff, I’ll be happy to help out!
tl;dr: use mmap to load, it’s awesome.
Welcome back followers of the fearsome!
Another great week has trampled by and we are super happy to hear that people have loved raising shell!
This week we are happy to announce that the super sexy swinging sounds of Shellrazer are now available to buy! It contains all of those great tunes that are in the game along with a wicked grungy bonus track! So if you were a fan of those great recordings in the game, or just want to support the artists let them know by getting your copy today!
We also have a bonus Music post from Jenn Lewis, Shellrazer’s sound designer who made all things audio possible in our game. Take it away Jenn!
The music for Shellrazer came together in a unique way. I was teaching sound class at the local film school and mentioned that I was on the hunt for music for a new indie game. At the end of class, both Stefan Seslija and Gordon McGladdery had jumped up, expressed their keenness in turtles and music for turtles, and linked me to their demos. Stefan’s writing sounded live, with a strong big band jazz/soulful/prog-rock influence. Gordon’s guitar based work is quirky and full of character. Sometimes almost cartoony.
I wanted the music to match the turtle’s determination while tossing us all into a retro frame of mind. Guitars were important to the turtle’s matter of fact charm and drive forward but the retro elements would sit in a mixed acoustic & electronic realm. It seemed totally logical to ask the two of them if they would be interested in a collaboration, to which they answered yes. They’d been talking about working together, for a while. Voila, a music team!
It didn’t take long for ideas to start rolling in and the guys were champs at responding to feedback and iterating on their work. As the music went into the game, it made a ton of sense and indeed, drove things forward.
I wanted to release the soundtrack in order to put their talents in the spot light directly. I hope people dig their writing as much as I have.
Thanks guys. You’re awesome!
That was super Jenn, thanks a ton. We also wanted to give you guys a sneak peek on one of the new enemies coming out for our turtle to toil with! In the near future we will be doing a super cool update with some new weapons and levels for you to trounce! So without further ado check out this wicked enemy mount!
Whoah! How cool is that guy!?
Thanks for stopping by everyone, we are still having a blast on Shellrazer and are working super hard to make the experience even better! Until next time, keep those turtle cannons blazing!
Welcome back followers of the fearsome!
Shellrazer’s been getting some great reviews and even landed up on Metacritic with some great numbers. We are hard at work on our next update with some exciting game modes that help you keep on raising shell long after you’ve trampled the campaign!
There’s been a few folks that have picked up Shellrazer and have been having some troubles. so here’s Nick to let you all know what we are doing to help!
Warning, wall of text incoming!
We’re fixing a bunch of things in the first update, but the most notable ones are:
People ‘losing’ save games.
This is actually due to the behaviour of our save game system. The three save games are saved per Game Center account, so if you happen to have signed out of Game Center when you restart the game, it will appear that your save games were lost. They weren’t of course, they are just not shown because you aren’t logged in to the Game Center account that you saved them under. The simple fix is to make sure you sign in with your Game Center account, and find the save games back again. Now this can happen the other way around as well: If you were not signed in when you saved the game, and then somehow signed in (possibly in another app) and return, it will show no saves because it now shows the save games assigned to the active signed-in Game Center account.
So what am I doing to fix this? I’m trying to make the screen state clearly who is currently signed in, and I’ve added a button that says ‘Help! my save games are gone!”, hoping that people will press that button so I can pop up a message box to tell people what is going on. I’m thinking of also adding a way to continue a locally saved game with a game center account, but I’m not entirely sure yet how to implement the screen for this.
The game is too short!
We’ve heard complaints about people feeling like there’s nothing left to do after they finished the game. We were actually surprised that people got through the game so fast!
We’re going to fix this by adding a Gauntlet mode, where you can compete with your friends on a new level every week, with different constraints on the turtle. This probably won’t be in the first update, because it takes quite a bit of time to implement and test it all. It will be awesome though. We’ll get our Universe map in where you can select the gauntlet or the world you’re all familiar with. This will also be the map where you can select any future level additions!
Weapons not being awarded
The reason for this one is that we only award the weapon when the ‘You’ve unlocked a new weapon!’ dialog pops up. So if you get to the victory screen, and then decide to turn off the game, the game will save that the level was completed, but it won’t save that the weapon was awarded, as you haven’t gotten to that screen yet. The simple fix was to save the weapon awarding when we save the progress of the game.
I can’t hit those enemies at the bottom!
This is a problem on the iPhone/iPod version. We never tell the player that the reticle can actually be rotated by using two fingers. We could tell the player, but we opted to even out the levels a bit so that the problem just occurs less often.
Pause Menu button location
People playing the game with left their left and right hands simultaneously have reported accidentally hitting the pause menu button in the top left. To fix this we opted to keep the button in the same place (as there was no real good location anywhere on the screen), but to disable the button if there are any fingers on the screen other than on the button. So if you’re in the thick of it, trying to kill all those nasty goblins with all your fingers on screen, you won’t be annoyed by a sudden pause menu anymore.
We’ve discovered a bunch of typos in the descriptions of items, and in some of the platform upgrades. We’ve fixed all of the ones we could find, and some that people have sent feedback for (thank you!!).
Shane’s been working hard to get some tuning changes in that will improve the difficulty curve and balance out the weapons a bit.
There are a few more things that we want to get straightened out before we submit the update to Apple, but rest assured that we’re working hard to get this out ASAP!
Cheers, and keep those guns blazing!
Welcome back followers of the fearsome!
It has sure been one Heck of a week! It looks like some people are really enjoying Shellrazer! That makes us feel super happy!
We’ve managed to get into the top 5 paid apps in Canada, USA, Australia, and… Nicaragua! We’re moving onto some super cool updates and working hard to keep those Shellrazer supporters as happy as a fully loaded cannon!
So from our responses it seems that some people happily blew through our turtle’s campaign already! That’s great! Now we are hard at work getting a super cool Gauntlet mode in there where you can test your mettle against an oldschool arcade flurry of never ending action! Try and get further than your friends and rub it in when your distance is king!
Here’s some quick pics of a new enemy we are putting together codenamed “Bruiser”. He’s basically a super strong grappling goblin that can seriously wreck your crew! He’ll be along for the trip in our never-ending gauntlet levels! Sounds good? sure hope so!
So a HUGE thanks from us for everyone that’s supported the game! Even If you couldn’t pick it up we really appreciate all the kind words. We’ll try and keep our little turtle up there in the charts with new levels and weapons! So until next time, keep those turtle cannons blazing!