Interview on Channel 9

Posted by on Apr 12, 2013 in Everything | 0 comments

I had the pleasure of meeting Laura Foy in Seattle for an interview on my experience porting my games over to Windows Phone 8.

http://channel9.msdn.com/Series/Developer-Diaries/Dev-talk-with-Andrew-Garrison-from-Jundroo

 

Porting an iOS app to Windows 8

Posted by on Oct 29, 2012 in Everything | 0 comments

I just recently finished porting my iOS game, SimplePhysics, to Windows 8 Metro WinRT. SimplePhysics is primarily written in C++, with just a pinch of Objective-C to get it working on the iPhone. Fortunately, the new WinRT platform is written in C++/CX, so in theory I should be able to reuse almost my entire code base!

This was true for the most part, but there were still some significant hurdles that I had to overcome to get my app running on Windows 8.

Learning the Framework

The first problem was the fact that I knew nothing about WinRT. It’s a completely new framework written to replace the age-old C-based Winapi. Whenever I encounter something that I know nothing about, I turn to my secret weapon: Pluralsight. If you haven’t heard of Pluralsight, then I highly recommend that you check them out. They make extremely high quality training videos that can get you up to speed on a new technology faster than any other method. They are now my #1 stop when learning a new tech. It does require a paid subscription, but they have a free 10 day trial, so you can watch the training video on WinRT for free. This video was particularly good, because it was done by Kate Gregory, who has written over a dozen books and is amazingly knowledgeable about the platform.

No Support for OpenGL

You have two options when making an app for the new Windows Store: DirectX or XAML. OpenGL is not supported, and likely will never be supported. This is very unfortunate when the vast majority of indie game developers are using OpenGL. So now you have to rip all that OpenGL code out and replace it with DirectX…unless there is another way.

Instead of ripping out my OpenGL code, I looked into using an OpenGL to DirectX wrapper library. The idea is that you just link with this wrapper library that implements a version of the OpenGL API that routes your OpenGL calls to their DirectX equivalents. Quite a few wrappers exist, but I couldn’t find any that support DirectX 11 (which is what you’ll need to use on WinRT). So, I set out to write my own wrapper library. It wasn’t too painful in my case, because the drawing code in SimplePhysics is very basic and I was only using around 25 methods from the OpenGL API.

I put the code up on Codeplex, so feel free to download it and check it out. It’s licensed under the MIT License, so you can do whatever you wish with the code. It also includes a simple Windows 8 application project that demonstrates how to use XAML based UI and OpenGL graphics together.

Asynchronous File I/O

This was the biggest hurdle for me. WinRT really enforces the idea that if you want to do some long running operation, you must do it asynchronously. This is understandable. They just want their apps to feel more responsive to users and really this is something that all devs should strive for anyways. However, in some cases it is quite a pain to convert working synchronous code to its asynchronous equivalent.

For example, nearly every game ever written persists the user’s settings to a file. In SimplePhysics, this is just a handful of saved blueprints and is only a few kilobytes in size at most. This is hardly worth converting to asynchronous code because (a) it is only done on start-up, and (b) modern hardware can read a few kilobytes lightning fast. We’re talking milliseconds.

Unfortunately, in WinRT, all file I/O operations are done using the IAsyncOperation class. For instance, if you want to read a file, you’ll have to do something like this:

void ReadFile(Platform::String^ fileName)
{
   using namespace Windows::Storage;
   using namespace Concurrency;

   // First get the file...asynchronously
   auto folder = ApplicationData::Current->LocalFolder;
   task getFileTask(folder->GetFileAsync(fileName));

   // Then read the file...asynchronously
   auto readBufferTask = getFileTask.then([] (StorageFile^ f)  {
      return FileIO::ReadBufferAsync(f);
   });

   // Then convert the buffer into something usable, like 
   // a std::vector......asynchronously
   readBufferTask.then([requestId] (Streams::IBuffer^ b) {
      auto a = ref new Platform::Array(b->Length);
      Streams::DataReader::FromBuffer(b)->ReadBytes(a);

      _data.clear();
      for (uint i = 0; i < b->Length; i++)
      {
         _data.push_back((char)a[i]);
      }

      // Now set a flag to indicate that _data vector is ready
      _dataIsReady = true;
   });
}

