Categories
Game Development

Middleware Marketing 4: Connections and clout

Last week when I was looking for web design companies to make a new website for RakNet, I sent out about 10 requests for bids. The request was well-written, complete, and professional. However, I only got 5 responses. At roughly the same time, I contacted 3 marketing firms to help market RakNet, and didn’t get any responses.

Imagine if, instead of Jenkins Software, Microsoft or Sony sent that same sales request? How many replies would they have gotten?

This is clout, and its based on how much money the other side thinks you have, and how much they think they can gain from dealing with you. It’s like a game almost, where you have to have a certain clout level to talk to certain NPCs.

Connections are the cheat codes to give yourself clout with certain NPCs.

Yesterday I said to a friend, “Friends and connections are what this industry is about I think.” In fact some business activities require so much clout that it is nearly impossible to achieve them without connections, or the clout that connections have already provided you:

1. Become a licensed console developer
2. Sell to a company that makes over a few million in sales a year
3. Purchase major advertising
4. Get mentioned in major game industry news reports
5. Hire top-tier talent
6. Partner with other companies to form bundling deals
7. Get outside funding

And if I wrote a list of the 7 activities that make a middleware company most likely to succeed, what would that be?

Succeeding with connections is not a matter of making false friends of hope of getting something in return. It’s about being able to work with people you trust, and having those people trust you in return. Big deals require trust and 90% of our daily interactions is based the human factor.

Don’t burn your bridges, make an effort to know people, give good customer support, help people who ask for help sincerely, and keep in contact with the people you do know.

Categories
Game Development

Middleware Marketing 3: Compete on quality, not price

When I originally released RakNet I charged $2,000 per application. Later, I charged $0 (free) to increase market share because nobody was buying it at $2,000. Later, as it improved I charged $4,000. I got some sales there, so raised my price to $5,000. All the while I was wondering at the greed of my competitors that charged hundreds of thousands for more restrictive licensing terms. I was competing on price because I could afford to do so, and while my prices were good for an individual at the time, they weren’t enough to hire web designers, support, testers, etc. so I was endlessly stuck as a one man operation. I even read back then on Joel on Software about startups “Don’t compete on price” but didn’t listen.

What I didn’t understand at the time is while there was a HUGE difference between $2000 and $10,000 to me as an individual, to a developer that is the SAME AMOUNT OF MONEY – if your software helps them, they will license it either way, and it’s just as hard to sell to them. This is even more true with a publisher. You could charge basically what it would cost to write, and they would still license your software as long as it saves them time.

The hard part is:

1. Get them to know about your product in the first place
2. Convince them your product is worth using
3. Get through the non-programmers and legal to actually get money into your bank account

Because I undercharged originally, I short-changed my company money licensees would have been willing to pay. And since I was charging one-man prices, I never grew beyond a one man operation.

You might ask, “So what, as long as the quality is the same?” I did, and for programmers it doesn’t matter, because they are looking at your code, not your website. This will get some sales at smaller companies. At larger companies, programmers usually aren’t the ones writing the checks. Before signing any big deal, HR, lawyers, and producers are going to look at your site. And as I found out the hard way, all it takes is for a lawyer to say “This guy’s site sucks, so we don’t even want to deal with him” to stop a deal.

Also, by not financially growing your company, your competitors that do get the funds / clout to do direct marketing, and bundling, and get their software on the front page of gaming sites. I on the other hand have to sell to smaller customer base, many of whom already have my competitor’s product through a bundle. It’s like how I bought Windows Vista with my laptop, something I would have never done if I had the choice. Right now I have so little clout that even some advertisers won’t return my calls.

Because the quality is so good, RakNet actually has #2 marketshare right now, and I’m proud of that. But I only recently started charging realistic prices, and have to play catch-up.

Categories
Game Development

Middleware marketing 2: Require links and logos

Bit of advice based on what I’m going through now:

If you ever write middleware, make sure your contract includes that you can list the customer on the customer page of your website. It’s easy to get when selling your middleware, but quite hard to get retroactively. Right now a huge game is coming out using RakNet, and I’m not sure if I can list them as a customer which is very frustrating.

I hear that all other middleware companies also force the developers to list the middleware library logos on their splash screen. That’s another thing I previously had optional, and in practice has only happened once that I’m aware of. I’ve probably cheated myself out of a lot of free marketing and sales because of that. Make it another requirement.

