ChilliConnect vs PlayFab vs Gamesparks vs Firebase vs AWS vs Others

Work in progress I’ll be adding more to this post later

Few months ago Unity acquired ChilliConnect that in the future will be optimized to work with other services:

I’ve decided to see how good it is. I guess Unity/ChilliConnect can treat this post as a feedback what I’d like to see being changed.

I’m speaking from indie game developer point-of-view for whom the most important factors are pricing and time. Currently I’m creating BeatAim and so far it uses PlayFab, Steamworks, Openwhisk Actions (on IBM Cloud) and Azure CosmoDB.

Let’s start by removing the worst options:

  • Gamesparks - 299$ per month
    No, thank you. I want my games to be working fine even after 10 years despite how much revenue they’ll be making. There are many cases of dead projects because of similar pricing model.
  • AWS (or Firebase(Google Cloud)/Azure)
    It’s too complicated to run whole game using these services. I’d recommend using few of their features if they seem suitable. For ex. in BeatAim Im using IBM Cloud functions (similar to Amazon Lambda) to generate procedural maps.

PlayFab vs ChilliConnect
We are left with these two. If you know any better options let me know!

Pricing
Links: PlayFab ChilliConnect

Free Option - PlayFab wins
PlayFab:

  • Free tier with some limits but no MAU limit!
  • Indie/Pro tier free until 1k MAU

ChilliConnect:

  • only 1 month free trial

Paid Option - Platform fee - PlayFab wins
PlayFab:

  • Indie - 99$/month per studio - same as Pro up to 100k MAU
  • Pro - 299$/month per studio
  • Enterprise ???$/month per studio

ChilliConnect:

  • Indie - 49$/month per game
  • Start up - 249$/month per game
  • Studio - 749$/month per game
  • Enterprise - ???$/month per studio

I’ve noticed this as of writing this post. The “per game” cost is awful for small games. Let’s say u’re going to make 10 small mobile games. All of them pulling 5k MAU, total 50k MAU:

Platform fees examples:

10 games, total 50k MAU:
PlayFab : 99$/month (or free tier with limits)
ChilliConnect : 490$/month

10 games, total 200k MAU:
PlayFab: 299$/month (or free tier with limits)
ChilliConnect: 490$/month

1 game, total 200k MAU:
PlayFab: 299$/month (or free tier with limits)
ChilliConnect: 49$/month

1 game, total 50k MAU:
PlayFab: 99$/month (or free tier with limits)
ChilliConnect: 49$/month

1 game, total 1k MAU:
PlayFab: free
ChilliConnect: 49$/month

Well this is only half of the story but upfront fee is definitely higher in ChilliConnect.

On their website ChilliConnect posted this:
Development Phase:
Month 1: Free trial
Months 2 -16: Indie Pricing Tier @ $49 per month = $735
Soft Launch
Months 17-24: Studio Pricing Tier @ $249 per month = $1,992
Total Platform Fee: $2,727

Calculated the same for PlayFab:
Development Phase:
Months 1 -16: Free
Soft Launch
Months 17-24: Pro Pricing Tier @ $299 per month = $2,392
Total Platform Fee: $2,392

So even with their own example PlayFab seems cheaper. If your studio makes 2 games simultaneously ChilliConnect cost will be doubled.

Paid Option - Usage cost - It depends

  • high ARPU PlayFab wins (probably)
  • low ARPU ChilliConnect wins (probably)

PlayFab uses per MAU pricing - 0.008$/MAU
ChilliConnect uses per API call pricing - 24-19$/million calls

TBC

PlayFab Limits
The biggest advantage of ChilliConnect is that there are almost no limits of content in you game. For ex:

Leaderboards count
PlayFab:
Free - 25
Indie/Pro - 300
500 leaderboards - $49.99 / 100,000 MAU
more??? - enterprise pricing

ChilliConnect:
unlimited - pricing based on usage

Steamworks:
10,000 leaderboards per game

A month ago I’ve upgraded BeatAim from PlayFab leaderboards to Steamworks. Biggest disadvantage is no cross-platform and sometimes Steam servers simply don’t work.

TBC

Useful links:

3 Likes

I have a live game using PlayFab (Major Mayhem 2) and I’m working on a new game using ChilliConnect. I’m surprised at how inactive the development forums are for both these services. I wonder how many developers are actually using these services?

Are there other ChilliConnect users out there? If so where do we go to talk about ChilliConnect? Should there be a unity forums section for it? It is owned by Unity now after all.

