http://www.gamasutra.com/blogs/KevinGei ... 4_Tech.php
Custom drivers were written for Wii U, PlayStation 4, PlayStation Vita. The DX11 branch works with Xbox One (with relatively minor changes), and OpenGL ES branch of course works with iOS/Android. PS4 / Vita builds use a lot of the Linux code paths available in Irrlicht. Wii U did as well, but many things were incompatible, such as image loaders, where they worked without change on PS4. The endianness and other peculiarities of Wii U caused a lot of odd bugs.
Some highlights/other notes:
- Reducing draw calls was crucial to performance (hardware skinning, instancing).
- Calculating transformation every frame for every object was slow. We solved this by calculating relative transformation separately, only if setposition/rotation/scale actually changed to a new value. We also set a flag to recalculate absolute transformation only if parents relative transformation changed. That flag propagates to all its children.
- Setting shader uniforms by name was expensive. Rather than storing locations on the game side, we simply stored them in a map in Irrlicht based on the const char address of the string (Lazy solution, but worked).
- Split scene tree onAnimate() from drawAll to its own animateAll function, for optimization.
- Character animation is pretty slow and still is. We tried to make some changes to it to reduce redundant matrix calculations. Another change is that we do not remove any duplicate frames. We would have performance hitches when the 'hint' frame failed, causing it to have to traverse the entire list. With no frames removed, the frame index and frame time are the same.
- Added lots of SIMD functions for console versions to faster calculate matrix calculations, sins/cos/tans, etc. Accomplished with unions and casting.
- Not specifically Irrlicht-related, but pooling objects and avoiding constant memory allocation/deallocation was important. This included making constantly-used arrays static, and using set_used(0) instead of clear, to not reallocate space unless needed.
- A good amount of issues early on included floating point error bugs in Irrlicht math and it turning into invalid transforms in PhysX. (Those were reported/fixed).
- We store a pointer back to the ISceneNode object in SMaterial, since we always need them in shader callbacks.
- Our editor uses managed C++/C# and uses Irrlicht to render to a form object in WinForms.
- .X file is our primary animation file format. We use a python script to export from Maya. It's not an ideal pipeline. Loading .X files, even in its binary format, is slow to parse. For Wii U / Vita, we save out all the animated mesh files to a strictly binary format of all the Irrlicht class data.
- Linux had a lot of issues, we ended up bringing over SDL2, which solved many of them.