1. When I truned the camera so that all the objects were outside of frustrum they were still rendered since the frustrum test sucks currently.
2. After turning over 90 degrees the nodes stopped rendering and the framerate went to whopping 30 FPS
So I wondered where the rest of the time goes and lookielookie, irrlicht just goes trough every node systematically. It's no wonder that I don't get better FPS when you test culling 5000 times per frame (~31ms). So here's what I think should be done to gain enough speed to be considered a fast engine.
Better frustrum culling: first do a sphere - sphere check against the frustrum, then sphere - cone against the frustrum, then test if sphere is inside frustrum and only after that test for box - plain (if the box is close enough to intersect with frustrum).
Occlusion culling: run HW occlusion queries simultaneously to rendering (Coherent Hierarchical Culling) to avoid rendering occluded objects.
Rendering: store nodes in kdtrees to allow for quick culling of invisible child objects. Create an separate tree for dynamic objects.
After these updates the engine should run alot faster even with alot of stuff. The frustrum culling is easy to do and should be done properly, the method I proposed would require adding collision sphere to every node. Occlusion queries are pretty easy too but isn't very useful to the current system. Stop & Wait occlusion query method might even make it slower. For rendering you need to create an kDTree system that can traverse the nodes from front to back.
Also it would be suggested to add timer to the nodes that checks wheter or not the check for occlusion, since objects in the screen usually stay there for more than 1 frame there's no point in testing every frame. Some heuristics could be used to alter this value depending on the situation (camera movement/rotation speed, objects speed, objects position etc). Also the ammount of pixels the object should take before it'll be rendered can be altered. You don't want to render and object if only 1 pixel is visible, some heuristics could be used again to determine the ammount of pixels needed.
Once I get my master plan for the engine rewamp ready I'll post it here
What I'm intrested in is what others have done to increase the output of the engine in a large scale? Suggestions about possible optimizations/changes are welcome too