As for pricing comparisons, it’s not that simple. It really comes down to your goals and your skills and your game. PlayFab made the most sense for Major Mayhem 2 but also ChilliConnect didn’t really exist at the time. But for my new project, an async turn based game, ChilliConnect speeds up development so much that it’s worth the potential higher price. Overall I’ll save money as my game will be complete months earlier. Also, PlayFab requires you use Photon even for async games, so this is an added cost on top, whereas ChilliConnect only requires Photon for realtime multiplayer.

I also found PlayFab’s match making simply isn’t useful for async games. it requires both players to be searching for a game at the same time much like a realtime multiplayer system (as it is the same system as Microsoft’s xbox match making system), whereas all I require is a list of games that aren’t full so the next person to search just pops a game from the list and starts playing regardless of the opponent being online or not. ChilliConnect gives you this out of the box.

P.S. BeatAim feedback, as a counter strike player, you should add headshots. :smile:

2 Likes

There’s headshot mode youtube :slight_smile:

Good to know Chilli has async multiplayer. Do you know any other advantages?

Just read this on multiplay.com:

In PlayFab there can be only 1 server = lowest price 50$/month + also 100 free hours. I guess Chilli is not for me then as we don’t even know when it will get Multiplay integration.

I haven’t looked at much beyond chilli’s async stuff so I couldn’t tell you.

As for realtime multiplayer, you’re meant to use photon with either chilli or playfab. is that not an option for you?

I’m looking for a solution with dedicated servers (low ping/latency required). Photon price doesn’t include them.

New DOTS Netcode looks good but I’m waiting for more stable version. Then DOTS Netcode + PlayFab servers should be enough.

Disagree strongly that AWS/Azure are the worst options. They can certainly be complicated dependent on the user’s experience and range of skill sets. But, once you start figuring them out, it easily can be your one stop solution for anything you can dream up.

For example, you are using Playfab (built on Azure) with IBM cloud functions. Something like that could be simplified on Azure with a proxy, a similar trigger function and a database. Azure functions also have an inline C# editor where you can keep the whole project in C#. On top of that, your trigger function can also be the gateway to 100’s of other services including storage, devops, starting up and managing game servers. The list is endless and all from the same website.

To me; although cost effective, I find Playfab limited. To be able to sort/protect data, run a schedule, or anything complicated I got to attach a database or storage through “Cloudscript.” Which is pretty much an Azure Java trigger function anyways.

Comparisons between all these services are highly debatable and are likely going to be varied depending on what you are trying to accomplish.

2 Likes

I consider them to be bad as it would take a lot of time to implement all basic features. Currently what I’m using:

  • logins including linking to Steam
  • leaderboards
  • inventory
  • virtual currencies
  • in app purchases through Steam (confirmation managed by playfab)

In future also plan to use their multiplayer services which is: matchmaking, party, server orchestration.

I guess it would take months to recreate all of it for a single person or a small team using AWS/Azure.

I’m using ibm functions for generating maps in game, it’s not really related with playfab (other than authenticating requests). I’ve looked into many solutions for this kind of use. AWS Gateway pricing seems really bad, Azure handles big incoming payloads really bad - 20x worse price. https://social.msdn.microsoft.com/Forums/en-US/772a41bb-2c1b-40db-a376-59a1d693ba8e/function-duration-time-is-few-times-higher-than-actual-processing-time?forum=AzureFunctions

1 Like

Above was tested again in functions v3, it gave a lot better results:
Windows ~550ms
Linux ~150ms

PlayFab + Azure best option currently.

#Edit
Nevermind went back to IBM, I dislike Azure functions additional cost of storage and logs

I dont know ChiliConnect, but seems it offers DB integration, which is golden if the features of the service come short. In that regard my experience with Playfab has been really ugly. It results quite limited, you need to create endpoints yourself for pretty much anything, the data handling and storage is really limited, and you’re dealing with a custom made approach based on an underlying philosophy thats not explained anywhere.

I agree however, a month for R&D is not enough, and I doubt I would consider paying for trying, so on the pricing scheme ChiliConnect comes short. I wonder if the rest of it would compensate.

Yeah, the pricing of chilli in dev stage is definitely bad. I’m at least a month out from releasing a soft launch and I’ve already had to start paying monthly instalments and I’m just a single developer and at the moment I don’t even login as that’s not the feature i’m working at the moment. I implemented the chilliconnect stuff early as I considered it the largest risk of my project but now that’s costing me.

