
Michael Marcin wrote:
When loading a texture in OpenGL the texture is bound to the current OpenGL context which is stored per thread. OpenGL textures must be destroyed and recreated when you change resolution because you must also destroy and recreate your OpenGL context. A thread can have multiple contexts but only 1 may be current at time. The collection of textures, which flyweight stores in its factory, is logically bound to the current render context on the current thread.
So you need a per-context factory. Boost.Flyweight factories are global by design, the way I see them. So it's not ideal for what you want. You can get around this by putting the context in the key, however.
A singleton isn't really a good fit for a flyweight factory of OpenGL textures.
As for the image loaders themselves for at least some of them I have to create multiple instances in order to use them concurrently.
You could have a global concurrent queue and you could take one from it to load a file then put it back once done.