The code in this method isn’t too complex. WinRT actually has some nice ways to handle async operations, as seen with the “then” method, but it can still have a significant impact on an existing, working, code base that is using synchronous file I/O. Initially, I started down this path of re-factoring SimplePhysics to use async file I/O, but it was just taking too long. At the end of the day, I found that even though WinRT doesn’t expose any synchronous file I/O, good old fopen, fread, and fwrite still work just fine. The trick is to know where to read and write your files. If you try to read or write from the wrong location, your fopen call will fail. I stored all of my user settings files in the LocalFolder, which is the “root folder in the local app data store.”

Here’s some code that demonstrates how to write to a file, synchronously, using fwrite.

auto localFolderPath = Windows::Storage::ApplicationData::Current->LocalFolder->Path;
auto filePath = localFolderPath + "\\test.txt";

FILE* file;
_wfopen_s(&file, filePath->Data(), L"w");
if (file) 
{
   unsigned char data[] = { 'a', 'b', 'c' };
   fwrite(data, 1, 3, file);
   fclose(file);
}

In Conclusion

Other than that, the port from iOS to WinRT was relatively straight forward and mostly painless, and it’s exciting to see SimplePhysics in the Windows 8 Store. I hope these tips will help some of my fellow indie devs, and if you have any questions feel free to contact me.

GoDaddy is Suboptimal for WordPress

Posted by on Oct 23, 2012 in Everything | 0 comments

I have a confession to make. I’ve been running a website on a shared GoDaddy web server for years. During that time I’ve really never had any problems. The tech support was fine. The performance was fine for my DotNetNuke blog and a handful of other ASP.NET pages that handle service calls from my iPhone games. I did seriously consider switching away from GoDaddy after the SOPA fiasco and the resulting backlash from the reddit community, but I did not. The thought of moving to a new hosting company was daunting and laziness took hold and squashed my desire to make a political statement.

Around a month ago, I decided to convert my DotNetNuke blog into a WordPress blog. WordPress is like a breath of fresh air after using DotNetNuke’s blogging module. The themes and plugins for WordPress are amazing and everything was going great until it became apparent that my shared web server was unable to handle the new platform. Several times a day the web site would timeout completely. I wrote a little app that pinged my web server and found that response times for a single blog page averaged around 13 seconds, with as many as 14% of the requests failing completely over the course of a day. This was unacceptable. I spoke with the GoDaddy support and they informed me that things would speed up a bit if I switched from a Windows server to a Linux server. That would be fine, except I was also running a few ASP.NET services for my iPhone games. I had to stick with Windows. They seemed to acknowledge that WordPress on Windows was slow, yet they still seem happy to sell that service with no up front indication that it performs terribly. The interwebs are filled with people complaining about the issue. Just to name a few.

I still tried desperately to make things work. I upgraded  to GoDaddy’s Ultimate 4GH plan and installed the WP Super Cache plugin (which is awesome, btw), but to no avail. It was becoming clear that a WordPress and GoDaddy were no longer an option. I started looking around to other hosting services and landed on GearHost. The process took about two days to get all of my stuff moved over, but overall it was not quite as painful as I thought it would be. The difference is nothing short of incredible. The average response times now are just over one second and I have yet to have a request fail. Not only is GearHost outperforming GoDaddy by a wide margin, but GearHost is actually cheaper than GoDaddy too. Here’s a break down in the comparison between the two services:

Service 12 Month Price Failed Requests Average Response Time
GoDaddy Ultimate 4GH $9.49 14% 13356ms
GearHost CloudSite $8.99 0% 1308ms

Here’s a graph showing requests over the course of a day between a WordPress blog page running on GoDaddy vs the same blog page rehosted on GearHost. Each bar represents the average of 6 requests, spaced 10 minutes apart, for that hour of the day.

I’m very happy that I finally made the switch. GearHost does have a weird delay with FTP, which is very frustrating, but other than that the service is solid and the tech support has been great.

Dummy Defense

Posted by on Mar 19, 2012 in Everything | 0 comments

