Jump to content

  • Log In with Google      Sign In   
  • Create Account

Think Small

Viewback - A Video Game Design Tool

Posted by , 12 August 2014 - - - - - - · 3,453 views
user testing, testing, design and 2 more...
Viewback is a tool that helps game designers conduct usability play tests. It forwards the debug information from your game to your wireless device, where you can see it and the player can't. Now you can diagnose problems with the game while your playtester enjoys her experience. You can see changes to internal game state and send commands to the game in real time.

You can watch this video to get an idea of how it works:

The Viewback server is written in C and can be easily integrated into any game engine. It uses a permissive MIT license, avoids blocking networking calls, and uses only a few hundred bytes of memory. The server compiles on any C compiler with no dependencies, and the monitor is available for Windows and Android, with OSX and iOS coming soon.

Since Viewback is written in C it can be used in just about any game engine environment. Any engine written in C or C++ (Id Tech engines, Unreal, Source) can use Viewback with no extra effort. Users of engines written in Java or C# (Unity, Minecraft) can either write language bindings or implement the Viewback network protocol on their own.

This repository contains the header and source code for the Viewback server, which will typically be integrated into your game's client, if your game is multiplayer. It looks like this:

Attached Image

Installation Instructions

First, download the source code from the GitHub page and copy all files in the server directory to a directory inside your source tree. If you're familiar with git, you can use a git submodule for this purpose. Then add viewback.cpp and viewback_util.cpp to your project files. In whichever files you want to use Viewback, add at the top:
#include "viewback_util.h"
Now you are ready to implement the API.

Sample Code

This code uses the vb_util interface, which handles memory allocations for you. If you care about how Viewback manages memory, see viewback.h for an interface that allows you to allocate the memory that Viewback uses.
#include "viewback_util.h"

vb_util_initialize(); // This is optional.

// A "channel" is a stream of data to be sent to the Viewback monitor for display.
// Here we create an integer channel called "Health".
vb_channel_handle_t health_channel;
vb_util_add_channel("Health", VB_DATATYPE_INT, &health_channel);

// The name you pass in here will be displayed in the server list on the monitor.
vb_util_server_create("My Amazing Game");

while (game_running())
    // Call this as many times as you like, but at least once per game frame.

    // You can send data once per frame, or only when the data changes. It's up to you.
    if (!vb_data_send_int(health_channel, player->GetHealth()))
        printf("Error sending to Viewback channel\n");

At this point you should be ready to use the Viewback monitor to see your data. If you are on the same WiFi network as the Viewback server then the monitor should automatically find the server. If your network is special then you may have to find the IP address and connect manually. Once connected you will asked to select a group to display, and then you'll be able to see your channels.



A channel is a stream of data to be sent to the Viewback monitor for display. Each channel has a type, currently supported types are integer, float, or vector. Depending on the type of the vector the data will be displayed in the monitor in a different panel. Floats and ints will be shown in the time display and vectors will be shown in the 2D display.


A group allows you to organize your channels. You can add a channel to a group and then activate a group to see all of the channels in that group. For example an "Animation" group may contain these channels:
  • PlayerYaw
  • ViewVector
  • PlayerVelocity
while the "PlayerMovement" group would contain
  • PlayerVelocity
  • JumpButton
  • OnGround
A channel can belong to multiple groups or no groups.


Integer channels are often enumerations - i.e. each value represents a state. These states often have names and looking at the names is nicer than looking at the numbers. So for integer channels you can specify that a certain value has a name, and this name will show up in the monitor instead of the number. For example for the PlayerState channel you may have these labels:

0: Dead
1: Respawning
2: Alive
3: DeathAnimation
4: Spectating

Whenever the channel has the value of "2", the monitor will show the "PlayerState" channel as being "Alive".


You can specify controls to modify parameters of your game in real time. These controls appear in the monitor and when they are manipulated by the user, the callbacks that you specify will be triggered in the game code. There are currently two types of controls supported.


When pressed, a callback function in the game will execute. For example, a "Pause" button could call this function:
void viewback_pause_callback()
Other ideas for buttons:
  • Take a screenshot without leaning over your playtester.
  • Turn cheats on and off.
  • Activate the bug report system.
  • Reset the level if your playtester got stuck.

When the slider handle is moved a callback in the game will execute. Sliders can specify integer or float values. Some ideas for sliders:

Adjust the difficulty of the game if your playtester is having trouble (or not enough trouble)
Adjust the number of bots in the game
Real-time tuning of a design parameter that you've been trying to get right, like the player run speed or jump height.


If your game has a console, you can forward the console to Viewback. Output from the console will appear in the Viewback monitor and the user can input commands into the monitor which will get forwarded to the game.

