Vortelli's Pizza - A 3D Multiplayer Kitchen Sim

After 1.1 million plays in soft launch and countless updates, Vortelli’s has finally been released globally on Poki. You can play it here: https://poki.com/en/g/vortellis-pizza

My Journey with PlayCanvas
I started working with PlayCanvas in July of 2021. After one year of on and off work, I released a playable version of Vortelli’s in mid-July 2022. After having spent so long working on the same project, I had no idea if it was any good. It received a small amount of attention from Twitter and the PlayCanvas forums. Around the same time, I sent a demo to Poki.com. I was absolutely delighted to learn that the Poki team loved the demo and wanted to work with me! I signed their publishing agreement and over the next few weeks, I worked with them to integrate their API and monetize the game with ads.

At the end of August, Vortelli’s was soft launched in a few test regions, Brazil, France, Italy, Sweden and Turkey. This was my first time launching a game at scale and I had no idea what to expect. On the first day, my eyes were glued to the stats dashboard and I kept checking my game server logs over and over. I didn’t get much actual work done that day! The player count peaked at 12 on the first day of soft launch.

The next day, I noticed a worrying netcode bug and players were leaving angry reviews complaining they couldn’t click on anything in the game. After hours of stressful debugging, I found a time code bug in the netcode I’d written where players with low spec devices were sometimes getting desynced and weren’t able to interact with objects in the game world. In a mild panic, I managed to implement and deploy a fix. I learned that the dt variable can drift over time making it unsuitable for precise time keeping, use performance.now() instead. Unfortunately that was just the start of my problems.
Screenshot from 2022-11-10 14-10-01

The next morning I was woken up around 4:30am by a notification that all the servers were completely full. At this point I had two servers, one in Dallas USA and another in Frankfurt Germany, each capable of supporting 40 players. At first, I thought this was a bug and maybe departing players weren’t getting disconnected correctly? Unsure, I created two more servers and within minutes they were also completely full. Vortelli’s somehow had 160 players online! I kept creating new servers and they seemed to be filling up as quickly as I could launch them. This was not a bug, Vortelli’s has been featured on the front page of Poki and there were thousands of new players finding my game. I believe Poki’s system automatically moves games with strong user engagement to the front page.

Eventually the player count settled down and I got to work on automating the server scaling. I knew I couldn’t wake up at 4:30 every morning to manage servers. I used Linode’s API to automatically create new servers as the player count increases and then automatically shut them down as the player count decreases. I didn’t get this 100% perfect on my first try, there was at least one time when I accidentally shut down servers with players still on them. My apologies if you were one of them.

Over the next few weeks, I worked to fix bugs and implement some new features. There were all kinds of helpful suggestions from the PlayCanvas community, Twitter and the Poki team. During the soft launch period, Vortelli’s was played 1.1 million times.

PlayCanvas has proven to be very reliable, especially across multiple devices of varying specs. Uploading PlayCanvas builds to Poki is very simple. In the PlayCanvas editor, I can simply download a .zip of my entire project, then upload the same .zip into Poki’s developer dashboard.

PlayCanvas and Poki work well together when it comes to error tracking. The Poki dashboard maintains a live feed of the console errors coming from players’ browsers. PlayCanvas provides very clear error messages containing script file names and line numbers, even in exported builds which has made it very easy to track down issues even in production.

Despite the occasional stressful situation, this has been a really fulfilling project. I have a few Vortelli’s updates planned and of course I’m open to suggestions from the community. If you have any questions about Poki/PlayCanvas, please let me know, I’ll do my best to help!

10 Likes

First of all congrats! I am really inspired by your success.

I have a few questions, I would be happy if you could answer them :slight_smile:

I plan to make multiplayer games using PlayCanvas but I can’t decide about the networking library.

  1. Which networking library did you use to make Vorltelli’s Pizza?

  2. Looks like you are using server auth movement, how did you manage to move players in the server (which physics library)?

  3. Does your movement use client-side prediction?

  4. What’s the average CCU you have?

  5. What was the most difficult thing you faced while developing this multiplayer game?

  6. What’s the average server rent cost you are paying to the Linode?

Sorry if this is too much!

Thank you so much! I’d be more than happy to answer all your questions.

  1. The server is written in C++ and I’m using uWebSockets as the networking library. The clients use the WebSocket API.
  2. Yes, I’m using server-auth movement. I’ve written my own collision detection on the server. It’s very simple and treats all objects and players as non rotated cuboids. It detects and resolves collisions by calculating overlaps on each of the three axes. I initially used Bullet Physics but ended up writing my own for better performance. Bullet is great if you have complex geometry or advanced physics.
  3. Yes, it uses client-side prediction. The server sends reconciliation packets regularly to correct desyncs.
  4. It has been 9 days since launch, average CCU has been close to 2,000. It touched an all time high of 3,035 yesterday.
  5. The most difficult thing has been the netcode by far. Netcode is very tricky to get right. Accounting for and testing varying pings, packet loss, high FPS clients, low FPS clients and connection drops is extremely tedious and time consuming. There are still issues with my netcode that I’d like to improve.
  6. I’m using Linode’s Nanode 1 GB instances which cost USD $5/month each. I’m also using Linode’s API to automate the horizontal scaling. The server count ranges between 40 and 60 servers depending on the player count.

