Jump to content

  • Log In with Google      Sign In   
  • Create Account

We need your feedback on a survey! Each completed response supports our community and gives you a chance to win a $25 Amazon gift card!


Resource handling - multiple "pools"?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
No replies to this topic

#1 Juliean   GDNet+   -  Reputation: 2755

Like
0Likes
Like

Posted 23 May 2013 - 04:26 AM

Hello,

 

I've been wondering whats the best way of handling different "pools" of resources in a 3d game? Let me explain a bitt more what my problem is. I already have a generic "resource cache"-class:

 

        template<typename Key, typename Resource>
        class Resources
        {
        public:

            typedef std::map<Key, Resource*> ResourceMap;

            ~Resources(void)
            {
                for(ResourceMap::iterator ii = m_mResources.begin(); ii != m_mResources.end(); ++ii)
                {
                    delete ii->second;
                }
            }

            void Add(const Key& stName, Resource& resource)
            {
                m_mResources[stName] = &resource;
            }

            Resource* Get(const Key& key) const
            {
                if(Has(key))
                    return m_mResources.at(key);
                else 
                    return nullptr;
            }

            bool Has(const Key& key) const
            {
                return m_mResources.count(key) == 1;
            }

            size_t Size(void) const
            {
                return m_mResources.size();
            }

            const ResourceMap& Map(void) const
            {
                return m_mResources;
            }

            const Key* Key(const Resource* pResource) const
            {
                for(ResourceMap::const_iterator ii = m_mResources.cbegin(); ii != m_mResources.cend(); ++ii)
                {
                    if(ii->second == pResource)
                        return &ii->first;
                }

                return nullptr;
            }

			void Clear(void)
			{
				for(ResourceMap::const_iterator ii = m_mResources.cbegin(); ii != m_mResources.cend(); ++ii)
				{
					delete ii->second;
				}

				m_mResources.clear();
			}

        private:

            ResourceMap m_mResources;
        };

 

This is used for my textures, material, etc... . Right now I've had one of each of those, passing around where needed. Now I've ran into an issue. I've developed a small level editor for my current 3d tower defense game. This means, there are two "virtual" pool of resources: The ones loaded at the begin of the game (gbuffer, level editor textures), and the ones loaded per level (each level has its own resources). On loading of a level, I'd want to throw away the resources of the last level. How would I do that? I've got multiple ideas, which I'd like to know what you'd prefer, or how you've been doing this so far:

 

- Really have two different Resource<XXX> for the whole game and the editor/level. On instances where I need to access both, I'd have to check both of them. On level loading, I'd simply clear the levels resource pool.

 

- Give each resource a identifier, which pool it belongs to. Coded into the resource class, so I can Clear(pools).

 

- Same as above, only that identifier is stored in the actual resource (textures, meshes, effects), and does not exist for the Resource-class itself.

 

- Store a list of resources keys that belong to the game. Check on those on level loading, and prevent them from being thrown away.

 

- Simply discard everything on level load and reload game and level resources.

 

- Something completely different?

 

So, which one of those methods would you prefer, or what have you done in the past? Any suggestion would be great! Note that I don't care much/have time for implementing a smart-ptr or similar system for now, got to hand in the game in 6 days to come as part of an assignment, just want to get the "basic" things right here.



Sponsor:



Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS