Porting to Unity
Over the holidays, I've been thinking about the party system and its complications, and tried to move on with more code. I caught myself, before doing any fun stuff, I still have to write some boilerplate code for class reflection ( print out some structs, read from json, serialize for save files etc). This is very cumbersome and it's not automated, unless I'm only writing class definitions using code generators. I've actually written 3 code generators so far: for message definitions, action commands and components. So, the lack of reflection in c++ ends up hurting quite a bit, and I like data-driven development that is painful without reflection.
So, given that recently for work I started again with Unity (had some brief encounters before), I thought maybe Unity might solve the unfun issues, and of course I'm not fooling myself it will add other issues. So, I made a list of my woes with the current development "environment":
- Lack of reflection: reason for implementing (over years now) resource loading, serialization, streaming operators etc etc for every single class that I use. Using:
- JsonCPP for loading configuration from json
- Cereal for save/load functionality
- Streaming operators for string formatting
- Profiling: Visual studio profiler takes a while, I'd have to implement engine hooks myself for something faster & more bespoke. Graphics debugging is not great; apitrace is a nice tool, but still.
- OpenGL is tricky to wrap. Very tricky. I foolishly didn't use a wrapper, so minus points for foresight.
- Cross-platform and web is tricky. And emscripten, as magic as it is, is not exactly trivial to integrate.
- Compile speed (in my case) is not great. C++ supposed to be fast to compile, but I think with all the boilerplates and the suboptimal modularization of the code, it has become slow.
Unity is not supposed to be a panacea, but I think it's going to offer a fresh perspective on how to build a game, same idea but different language, different approach for coding and data management, etc.
C++ with Unity, and a bit of woe
Since I quite like C++, I thought I'll try to use it within Unity, in the form of native plugins. I ran a few experiments successfully, so, the question becomes, where to draw the line?
- Nothing in C++: port everything to C#
- A few things in C++: esp. algorithms with simple inputs/outputs that run complex/expensive calculations.
- Most things in C++: This is an approach encountered here.
"Most things in C++" became a no-go quickly when I downloaded the latest github repo, ran the code and crashed. Since this is an experimental project and I don't know much about C#, I think this would be more harm than good.
"Few things in C++" is the current optimistic scenario. If I encounter some code that fits the criteria, I'll write the interop to C++. To test it, I ported part of the biome map generation code to utilize native plugins: C# runs some GPU passes, then somewhere in the middle we pass some pointers and config info to C++ that runs a CPU pass, returns the results and C# happily continues.
"Nothing in C++" is a probability. I've spent so-much-time dealing with Resource systems, serialization, GUI bindings for all types etc, and all these are for free with Unity's inspector, C#'s reflection and Unity's asset system. So, I need something refreshing at this point, and that's game-related algorithms and content, rather than engine architecture.
The negative bit: I love bitfields and neither C# nor Unity makes my life easy with them. So all my careful bit-packing goes to hell. C# doesn't support bitfields and Unity generates junk shader code for WebGL when use bitwise operators. This is a major pain, as many of my shaders use bitwise operators, and I can't afford to go without. So, problem pending.
Closing with a port of the biome generator, using a native plugin for a few passes, I must confess that besides the learning curve and some of Unity's idiosyncrasies, it's been generally a breeze.