Don't have a console in your game? No sweat, you can use the Viewback monitor as your console. Just call the Viewback vb_console_append() function with whatever messages you want to see, and it will show up on the Viewback monitor.


The status string is like the console but it's always visible. New status lines replace old lines and they never scroll off the screen. Use it for things like the framerate, memory used, and how many monsters are currently spawned.

More Math for Game Developers

Posted by , 07 April 2013 - - - - - - · 1,615 views

Learning math is fun when it helps you design better games. Here are some of the recent videos in my video series, Math for Game Developers.

Delta time and the game loop
The Approach() function
Euler Angles
Cross Products
Ray/box intersection
The Remap() function

Wow, that's two months worth of videos! It's been pretty crazy as I've been skipping around from topic to topic, but I'm about to start into a series about matrix transformations. I'm really excited about it! Subscribing to my channel or following me on Twitter will keep you up to date with each video as it comes out every week.

Math for Game Developers - Backstabs and Dot Products

Posted by , 14 February 2013 - - - - - - · 800 views

This week I've released the coolest entry in the MFGD series yet:

Learning dot products by implementing a backstab mechanic a la TF2. There's also a few videos on vector manipulation since I posted last, you can view them from the MFGD Youtube playlist: http://www.youtube.com/playlist?list=PLW3Zl3wyJwWOpdhYedlD-yCB7WQoHf-My&feature=view_all


Math for Game Developers Video Series

Posted by , 26 January 2013 - - - - - - · 12,422 views

I've launched a new Youtube series, Math for Game Developers. Each week I'll be showing how to solve a new problem in game development using math, and I'll be building up a math toolkit that you can use to solve any game dev problem.

1. Moving a character with vectors:

2. More moving characters:

3. Finding the distance between two characters:

4. Fast way to compare distances:

5. Speeding up and slowing down characters:

This is very basic stuff, just showing the basics of vector maths, but
eventually I'll be progressing to explaining the math behind more
advanced things. I'm very excited about this series because it focuses
on solving specific problems that come up in game dev all the time. When
I was just learning game development I couldn't be bothered to learn
any math unless it helped me in some way, so every video I make
solves a problem.