I have another deal in the works and just delayed it to ask for this, but it’s important enough I’d rather lose the deal than get a deal without it.

Categories
Uncategorized

Middleware marketing 1: Make sure your ads are targeted for Google Adwords

What I’m about to write may sound obvious, but I didn’t do it, so I think it bears stating. When advertising on Google Adwords, be sure your ads are as targeted as possible to avoid wasting money.

Originally I listed every keyword I could think of that was related to RakNet in some way. I came up with like 80 keywords, in fact Google makes it easy to do this.

I set a budget of $20 a day, and almost immediately hit my cap. The campaign optimizer suggested I increase to $100 a day. But as I previously wrote, I had no new sales nor did the forum show increased activity. About the only increased activity I got was Chinese spammers. I wasted about $300.

I went back and targeted all my ads. In the ad for example it clearly states that it’s a C++ programming library. I also disabled ads from non-relevant categories (porn, law enforcement) which are enabled by default. I also disabled ads from domain parking pages, since programmers are smart enough not to go to these pages anyway.

This dropped me down from instantly hitting $20 a day, with a recommended cap of $100, to spending a few dollars a day.

Categories
Uncategorized

10 gigabytes of requests from China?

I was looking at some strange Webalizer stats for RakNet.

This IP address 211.153.203.4 has required 10.7 gigabytes worth of data in only 5 visits. That is 10X more than the next highest IP address 91.67.34.76.

The IP address is from China.

91.67.34.76 is in Germany, and has requested 1 gigabyte in a single visit.

I’m not sure, but my guess is all those forum spammers is some gang or bot computers because I can’t see what else would use that much bandwidth.

Edit:

Webhost told me to make a .htaccess file with this list:

Deny from 211.153.203. 91.67.34.76

I tried it with my own IP, and it seems to work.

Edit 2:

After doing this yesterday, today my traffic was down by 80%! So it looks like 4 out of 5 visits were just spam bots from China trying to hack the forum. Good grief!

Categories
Game Development

Quality of service emulator

Screenshot

It uses the layered service provider system I wrote about. For any UDP based application (actually with one line of code change it work with TCP too) it will add the desired attributes to the connection.

One big snag is how to implement an incoming bandwidth throttle. There are 3 ways data can come in, nonblocking, blocking, or with IO completion ports. Nonblocking is the easiest, I just stick the data into a buffer and return it when the user later calls recv or recvfrom again. Blocking is harder. I would have to put an infinite loop in the recvfrom call and not return until the required latency has elapsed. However, you can break out of the Windows version of recvfrom with a signaled event, and I have no idea how I’d hook into that event. IO completion ports is similar to nonblocking, but the buffer has to be added to from a worker thread elsewhere. If I can’t figure this out I’d have to drop the incoming bandwidth throttle. This would have been easier if I had implemented it at the NDIS level, although it would have been harder in other ways.

Another problem is the layered transport service provided by windows is DLL and registry based. So if you were to kill the program with end process, the DLL would not be uninstalled automatically when the process shuts down. If you were to then delete the program without uninstalling it that DLL would be stuck in your system, loading up the QoS emulator when you don’t want it. I’m not sure if the DLL can unregister itself in its own startup call. If I can, I will check for the program installation in startup, and have the DLL unregister itself if it looks like the program was uninstalled.

I’m not sure all this will work on Vista either. There was some crap in the Windows SDK documentation about security and various extra things you have to do in the installer, the registry, and the program itself. I only scanned over it in passing while looking for info on the Winsock debug/trace DLL system. I hope there’s code there I can just copy/paste.

This program has been very complicated and difficult to write, partly because I’ve never done anything like it before. It requires knowledge of threads, IO completion ports, sockets and socket properties, the registry, installation settings and permissions, interprocess communication, hooking in and debugging DLLs called by the system, and complicated associations between LSPs, the high level user-code, other LSPs, and the low level transport service provider. That article by Microsoft states “You will probably find that implementing an LSP is no longer a daunting and time-consuming task if you simply extend the layered sample” but if they consider that to be easy I’d hate to see what they consider hard.

Thanks to Jason King for help designing the GUI!

Categories
Uncategorized

Dumbasses

50 Indians blind themselves searching the sky for a reported image of the Virgin Mary

Categories
Uncategorized

Google adwords less effective than before

About 3-4 years back I used Google adwords to advertise RakNet. It was a good deal then. My daily budget was $3 a day. I got $100 worth of clicks, with the average click through rate at 2% and the average cost per click at 5 cents.

