You don’t need an alternative to scene graphs for rendering, you need to understand what a scene graph is and does.
It is a hierarchical structure of objects that allows parent objects’ transforms to be passed down to their children. It is nothing more and nothing less. Transforms may be related to graphics and physics, but a scene graph is not directly related to either.
It should be implemented within your CActor or CEntity class and be entirely hidden from the scene manager.
The scene manager is free to keep multiple representations of the objects it is managing. The main one will be a simple array of objects. You may also choose to maintain an octree.
When the scene manager is time to be logically updated it runs over the array of objects and tells each one to “un-dirty” itself. This simply means that the object should update its matrices if its position/scale/rotation has changed since the last time it was told to un-dirty itself. At this time it can also trickle down its matrices to its children so that they can update their own matrices appropriately. This is the only thing a scene graph does.
When an object finalizes its transform it can also update itself within an octree if you are using one.
Then it comes time to render the scene graph. Once again you have options. If you wanted to keep things simple for the sake of learning, you could just run over the array of objects and draw them (though you should still perform view culling, at least after your first implementation is working).
Or if you used an octree you could traverse that for more optimal rendering.
In either case, notice how the scene graph was not related to rendering at all, nor does the scene manager even know what it is. It handled internally by the entities themselves. It is never correct to use a scene graph for rendering.
Do not look at existing scene-graph libraries such as OpenSceneGraph for inspiration as to what a scene graph is and does. OpenSceneGraph specifically is the single worst example of the functionality of a scene graph there is. It is one of the largest violations of the single responsibility principle out there. A scene graph has no relationship to graphics or physics. It serves only one purpose: Update objects so that their parents’ transforms affect their own. Once that is done the scene graph leaves the picture. Should those transforms later be used by graphics or not is of no concern to the scene graph.
It is amazing how often people try to be unique, and yet they are always trying to make others be like them. - L. Spiro 2011
I spent most of my life learning the courage it takes to go out and get what I want. Now that I have it, I am not sure exactly what it is that I want. - L. Spiro 2013
I went to my local Subway once to find some guy yelling at the staff. When someone finally came to take my order and asked, “May I help you?”, I replied, “Yeah, I’ll have one asshole to go.”
L. Spiro Engine: http://lspiroengine.com
L. Spiro Engine Forums: http://lspiroengine.com/forums