Dummy Defense is a spin-off of the popular physics and engineering game, SimplePhysics. In Dummy Defense, you must use your engineering prowess to protect Melvin, the dummy, from an array of dangers, such as boulders, explosions, death pits, meteors, and more.  Using the same blueprints editor from SimplePhysics, the player must build a structure that is simulated using a physics engine in real time. Players can view how their design reacts in slow motion, fast forward, and they can even rewind time to pinpoint any weaknesses in their design. It’s an addictive game with a wide variety of levels, and players may even learn a few things about structural engineering along the way.

BridgeBasher for Android

Posted by on Jul 31, 2011 in Everything | 0 comments

BridgeBasher is now available for the Android platform! The game is ad-based and will be free for download. If you have an Android device, you can download it here:
https://market.android.com/details?id=com.andrewgarrison.bridgebasher

Tags: android,bridgebasher

BridgeBasher Update with iPad Support

Posted by on Jul 11, 2011 in Everything | 0 comments

Last night I submitted an update to the app store that includes iPad support for BridgeBasher. The update will be free for everyone who has already downloaded BridgeBasher, but will not be available for BridgeBasher Lite.

I am also working on porting BridgeBasher to the Android platform. Things are going well, and I expect to be able to release it by the end of this month. If you have a less fortunate friend who has an Android device, be sure to let them know!

Tags: iphone,bridgebasher

New Level – Bomb Shack

Posted by on May 9, 2011 in Everything | 0 comments

I submitted an update this weekend for a new level for SimplePhysics, named Bomb Shack. In this level, you must build a small shelter to protect a crash test dummy from an indirect explosion. If the dummy gets blasted, or if he is struck by a falling support, then you fail. The level simulates realistic explosions, so you will have more success trying to create a slim, angled shelter to deflect the explosion, rather than a beefy shelter that absorbs it.

This update comes with more goodies though. Since I was creating explosions, I thought “wouldn’t it be cool if I could blow up all the old levels too?” So, I made it so. The finger test is now enhanced to let you create explosions on every level. Some are more fun than others, personally my favorite is the staircase level.

I also thought: “It would be awesome if the dummy supported ragdoll physics.” Be sure to play with him, he is a lot of fun. Throw him around, blow him up, he is quite entertaining.

After I implemented those features, I thought to myself: “Man, it would be extremely cool if I could slow the simulation down so I could watch the explosions in slow motion.” So, say hello to the slow motion feature. Watching explosions in slow motion is more fun than I anticipated, especially when it involves the new ragdoll physics.

This update has been so much fun to make and I think it opens up a whole new world to explore, so I am going to start working on a spin-off of SimplePhysics, tentatively titled SimplePhysics Bombs. Don’t worry, it will be free, and will have 5 to 10 levels, all similar in nature to this Bomb Shack level.

I hope you enjoy the update!

Tags: iphone,SimplePhysics

New Level for SimplePhysics – River Dam

Posted by on Apr 25, 2011 in Everything | 0 comments

I submitted an update for SimplePhysics last night that includes a new level, River Dam. In this level, you must create a dam that can withstand rushing water that slams into the dam, and some random debris that the water has picked up along the way. I hope you enjoy!

Tags: iphone,SimplePhysics

New SimplePhysics Update includes Universal Support for the iPad!

Posted by on Apr 19, 2011 in Everything | 0 comments

I submitted an update to Apple last night that includes universal support for the iPad. I must say the game looks quite nice on the larger iPad screen, and I think you will agree when you see it!

I want to mention that I could have released a separate app, solely for the iPad (i.e. – SimplePhysics HD) and jacked the price up, but I believe that my users deserve better than that. I have received so many great ideas that I felt compelled to give you all something extra at no cost. In fact, I feel more and more like SimplePhysics is becoming a community effort. Please, if you have any ideas for the game, visit my uservoice page. Let’s build a game together ;)
http://simplephysics.uservoice.com

Tags: iphone,SimplePhysics

Two New Levels for SimplePhysics

Posted by on Apr 13, 2011 in Everything | 0 comments

I just submitted an update to Apple last night with two new levels:


Two Story Tree House

So you can build a tree house, but can you build one with two floors?

   


Staircase

In itself not so exciting, until you throw in advanced robotics to smash your design to pieces! Also, I think you will rather enjoy the surprise I threw into the finger test for this level.

   
         

Tags: iphone,SimplePhysics