Hope this helps, let me know if you have any other questions!

3 Likes

Thank you for the detailed answer! I wish you success in your future projects :smiley:

1 Like

3k CCU! Congratulations.

Is the majority of traffic coming from Poki?

1 Like

Thanks! Almost all the traffic is from Poki. Maybe 5-10 CCU via the Playcanvas URL which has now been updated to redirect to Poki.

Hi!

I was reading your blog post on poki’s blog about Vortelli’s Pizza Delivery, And now this, i feel really inspired by your success and you are the major reason i’m looking into PlayCanvas instead of Godot…

I have a few questions that i would massively appreciate if you could answer:

-Why Playcanvas instead of something like Unity/other?

-Do you recommend i develop for poki? the main question here is about how hard is it to actually get hosted there and does being hosted but not on the main page mean the game is somewhat dead?

-Do you recommend a certain theme/style/genre based on your experience with poki’s audience? any key learnings?

Thank you so much for your time!.

1 Like

Thanks, great to hear!

  • PlayCanvas is lighter weight than Unity in terms of download size and start up times. Players don’t want to wait for their games to download and initialize, faster is better.
  • Yes I do recommend Poki, they have a massive audience hungry for all kinds of different types of web games. Poki games need to be polished and have well-defined, simple game loops. Games on the home page get a ton of traffic, but it’s not the only way. A huge number of gameplays come from referrals from other games.
  • There is no single theme/style/genre that works consistently on Poki, audience tastes are constantly changing over time. Whatever you build, keep it simple and make it easy for players to learn. No 40 minute tutorials with paragraphs of text.
2 Likes

Thank you SO much for your time! Your answers are invaluable!

Hopefully Playcanvas will be my main engine going forward!

If i may take a bit more of your time, i made a game which is now hosted on crazygames, i got access to poki dev, and with playtesting, i noticed player’s can’t understand the tutorial

So i changed it to be symbolic, even now, players can’t understand they should use the keyboard controls that are clearly visible.

I know this games is a not a fit or of enough quality for Poki, i’m just using it to get some experience with the audience.

i would massively appreciate if you could try it out and point out my mistakes if you saw any!
preiview link (Desktop):
https://poki.com/en/preview/d03f15c8-0911-4078-9182-e07734fda6a6/17232d0a-924d-41c1-bf6b-418e9d8730c1

A couple of things:

  • The initial download is 16MB. Try to get it under 5MB. If you’re working with PlayCanvas, there is a page dedicated to this in the user manual: Optimizing Load Time | PlayCanvas Developer Site
  • You’ve done well to simplify the tutorial. I’ve found that players don’t read and they pay minimal attention to symbols and signals. I ran off the edge twice before I realized it’s not a 2D platformer. If you’re going to allow the player to move around, give them plenty of space to move around in.
  • The shooting mechanic is awesome and it’s satisfying to have a single shot hit many targets
  • Is it possible to rework the upgrade logic so it doesn’t interrupt the game flow? Can you put them on the side of the hud so the player can keep playing and then upgrade when they’re ready? Lots of players drop whenever something takes over their screen when they’re not expecting it.
  • For level-based games, only give the player one new thing to learn each level to avoid overloading and confusing them. A good example is Level Devil: https://poki.com/en/g/level-devil
1 Like

I can’t possibly thank you enough for taking the time to try it and giving feedback!

-Sadly, the engine i used for this game is godot, an empty project compressed is 10mb, that’s one reason to move to PlayCanvas

-I will explore solutions like not allowing the player to fall

-So glad you liked it :smile:

-Wow i never thought of that, i’m not used to web, mobile/pc games (rogue-likes in perticular) do this where upgrades cover the entire screen, i will be considering another approuch!

-Oh i see, i might be able to introduce fireballs later in the game, only shooting and movement for the initial tutorial.

If i may ask one more question (the last one i promise :smile: )

Do you think this game has potential for poki’s audience? Or should i just call it a learning experience considering it’s 16mb unreducable download size, and it’s difficulty for an audience that likes casual games?

Again, Thank you so much for your time and help!

If you’re planning to switch from Gotdot to PlayCanvas, you’re basically already starting again anyway.

I think your core mechanics are familiar to the Poki audience. Players know how to play 2D platformers and many understand 2D shooting mechanics. If you iterate enough with Poki’s playtesting features, it could have potential. But to enjoy strong performance on Poki, it would have to be a sigificantly more streamlined and polished version of the game you have now.

1 Like

Yeah my next game will be in PlayCanvas so i’m prepared for starting over, i’m just seeing if i should stop here with this current one.

And you are absolutely right! Thank you so much for your honesty!

You are someone to look up to, both it terms of experience/success and being a great person overall!

I promise i’ll be writing a forum post here not too long ahead about a game i got on Poki, and you will be the reason, Thank you.

2 Likes

Thank you! Great to hear, I look forward to reading it!

1 Like