hkaDefaultChunkCache.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:10k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HK_DEFAULT_CHUNK_CACHE
  9. #define HK_DEFAULT_CHUNK_CACHE
  10. #include <Common/Base/hkBase.h>
  11. #include <Animation/Animation/Playback/Cache/hkaChunkCache.h>
  12. // allows cache usage statistics be generated
  13. #if defined( HK_DEBUG )
  14. #define HK_CACHE_STATS
  15. #endif
  16. /// Structure defining the layout of a pool.
  17. struct hkaChunkPoolCinfo
  18. {
  19. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_CACHE, hkaChunkPoolCinfo );
  20. /// The number of buckets that a hashed key may end up being placed into ( prime numbers are preferred )
  21. hkUint32 m_buckets;
  22. /// The number of slots per bucket ( more slots => greater chance of finding data there but increased seek time )
  23. hkUint32 m_slots;
  24. /// The size ( in bytes ) of the data chunks pointed to by a bucket slot ( e.g. 64 byte chunks ). This MUST be a multiple of 16 for alignment purposes.
  25. hkUint32 m_chunkSize;
  26. };
  27. /// Construction info used to initialise the cache. 
  28. struct hkaDefaultChunkCacheCinfo
  29. {
  30. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_CACHE, hkaDefaultChunkCacheCinfo );
  31. /// The Number of cache pools to be managed.
  32. hkUint32 m_numberOfCachePools;
  33. /// The construction info for each cache pool ( pool chunk size MUST be in ascending order! ).
  34. hkArray<hkaChunkPoolCinfo> m_cachePools;
  35. };
  36. ///
  37. /// The default cache handles several pools, each of which represents data of differing chunk sizes.
  38. /// Each pool is allocated as an n-way cache (where n is the number of buckets)
  39. /// This implementation used a LRU scheme within the pool to discard and reallocate slots.
  40. /// It also provide support for slot locking.
  41. /// N.B. This cache is *not* thread-safe. A simple modification of this cache which is thread-safe is provided
  42. /// in the class hkaMultithreadedChunkCache.
  43. class hkaDefaultChunkCache : public hkaChunkCache
  44. {
  45. public:
  46. /// Constructor.
  47. hkaDefaultChunkCache( struct hkaDefaultChunkCacheCinfo& cinfo );
  48. /// Destructor.
  49. ~hkaDefaultChunkCache();
  50. /// Retrieves a read only pointer to a preallocated/cached chunk
  51. /// Returns HK_NULL if the key is not found in the cache
  52. virtual const hkUint8* retrieveChunk( hkUint32 key, hkUint32 chunkSize );
  53. /// Allocates a chunk from the cache and binds it to the given key
  54. /// Returns HK_NULL if it can't allocate.
  55. /// For this implementation this will happen if there is no pool big enough
  56. /// for the chunk or if the all the slots in the pool are locked.
  57. /// If it is not NULL 
  58. virtual hkUint8* allocateChunk( hkUint32 key, hkUint32 chunkSize );
  59. /// Marks the chunk associated with the given key as available for reuse / reallocation
  60. virtual hkBool flushKey( hkUint32 key, hkUint32 chunkSize );
  61. /// Writes cache statistics to an output stream
  62. virtual hkBool printCacheStats( hkOstream* oStream ) const;
  63. /*
  64.  * Locking support
  65.  */
  66. /// (Deprecated) Locks a specific key ( will never be removed from the cache pool until it is unlocked )
  67. hkBool lockKeyNonMT( hkUint32 key, hkUint32 chunkSize );
  68. /// (Deprecated) Unlocks a specific key
  69. hkBool unlockKeyNonMT( hkUint32 key, hkUint32 chunkSize );
  70. /// Locks a specific key ( will never be removed from the cache pool until it is unlocked )
  71. virtual hkBool lockKeyForRead( hkUint32 key, hkUint32 chunkSize ) { return false; }
  72. /// Unlocks a specific key
  73. virtual hkBool unlockKeyForRead( hkUint32 key, hkUint32 chunkSize ) { return false; }
  74. /// Locks a specific key for writing (calls to retrieve are not allowed)
  75. virtual hkBool lockKeyForWrite( hkUint32 key, hkUint32 chunkSize ) { return false; }
  76. /// Unlocks a specific key for writing 
  77. virtual hkBool unlockKeyForWrite( hkUint32 key, hkUint32 chunkSize ) { return false; }
  78. /// Query if key locked for write (use before calling retrieveChunk) 
  79. virtual hkBool isKeyLockedForWrite( hkUint32 key, hkUint32 chunkSize ) { return false; }
  80. /// Critical section enter (no implemention for this class - use hkaMultithreadedDefaultChunkCache)
  81. virtual void enterCriticalSection( ) {}
  82. /// Critical section leave (no implemention for this class - use hkaMultithreadedDefaultChunkCache)
  83. virtual void leaveCriticalSection( ) {}
  84. /// Flush the specified cache pool ( flushes ALL entries in the pool )
  85. hkBool flushCachePool( hkUint32 cachePool );
  86. // Results enum - UNUSED
  87. enum QueryResult
  88. {
  89. HK_ALL_SLOTS_LOCKED,
  90. HK_NO_POOL_AVAILABLE,
  91. HK_SLOT_AVAILABLE,
  92. };
  93. protected:
  94. struct slotUnit
  95. {
  96. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_CACHE, hkaDefaultChunkCache::slotUnit );
  97. // key
  98. hkUint32 m_key;
  99. // L.R.U. value and lock status ( < 0 )
  100. hkInt32 m_lru;
  101. slotUnit()
  102. {
  103. // initialise all
  104. m_key = HK_NULL;
  105. }
  106. };
  107. // small structure to fill in with hashed key info
  108. struct hashKeyInfo
  109. {
  110. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_CACHE, hkaDefaultChunkCache::hashKeyInfo );
  111. // input
  112. // key to be hashed
  113. hkUint32 m_key;
  114. // chunk size we're dealing with
  115. hkUint32 m_chunkSize;
  116. // output
  117. // hashed key == bucket
  118. hkUint32 m_bucket;
  119. // the cache pool we're dealing with
  120. hkInt32 m_cachePool;
  121. hashKeyInfo()
  122. {
  123. // invalid cache pool
  124. m_cachePool = -1;
  125. }
  126. };
  127. // calculates the bucket into which the specified key will be hashed to and the correct cache pool
  128. inline hkBool hashKey( struct hashKeyInfo& info );
  129. // number of cache pools to be managed
  130. hkUint32 m_numberOfCachePools;
  131. // heap memory allocation for the cache pools data
  132. hkArray<hkUint8*> m_cacheData;
  133. // heap memory allocation for the cache pool tables
  134. hkArray<struct slotUnit*> m_cachePoolTables;
  135. // construction info for each cache pool ( buckets, slots and chunk size )
  136. hkArray<struct hkaChunkPoolCinfo> m_cachePools;
  137. //
  138. // the following arrays are only used when HK_CACHE_STATS is defined
  139. //
  140. #if defined( HK_CACHE_STATS )
  141. // a small convience structure to help with analysis
  142. struct slotStatisticsInfo
  143. {
  144. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_CACHE, hkaDefaultChunkCache::slotStatisticsInfo );
  145. // number of times this slot has been successfully read
  146. hkUint32 m_hits;
  147. // number of time this slot has been trashed
  148. hkUint32 m_misses;
  149. slotStatisticsInfo()
  150. {
  151. m_hits = 0;
  152. m_misses = 0;
  153. }
  154. };
  155. // heap memory allocation for the cache pool statistics tables ( mirrors actual slotUnit tables )
  156. hkArray<struct slotStatisticsInfo*> m_cachePoolStatsTables;
  157. // another small convience structure to help with analysis
  158. struct unavailableChunk
  159. {
  160. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_CACHE, hkaDefaultChunkCache::unavailableChunk );
  161. // requested chunk size
  162. hkUint32 m_chunkSize;
  163. // frequency this chunk has been requested
  164. hkUint32 m_frequency;
  165. unavailableChunk()
  166. {
  167. m_chunkSize = 0;
  168. m_frequency = 0;
  169. }
  170. };
  171. // a simple array to keep track of requests for unavailable chunk sizes ( pools )
  172. hkArray<struct unavailableChunk> m_unavailableChunks;
  173. #endif
  174. private:
  175. // internal method used by (un)lock / retrieve / flushKey to manipulate locked status
  176. hkBool manipulateKey( hkUint32 key, hkUint32 chunkSize, hkUint8 operation, hkUint8** chunkPointer );
  177. };
  178. #include <Animation/Animation/Playback/Cache/Default/hkaDefaultChunkCache.inl>
  179. /*
  180. Cache pool layout : ( example uses a pool with 5 buckets each containing 3 slots )
  181. ................ cache pool ................
  182. .  bucket 1 : | slot 1 | slot 2 | slot 3 | .
  183. .  bucket 2 : | slot 1 | slot 2 | slot 3 | .
  184. .  bucket 3 : | slot 1 | slot 2 | slot 3 | .
  185. .  bucket 4 : | slot 1 | slot 2 | slot 3 | .
  186. .  bucket 5 : | slot 1 | slot 2 | slot 3 | .
  187. ............................................
  188. Each slot is a slotUnit structure which contains the key itself, information on the L.R.U. value of 
  189. use of this key and locking information. A one-to-one mapping between this table and the cache data
  190. exists and so a pointer to a memory location which is 'chunk' bytes in size where data is cached may be
  191. calculated.
  192. Each key that the cache receives is passed into a hashing function which determines which bucket in
  193. the cache pool the key maps to. The cache may then search that bucket for the key and can retrieve
  194. a pointer to the cached data.
  195. Hashing function : ( very simple for now )
  196.     h(k) = k mod m   ( m = bucket size )
  197. */
  198. #endif // HK_DEFAULT_CHUNK_CACHE
  199. /*
  200. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  201. * Confidential Information of Havok.  (C) Copyright 1999-2009
  202. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  203. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  204. * rights, and intellectual property rights in the Havok software remain in
  205. * Havok and/or its suppliers.
  206. * Use of this software for evaluation purposes is subject to and indicates
  207. * acceptance of the End User licence Agreement for this product. A copy of
  208. * the license is included with this software and is also available at www.havok.com/tryhavok.
  209. */