Blog 3.0 I make games.
I developed Dissonance Voice Chat all year.
What Did I Do In 2016?
Dissonance Voice Chat
Obviously the bulk of my work in 2017 was on Dissonance voice chat. We released in late January of 2017 and it’s been all go since then - dealing with support requests by email, fixing bugs discovered in the wild, developing new features and pushing all this out in 19 versions.
This has been completely unlike any software development work I’ve done before - previously it’s all been closed source development on Epimetheus/Heist (with no customers influencing my decisions) or it’s open source work where I can happily just answer with “I’ll be happy to accept a PR” if I don’t want to work on whatever is being requested. It can be stressful but in general it’s been great fun!
I think the most interesting aspect is how this has influenced how I write code. New stuff that I write is a lot more robust and ready for release with extra things to help inevitable debugging e.g. live readouts in editor of as much as possible, logging everything but hiding that behind a toggle to not annoy users, verifying as much about the runtime environment as possible (not trusting the user to set it up properly).
Releasing on the asset store
Releasing on a store implies a whole load of other associated work. Making branding images, keeping on top of reviews (making sure to respond to any review that isn’t 5 stars) and collaborating with other developers to cross promote our products. The hardest thing, which I’m still not confident about, is making pricing decisions - in 2017 we raised the price twice as we released major new features or gained confidence about how stable/robust Dissonance is. We also participated in 2 store wide sales (at different discount levels) and were featured once in the 24 hours sale. Measuring the impact of all this and extrapolating it out to make future decisions about the price is very difficult!
Compatibility with Android/Linux/iOS
I’ve always hated C++, it’s such a huge and complex language seemingly packed with as many footguns as possible. With the arrival of Rust I thought there was a good chance I may avoid heaving to learn C++ altogether. Of course this was not to be - I could write all my new code in Rust but the world still runs on C++! I learnt a huge amount about C++ for Dissonance while working on changes to Opus (to make it easier to compile on iOS), reverse engineering how libspeexdsp works (attempting to get AEC to work) and extracting just the bits of webRTC that I need to make preprocessing/VAD/AEC to work.
I must admit C++ isn’t as bad as I thought, as long as you know what legacy parts of the language to avoid and you have decent tooling to back you up it’s actually not a bad way to write relatively cross platform code.
Collaborating With Other Developers
A big feature of Dissonance is that it is specifically designed to abstract over the network layer - allowing us to use the same code for multiple different networking systems. We’ve already got seven network integrations (Forge Remastered, Forge classic, Photon Unity Networking, Photon Bolt, UNet HLAPI, UNet LLAPI and Steamworks p2p) and we plan to write even more. We’ve had a great response from other asset developers collaborating with us to help integrate the two assets together and then cross promoting our assets.
I particularly want to shout out to Darrin at Crazy Minnow Studio. I asked him if he would be interested in bringing together Dissonance and SALSA lip sync, he responded enthusiastically and did a huge amount of work to make it happen - he essentially wrote the entire script, all the documentation and even made a great tutorial video on how to set it up.
The end result is super cool! Especially in VR - it adds a lot of immersion to see character faces animated as they talk.
I’m a massive fan of open source and try to release as much of my code as possible, I’m sad to say I’ve slowed down a lot in 2017. Usually I would keep the main project closed source and open source any helper libraries I wrote e.g. the SwizzleMyVectors library which I wrote to help me port Epimetheus over to not use XNA vector types. However, Dissonance is designed to be a single self-contained package so there are no parts we’ve released like that yet - we may break out some parts of it (e.g. logging) into a helper library as we develop more projects.
That’s not to say I’ve not released anything though!
This is a C# wrapper for the Z3 theorem prover. Rather than writing constraints like this:
var b = ctx.MkConst("B", ctx.RealSort); var c = ctx.MkConst("C", ctx.IntSort); s.Assert(ctx.MkEq(ctx.MkReal(1), ctx.MkDiv((ArithExpr)b, ctx.MkMul(ctx.MkReal(13, 10), (ArithExpr)c))));
You can write it as a C# expression:
var b = ctx.MkConstReal("B"); var c = ctx.MkConstInt("C"); s.Assert(ctx.MkExpr(b, c, (bb, cc) => 1 == b / (c * 1.3)));
This isn’t very well developed at the moment. It works fairly well for booleans and integers but has absolutely no support for reals (they don’t map perfectly into the C# type system).
This has been useful for…
This is a collaboration with my Dan to design a CoreXY printer from scratch. We’re both into 3d printing but neither of us is a mechanical engineer so this is a pretty interesting learning experience!
With Rule Breaker 1 we’re just aiming for something which can print - If it can produce a quality benchy I will be very happy! Hopefully once we have built that and learnt all the things we did wrong we will move on to design another printer with a similar design but much much larger.
Rock is an interpreter for the Nock (the lowest level part of Urbit) written in Rust. Implementing a Nock interpreter has become my goto project for learning a new language: it’s relatively simple to implement the most basic Nock operators, a little complex to implement the complex Nock operators and there’s essentially limitless optimisation opportunity.
At the start of the year I got myself a Prusa i3 MK2 and started a year long obsession with 3D printing! As mentioned above I’m working to design my own printer from scratch which has also got me interested in learning about embedded programming (I purchased an STM32F303K8 microcontroller to experiment with over the Christmas holiday).
I also have ambitions to build a hangprinter once the weather warms up a little and I can take over the entire garage to build a printer.
Back in July Oculus put on a sale for the headset and touch controllers for just £399! After I got a VR headset I managed to talk a lot of my friends into getting headsets to and it’s caused a pretty big change - we’re all big gamers and we’ve played a big range of fantastic games. But we’ve also spent a lot of time just hanging out in VR, building shared spaces or just chatting in a nice environment.
A lot of people may say VR is overhyped but I honestly haven’t met anyone yet who wasn’t amazed by VR when they tried it - I can’t help but think something with such draw even to non techie people is going to be big!
Some other interesting things I encountered in 2017
- Applied Science
- 2 Minute Papers
- Unite Amsterdam Conference
- Stormlight Archive
- 2017 Retrospective 13 Jan 2018
- Unity Ongui 04 Dec 2017
- Dissonance Voip Pipeline 19 Feb 2017
- 2016 Retrospective 01 Jan 2017
- Dual Contouring In 2d 27 Dec 2016
- Procedural Generation For Dummies: Building Footprints 07 May 2016
- Procedural Generation For Dummies: Half Edge Geometry 30 Mar 2016
- Fixed Permalinks 21 Mar 2016
- Procedural Generation For Dummies: Galaxy Generation 14 Jan 2016
- 2015 Retrospective 04 Jan 2016
- Procedural Generation For Dummies: Lot Subdivision 27 Dec 2015
- Procedural Generation For Dummies 11 Dec 2015
- Procedural Generation For Dummies: Road Generation 11 Dec 2015
- Deferred Transparency 09 Oct 2015
- Xna In 2015 24 Aug 2015
- Node Machine 26 Jun 2015
- Procedural Generation Of Facades And Other Miscellania 29 May 2015
- This Path Was Made For Walking 23 Apr 2015
- Cross Chunk Navmeshes 27 Mar 2015
- Changelog 27 06 Mar 2015
- Drawing Stuff On Other Stuff With Deferred Screenspace Decals 27 Feb 2015
- Random Gibberish 22 Feb 2015
- This Wall Is Sticky 17 Feb 2015
- Changelog 25 08 Feb 2015
- 2014 Retrospective 13 Jan 2015
- Super Sonic Sound 08 Jan 2015
- Sandboxing Is Dead Long Live Sandboxing 22 Dec 2014
- Changelog 22 B 14 Dec 2014
- Changelog 22 07 Dec 2014
- Possible Interruption To Service 06 Dec 2014
- The Game Programmer Awakens (changelog 21b) 30 Nov 2014
- The Return Of The Programmer (changelog 21) 16 Nov 2014
- The Return Of The Vending Machines 26 Oct 2014
- There Are Vending Machines Everywhere 16 Oct 2014
- Changelog 20 12 Oct 2014
- Ragdolls Are Hard 05 Oct 2014
- Changelog 19 28 Sep 2014
- The Return Of The Game Programmer 21 Sep 2014
- The Ball Is Picked Back Up 17 Aug 2014
- It's Good To Be Back 03 Aug 2014
- Serious Injury 21 Jul 2014
- We Marveled At Our Own Magnificence As We Gave Birth To Ai 14 Jul 2014
- Changelog 17 06 Jul 2014
- Changelog 16 29 Jun 2014
- Happy Birthday 22 Jun 2014
- Changelog 14 15 Jun 2014
- Losing My Way 08 Jun 2014
- Wildcard 02 Jun 2014
- Changelog 13 25 May 2014
- Changelog 12 16 May 2014
- WAI NO VIDEO (Again) 11 May 2014
- Changelog 10 04 May 2014
- Changelog 9 27 Apr 2014
- Changelog 8 20 Apr 2014
- Long Overdue Style Upgrade 18 Apr 2014
- WAI NO VIDEO 13 Apr 2014
- Changelog 7 07 Apr 2014
- Changelog 6 30 Mar 2014
- Changelog 5 23 Mar 2014
- Changelog 4 16 Mar 2014
- This Is Madness! 11 Mar 2014
- Changelog 3 09 Mar 2014
- Changelog 2 02 Mar 2014
- Changelog 1 23 Feb 2014
- Changelog 0 15 Feb 2014
- Payday The Heist 2 13 Jan 2014
- 730 Days Later 01 Jan 2014
- I Just Needed A Rest 12 Nov 2013
- Splinter Cell Blacklist 27 Aug 2013
- Gruelling Homework Assignment 26 Aug 2013
- Scripting Is Dead Long Live Scripting 14 Aug 2013
- The Reports Of My Death Are Greatly Exaggerated 05 Aug 2013
- 27 Gigawatts Of Cake 11 Jun 2013
- Trees Are Well Behaved 22 May 2013
- A Brief Project Update 14 May 2013
- Finite State Machines (are Boring) 16 Apr 2013
- Pathfinding 10 Apr 2013
- Artificial Stupidity Series 08 Apr 2013
- Valve Need To Stop Reading My Mind (and Other Miscellanea) 20 Mar 2013
- Elements Of Style 26 Feb 2013
- Moving To Axmingholmesbury 23 Feb 2013
- The Future Is Steamy 08 Feb 2013
- Mathematical Trickery 22 Jan 2013
- Thinking Aloud About Release 09 Jan 2013
- Game Developers Don't Make Timetables 03 Jan 2013
- What Is Heist? 20 Dec 2012
- How Does Procedural Generation Work? 14 Dec 2012
- Why Does Heist Keep Crashing? 07 Dec 2012
- What Isn't Procedural Generation? 23 Nov 2012
- What Is Procedural Generation? 18 Nov 2012
- Procedural Generation Series 15 Nov 2012
- Packet Encoding(3) 12 Nov 2012
- Packet Encoding(2) 08 Nov 2012
- Packet Encoding 07 Nov 2012
- Deployment Hax 28 Oct 2012
- Wibbly Wobbly Pipey Wipey 24 Oct 2012
- New Release(2) 24 Oct 2012
- New Release 20 Oct 2012
- Say What? 17 Oct 2012
- Get Up And Initiate That Session 15 Oct 2012
- Topological My Dear Watson 14 Oct 2012
- Omg Wtf Multiplayer 13 Oct 2012
- Full Steam Ahead 24 Sep 2012
- You Should Check Out Greenlight 01 Sep 2012
- It's Full Of Entities 20 Aug 2012
- Persistence 06 Aug 2012
- I'll Be Back 01 Aug 2012
- Artificial Stupidity 24 Jul 2012
- Overindulgence 16 Jul 2012
- Not My Cup Of Tea 09 Jul 2012
- Artsy Stuff 02 Jul 2012
- This Was A Triumph 25 Jun 2012
- Multiplayer Release 18 Jun 2012
- Fortnightly Fun 10 Jun 2012
- New Blog 31 May 2012