At the same time I looked at regular banner advertising. It was like $1500 for one month with no guarantee of clicks at all. By an order of magnitude Google advertising was better than banner advertising. So I signed up, but due to lack of funds at the time without a proportional increase in sales I stopped it.

I’ve tried Google advertising again two weeks ago. Now I can’t even show up for the same terms, and they want $5 per click to do so! Outrageous considering 99% of people who click on an ad won’t buy anything. The average click cost is 25 cents, the daily maximum is $20 and there is a notice saying I am not receiving 79% of my eligible impressions. In other words, they want $5000 a month for what I did with $100 a month before. While I am getting clicks through the content network, I think most of those are fraudulent or not relevant. There are more guests online in the forum, but those are probably spam bots, since if they really were new users I would be getting a proportional increase in help posts, and I haven’t been. I’ve been also getting more junk email about website ranking, so that’s another sign it’s just bots.

I’ll give it another two weeks and cancel if I don’t see a justifiable increase in new user posts on the forum. No sense in paying money just to get more spam!

I’m going to also look into a banner ad on GameDev.net if the price is comparable. However, a friend who runs a major gaming site said he had to refund an advertiser’s money because it only got 3 clicks out of 2 million impressions. So I’ll have to ask them if they have any guarantee of clicks, and average number of clicks per ad.

Categories
Game Development

Networking friendly game loop with variable length updates and renders

I was reading http://dewitters.koonsolo.com/gameloop.html where the author, Koen Witters, proposes a fixed-update game loop with a variable update render loop using interpolation to find out between-frame render positions. It’s a well written article and his solution is good for single player games.


const int TICKS_PER_SECOND = 25;
const int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
const int MAX_FRAMESKIP = 5;

DWORD next_game_tick = GetTickCount();
int loops;
float interpolation;

bool game_is_running = true;
while( game_is_running ) {

loops = 0;
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) { update_game(); next_game_tick += SKIP_TICKS; loops++; } interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick ) / float( SKIP_TICKS ); display_game( interpolation ); }

However, this has problems with online games. In networking, you often need to extrapolate given a prior position and some amount of time to the current time. For example, I may get a position packet 208 milliseconds ago. If I were to update every 40 milliseconds (25 ticks per second), I would have 8 milliseconds leftover. This moves the problem of left-over ticks to your game objects.

You can either calculate partial ticks, in which case your game objects are slightly out of synch with the fixed-step simulation, or you can ignore them, and just use the least number of ticks you can fit in. If you get frequent updates this is OK, but for objects that are not updated frequently things can get out of place, and a lot faster than 2.4336088699783431e-13.

My solution is variable length game updates with variable length frame updates, with a frequency limit on game updates.

Variable length updates with variable length frame updates:


// Do not skip more than one second (due to debugging)
const int MIN_UPDATE_TIME=1000;
// Do not update more than every 10 milliseconds
const int MAX_UPDATE_TIME=10;
// How much time to render forward
float renderExtrapolationTime;

bool game_is_running = true;
Time lastGameUpdate=GetTimeMS();

// Force the first ever update, before the first ever render
Time elapsedGameTime=MAX_UPDATE_TIME;
while( game_is_running ) {

if (elapsedGameTime >= MAX_UPDATE_TIME) {

if (elapsedGameTime > MIN_UPDATE_TIME)
elapsedGameTime = MIN_UPDATE_TIME;

update_game(elapsedGameTime);
lastGameUpdate=GetTimeMS();
}

renderInterpolationTime = GetTimeMS() - lastGameUpdate;
display_game( renderExtrapolationTime );
elapsedGameTime=GetTimeMS()-lastGameUpdate;
}

Categories
Uncategorized

Babies with breasts

Two close friends just had a baby together two weeks ago. Yesterday, they took the baby to the doctor because they found lumps growing on her chest. Turns out they were breasts.

My friends always buy the cheapest meat they can find from a major warehouse store, especially beef. Beef is pumped full or hormones like some chemical Frankenstein, to make the cows grow and produce milk as quickly as possible. These hormones get into the food supply, and cause many health problems

Hormones in beef linked to male fertility problems
Hormones in beef
Alarm over beef link to breast cancer
Artificial hormones in U.S. beef linked to breast cancer, prostate cancer

Chicken and other meats are no exception.

I’m trying to avoid meat and only buying organic from now on.