I hope to help out people who are just starting their game dev career so
please let me know if I can improve the videos (other than the low
quality audio, a problem I'm working on) or if you didn't understand
something Posted Image

5 For 5 Bundle Postmortem

Posted by , 04 July 2011 - * * * * * · 1,024 views

This article was originally posted on the author's blog, Think Small

People are fickle with their money. Even 5 bucks can be a huge barrier to getting people to forking over their hard-earned cash. But, if you have a better mousetrap that people want then generally, so long as they know that you exist, they’ll beat a wide path to your door. The operating phrase here of course is, “so long as they know that you exist.” One of the primary problems that indie game developers face is that people simply don’t know that they exist. It’s difficult to compete with the marketing and PR departments of half a dozen major publishers, and so one way to push through the clutter is to offer your games at a discount.

In a recent interview Gabe Newell mentioned that he’s observed a high price elasticity in game bundles. What this means in non-Economics-major-speak is that when the price of a bundle goes down the demand for a bundle goes up at a disproportionate ratio. So, selling a game for half as much doesn’t net twice as much revenue, it for example can net ten times as much revenue. Being a marketing neophyte that I am I decided to listen to the advice of one of the most prominent men in the industry and I put together a game bundle of my own. The result of this was the “5 for 5 Indie Games Bundle” (or perhaps the “Buy Games Not Socks Bundle” as it was also called) which was released on the 22nd of last month and ran through yesterday. This is the final report.

Bundles sold: 3,642
Revenue: $18,094

If you compare that to the revenues of the Humble Bundle then it’s a paltry number, clocking in at about 2% of the Humble Bundle’s revenues. But given some of the other bundles that I’ve seen it actually did quite well. All in all I would say that given the type of bundle it was (there was no original pay-what-you-want device to draw it attention) it did fairly well and I’m happy with the results.

This being the first bundle I’ve put together, I learned a few lessons. Here they are, distilled into a neat list for your amicable consumption.

Quality is better than quantity.

The 5-for-5 bundle began as a slightly different idea; to unite 20 indie games into one bundle for 20 bucks. I first started to do some market research to see how people in the bundle’s audience (the core gamer) would respond to a bundle like that and the general reaction was, “I don’t know if I could turn that down.” That was encouraging and I began to dig a little more. But then, there was also a large contingent that replied, “I don’t know how I could have time to play so many games, and $20 is steep even if it’s $1 per game.” So the bundle was simplified to 10 games for $10 keeping with the “x for x” theme. Even 10 games seemed to be a bit high as I soon realized that the logistics of coordinating ten game developers in a single bundle may prove to be somewhat difficult. I also began to realize that I had to make a tradeoff to get 10 indie games in a bundle - many of them may not fit my target audience, and many of them may not be of the required quality level.

In the end I decided to reduce yet again to 5 games, to keep things simple. Even this proved to be rather complicated, although manageable. I can’t say whether the number of games in the bundle is a big influence on sales. On the one hand you could argue that a variety of games helped players pick up a bundle when they wouldn’t have otherwise, but on the other hand you could argue that profit per developer goes up with less developers. I don’t have that data but I think in the future I’m going to lean towards having less games in my bundles.

People don’t like to feel like they are being ripped off.

I hate the idea that someone ever feels like I’m ripping them off. I never want to make a single dollar in this life that isn’t honest and worked hard for. But at the beginning of the bundle I figured, “5 pounds? 5 euro? 5 dollars? All basically the same thing!” Not out of greed but just as a result of not thinking it through. I’ve seen lots of low-price-point items sell for one dollar in the US and one pound in the UK, even though that’s not technically the same amount of money. So I didn’t think about it much and this turned out to be rather shortsighted, as people grew quite mad. A number of people said, “I’m not buying this ripoff crap,” which at first I wrote off to people having an inflated sense of entitlement. But after I fixed it those same people turned around and purchased the bundle. One person who purchased the bundle before the price change asked what I could do about it and I offered him a partial refund, but he passed on that because he just wanted to know that I was being fair. He just wanted to know that I was being honest. Good thing for me, I’m always honest.

People appreciate prompt customer service.

I think that during the bundle the median response time for people emailing me and asking for customer support could be measured in seconds. This is despite getting more than 200 emails due to a logistical error. About 80% of those emails were replied and the issue resolved within a minute of me getting them. The remainder were all resolved within 8 hours, and they only took that long because I was eating, sleeping, or maybe running with my dog. (Come on now, exercise is important!)

The response was clear. At least a dozen people commented on how fast my reply was, or saying, “I think that’s the fastest customer service I’ve ever had.” I learned how to do customer service by working at a big corporation having to do support on some of the most buggy software I’ve ever had to work on. You could say that I learned what not to do working there. The main thing people appreciate is not to have to wait to play the games that they paid for. In the games industry, reputation is critical and customer service is one of the best ways to keep a good reputation. But, it requires having your shit together and knowing how to find and diagnose problems, and having an answer ready for your customer before they email you.

Everything you say is marketing.

I forget where I originally heard this, but it’s true. I’m a personable guy and I love engaging the people who play my game to see what they like about it. I very much am motivated by people who enjoy my game. I want people to feel like they can talk to me any time, because I genuinely like to talk to people who enjoy my games. So it’s not difficult for me to be personal when replying to customer service emails. It pays off, at least a half dozen people mentioned in their emails that they are thrilled about how personal their support was. People respond very well when they know it’s a person on the other side of the line and not a robot.

12 days was too long. 5 or 7 would probably have been the best choice.

If you look at the sales curve, the reasoning for this is clear. Sales drop off pretty starkly after the 4 day mark, after all of the websites that are going to cover you have already done so. In the latter days our sales were stamped out almost completely by other bundles and summer sales. The last 6 days were just a march to the finish with not enough additional sales to justify the extra work.

The 6th game tactic was a failure.

I decided to experiment by adding a sixth game to the bundle midway through. The intention was that just as the traffic to the website would begin to die down, another news flash update would pick it back up again.

This didn’t work for what is in retrospect an obvious reason. Websites who had covered the bundle the week before were not going to re-post the news just because one more game was added, and people who had not purchased the bundle were not going to change their mind due to a single game being added. This also caused a load of logistical problems for me that took a lot of sorting out. In the end everything turned out to be fine, but it caused a lot of extra work for me and generally wasn’t worth it. That’s a shame too since Star-Twine (the 6th game) is a great game and really should have been rolled into the bundle from the beginning.

Marketing alone sucks. Get a professional.

I’ve been teaching myself the ins and outs of video game marketing for the past year and I can safely now say that I know enough about video game marketing to know that I can’t do it. It’s just not something that a developer can do. I looked for a year for a way to be able to do it myself, but it just doesn’t exist. Even if you had the time to do it, you’re competing with the large publishers who have seven digit marketing budgets and they suck all of the air out of the room. This is the only aspect by which I consider myself in competition with other game developers — in the marketing arena.

Fortunately we were smart enough to hire a PR firm to help us promote this bundle. It was well worth the effort, I think our sales would have been half of what they were without the PR firm, and the difference comes out to be much greater than what we paid.

Bundles are a necessity.

There are many things that are a necessity for indie game developers. Having a quality and fun game is one of them. Having a good demo and video is another. But of course the overlooked one is marketing. It’s almost an evil term for many game developers (the poor ones.)

Bundles are a great way to market the game since they get so heavily reported on. They increase the visibility of your game by pairing it with other games that players may know better. It’s an important avenue of discovery. Those same players are more likely buy your next game at full price. This bundle was somewhat of an experiment for me to see how effective they were, but given how effective it’s been I’m going to fold them into a regular part of my long-term plan.

Having an attractive “theme” worked.

I’m really an entertainer at heart. I didn’t learn to program games because I like programming or computers, but more because I like to see people having fun with the things I create. As such I’m always looking for ways to tickle people’s brains. Fortunately for me that’s also a great way to sell bundles. As a group we came up with a theme for the bundle, “What can you buy with five bucks?” the first prospective item being a new pair of socks. Going on from there I picked up the domain name buygamesnotsocks.com and it became the “Buy Games Not Socks” bundle. People responded quite strongly to this. Someone made a #whoneedssocks hashtag on Twitter. One person claimed that instead of buying socks you could print out game screenshots and tape them to your feet. People seemed to enjoy the theme and I think it helped the bundle get re-tweeted a lot. A great deal of our traffic and sales came from Twitter and Facebook, and other social venues. Without a consistent theme I think it would have been much less.

The price was not too low.

Cliff Harris (maker of Gratuitous Space Battles) is constantly complaining on his blog about the ever-dropping price of video games. For the most part, he is right. A week or two before we launched our bundle, he made this post on his blog, bemoaning another bundle which had just come out which was selling 6 games for $5. Personally I think he was just mad that they had undercut his own bundle which was selling for $30. But, even so I think he’s wrong.

Cliff posted on his twitter that he had made about $600 from his portion of the bundle, which means that in total (since there were 5 games) the bundle probably made about $3000 during its run. But the 5-for-5 bundle made that amount inside the first 24 hours. Because of the extensive press coverage we were able to reach out to a large group who would never have purchased these games otherwise, and there’s also the residual benefits of increased exposure. $5 is about what Windows users paid on average for the Humble Bundle. Yes, it’s true that if we had sold the same amount of copies for four times as much then we would have made four times more, but I think we would have sold ten times as many less bundles and made less money overall.

In his post, Cliff argues about the “race-to-the-bottom” pricing syndrome that so many games suffer from and in many aspects (AppStore market, anyone?) he is correct. But I don’t think indie games are suffering from this problem, and it doesn’t apply to these five games because now that the sale is over, the games have all returned to full price.

Many people care a lot about redeeming their downloads on a download service.

This is something I underestimated greatly. We were only able to provide Steam keys for one of our games, although we did provide Desura keys for all of them. I know that people have an aversion to buying things that can go poof at any time. This is why business such as OnLive have such a difficult time convincing core gamers to use their services. Many core gamers dislike the idea of paying for something and not owning it outright and forever. So, when presented with games that can’t be redeemed on some kind of download service, these people simply pass on the opportunity. It’s not even worth the five dollars to those people. This was helped in the latter days of the bundle by making it more clear on the website that the games were redeemable on Steam and Desura.

Many are resistant to buying a game that’s not on Steam.

There’s not much I could have done about this one. I would love for Digitanks to be on Steam but I’m not quite ready to submit it yet. And other than Digitanks there were four other non-Steam games in the bundle. Even so, I think I lost a lot of sales due to the Steam-centric nature of the average core gamer. It doesn’t matter that I think that our collective addiction to Steam is an unhealthy one. It’s not my job to be proselytizer of Steam alternatives and also sell my bundle. The next time I do a bundle I’ll be putting a larger focus on getting Steam support for all of the games.

Mac/Linux is a huge audience.

If more of our games supported Mac and Linux, I think I would have doubled our sales, easily. Many people asked if the games had Linux and Mac support. Many people expressed their disinclination to purchase the bundle without it. During the sale I toyed around in a virtual machine and got a Linux port of Digitanks halfway working. When I announced this on my twitter, two separate Linux-specific websites announced that the game would soon have a Linux port. (That kind of coverage is odd for me. I’m no Markus Persson, things I say don’t usually get reposted as news.)

Linux and Mac users also seem to be a better audience to sell a game to. They are in general more willing to pay for things, and they have a lower quality expectation, which I think is actually to their credit. Linux and Mac users aren’t inundated with a flood of games every week, and they paid almost twice as much as Windows users on average during the Humble Bundle. Plus, I love Linux and Mac, I don’t see why there shouldn’t be a port at this point. I’m making it a primary goal to support those platforms for future versions of Digitanks.

That brings this rather lengthy article to its conclusion. If you have questions or you want to talk about just about anything (especially video games!) I’d love to hear from you. Comment on this article or shoot me an email at jorge@lunarworkshop.com

January 2017 »

151617181920 21