I had anticipated this though as at least they were upfront and clear about how it worked. It was still the right decision, but everything would be better if it were free :slight_smile:

Do you mean Cloud Data? Looks like it’s not that great:

100k rows in indie tier is nice but you can have only 1 json and 1 long text field :confused:

No, not that. Have not verified the info myself, but one of the comments on the announcement blog, reads that ChiliConnect provide access to DB to extend the platform [src].

Was using GameSparks and AWS GameLift. The pricing change to GameSparks forced me to consider Chilliconnect. Unfortunately they are missing websocket support so you can’t push server side messages to clients. Their roadmap for this feature was delayed and then being acquired by Unity looks like it probably had further impact.

Currently using Firebase (authentication, functions and realtime database) with AWS GameLift. I agree Firebase is probably a headache for anyone who hasn’t used similar cloud services before. It’s less a “product” and more a “tool”. You can do anything you want, but that means you have to make/handle/develop everything yourself.

Firebase benefits:
1.) Realtime database syncing from server to clients is instant. I’m currently using it for player data (currency / inventory data), as well as a replacement for messaging. It provides clients with multiplayer matchmaking info, matchmaking ticket status, server ip and port info, and match results etc. As soon as a match is ready it writes the server ip and port to the database and the client gets that info instantly. No waiting and no need for the client to make a “request”. If they do get disconnected it’s right there and available when they need to reconnect.

2.) Deep linking / Dynamic links. I haven’t implemented this yet so we’ll see how it goes but it’s one of the reasons I chose it. You can set up http links that open to specific parts within your app.

3.) Price - Usage based

Firebase draw backs:
1.) No Windows/Desktop support for authentication. Not an issue for my current project, but with the amount of work I’ve put in it would have been nice to be able to use it with any future desktop projects. I haven’t looked into it but their maybe a way to use the “web authentication” portions for this instead but not sure.

2.) Dev environment. I hate node.js/ javascript/typescript. Having to learn that + async logic simultaneously was annoying. On top of that not being able to use visual studio and finding a good alternative sucked. (Settled on VS Code).

3.) Functions cold start times. The amount of time it takes for a cloud function to execute from a cold start is pretty bad. Not a huge deal if you have regular calls to it but can sometimes be in the seconds when it’s first called.

4.) No built in app purchase verification. There is an open source library for this that I believe support Unity receipts, I haven’t tried it yet but is annoying they don’t have something built in.

1 Like

2.) Deep linking / Dynamic links. I haven’t implemented this yet so we’ll see how it goes but it’s one of the reasons I chose it. You can set up http links that open to specific parts within your app.

Depending on what you need i found their deep/dynamic linking was not very good. It’s slow and the gives a bad user experience compared to doing it yourself, it’s also a one size fits all solution which makes it not really very good at any specific problem.

PlayFab also lacks this feature but they have PubSub in private preview.

I know the pain, same case in PlayFab but as a workaround Azure Functions can be used with additional cost. Chilli also has some kind of C# to javascript converter meaning libraries usage is very limited :(.

Azure Functions have also pretty bad cold starts, when using PlayFab as an auth proxy it only gives 5 sec (free tier) or 10 sec (indie/pro tier) to finish the action and otherwise times out.

I’ve switched back from Azure Functions to IBM Openwhisk Functions as I’ve discovered that custom docker images can be used instead of default .NET 2.2 runtime. It’s amazing:

  1. I think none of the FaaS services offer it but Openwhisk allows to schedule a function not only using cron (daily, every 5 mins etc) but also to run it once on a specific date. It is extremely helpful, now I can prepare everything in advance and just monitor if everything run correctly. It’s also almost completely free - compared to Google Cloud Scheduler - $0.10 (USD) per month per job.

  2. You can create your custom docker image and use it instead of default implementation. Spend few days tinkering mine and cold starts improved by 1 sec to 300-500ms. Total cold time start to respond dropped from 5 sec to 2,5 sec with 6mb function.
    Here’s my fork: https://github.com/kamyker/openwhisk-dotnet-csharp

  3. 5.000.000 requests per month for free :smile:

  4. IBM Cloud Object Storage is the cheaper than Azure, Google, AWS and even Backblaze. Unfortunately Cloadant (database) pricing is terrible.

One month ago Azure Cosmos DB got free tier with 400 RU/s (400 get requests with 1kb size files). That’s 1bln-500mln requests per month :smile:.

Servers locations are a bit of a pain:

  • PlayFab - Seattle
  • Steamworks Partner Api - Seattle
  • IBM Cloud functions and object storage - Dallas
  • Azure Cosmos DB - Austin? (~200 miles from IBM) or Seattle

Unfortunately IBM doesn’t have servers in US West region

That’s the stack I’m gonna use from now on. First implementation is global ranking combining multiple steam leaderboards: https://beataim.com/esports

I’d be interested if you have any more information you can share or alternative you’d recommend looking into

I’ve tried multiple times over the last year to get in private preview to no avail. I’m sure they’ll release just before I release :frowning:

I’ll have to look into the IBM cloud stuff more, kinda always forget about them.

I really did like Azure functions build process and integration with visual studio. Be nice if they would include the cost into PlayFab somehow.

Oh s**t:

Multiplayer servers in free tier: Fv2 VM Hours 1,500 :open_mouth:

1 Like

It looks good but it could be a lot better.

Biggest disadvantage: whole project with all functions is zipped and sent to azure, then all functions get updated - in my experience it’s not that fast, can’t imagine having bigger project.

OpenWhisk/IBM: you can have as many projects as you want and update only single function. Using cmd is a bit painful but I’ve created simple Unit Test to do every thing for me. It takes ~15 sec to update a function :smile:

[TestClass]
public class UploadFunctions
{
    MethodInfo methodInfo;
    MethodInfo GetMethodInfo( Func<HttpContext, Task> d )
    {
        return d.Method;
    }

    [TestMethod]
    public void Up_Hello()
    {
        methodInfo = GetMethodInfo( Functions.HelloClass.Hello );
        UploadMethod();
    }

    //always keep namespaceName == {namespaceName}.csproj
    public void UploadMethod()
    {
        var namespaceName = methodInfo.DeclaringType.Namespace;

        string path = $"<PATH_TO_YOUR_PROJECT_FOLDER>\\{namespaceName}";

        var buildFolder = path + "\\out";
        if ( Directory.Exists( buildFolder ) )
            Directory.Delete( buildFolder, true );
        Directory.CreateDirectory( buildFolder );

        File.Delete( path + "\\out.zip" );
        RunCommands(
            new List<string>()
            {
                    $"dotnet restore {namespaceName}.csproj",
                    $"dotnet publish {namespaceName}.csproj -c Release -o    out",
                    @"cd out",
                    @"C:\Program Files\7-Zip\7z.exe a -r ..\out.zip *",
                    "pause"
            },
            path );

        RunCommands( new List<string>() {
                $"ibmcloud fn action update {methodInfo.Name} out.zip " +
                $"--docker kamyker/openwhisk-action-dotnet-v3.1:stable " +
                //$"--docker openwhisk/action-dotnet-v3.1 " +
                $"--main {methodInfo.DeclaringType.Assembly.GetName().Name}::{methodInfo.DeclaringType.FullName}::{methodInfo.Name} --web raw",
                "pause"
            }, path );
    }

    public static void RunCommands( List<string> cmds, string workingDirectory = "" )
    {
        var process = new Process();
        var psi = new ProcessStartInfo();
        psi.FileName = "cmd.exe";
        psi.RedirectStandardInput = true;
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardError = true;
        psi.UseShellExecute = false;
        psi.WorkingDirectory = workingDirectory;
        process.StartInfo = psi;
        process.Start();
        process.OutputDataReceived += ( sender, e ) => { Trace.WriteLine( e.Data ); };
        process.ErrorDataReceived += ( sender, e ) => { Trace.WriteLine( e.Data ); };
        process.BeginOutputReadLine();
        process.BeginErrorReadLine();
        using ( StreamWriter sw = process.StandardInput )
        {
            foreach ( var cmd in cmds )
            {
                sw.WriteLine( cmd );
            }
        }
        process.WaitForExit();
    }
}

Don’t forget to change “C:\Program Files\7-Zip\7z.exe” and “<PATH_TO_YOUR_PROJECT_FOLDER>”

@Kamyker hello,

what is the best rest api in your opinion? Playfab or go crazy with AWS?

I have a mobile game which is using Photon Pun and ı want to intagrate authentication, player data, send game invites etc. I’m interested in Playfab right now, but I haven’t started yet. What would you suggest?

Thank you.

Whoa, that’s a major upgrade from the 20 hours a month they had previously. That’s enough for keeping two servers up 24/7 all the time.