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

其他游戏

开发平台:

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 HKBASE_HKMONITOR_STREAM_STATISTICS_COLLECTOR_H
  9. #define HKBASE_HKMONITOR_STREAM_STATISTICS_COLLECTOR_H
  10. #include <Common/Base/DebugUtil/StatisticsCollector/hkStatisticsCollector.h>
  11. #include <Common/Base/Monitor/MonitorStreamAnalyzer/hkMonitorStreamAnalyzer.h>
  12. #include <Common/Base/Container/PointerMap/hkPointerMap.h>
  13. #define HK_MEM_STREAM_COMMAND_PUSH  'P' // new dir or new node
  14. #define HK_MEM_STREAM_COMMAND_POP   'p' // out of node/dir.
  15. #define HK_MEM_STREAM_COMMAND_CHUNK 'C' // new chunk alloc
  16. /// An implementation of a statistics collector.
  17. /// Similar to hkSimpleStatisticsCollector except that it does not create
  18. /// Nodes as it progresses through the stats collection, rather it writes
  19. /// to a command stream. That stream can then be interpreted later,
  20. /// possibly on a different platform (for use with the Visual Debugger for instance),
  21. /// and then created into Nodes. See the hkStatisticsCollector for more information
  22. class hkStreamStatisticsCollector: public hkStatisticsCollector
  23. {
  24. public:
  25. /// Create a hkStreamStatisticsCollector with the stream
  26. /// preallocated to the given size in bytes. If the stream
  27. /// uses more than this size it will reallocate itself automatically.
  28. hkStreamStatisticsCollector(hkVtableClassRegistry* vtblReg, int memSize);
  29. /// Delete the collector
  30. virtual ~hkStreamStatisticsCollector();
  31. /// The collector uses the same Nodes
  32. /// as the hkMonitorStreamAnalyzer so that the trees
  33. /// produced can be inspected by the same code that
  34. /// you use to inspect the hkMonitorStream.
  35. typedef hkMonitorStreamAnalyzer::Node Node;
  36. /// Begin a new section in the stream
  37. /// You can thus have different types of
  38. /// snapshot all in the same stream .
  39. /// For instance you may want the ENGINE
  40. /// only snapshot but also after that
  41. /// one that takes in all categories.
  42. void beginSnapshot( int statisticClasses );
  43. /// End the current snapshot.
  44. void endSnapshot( );
  45. /// Reset the whole stream (wipes all snapshots)
  46. void reset();
  47. /// Set the data stream from a different source, usually
  48. /// a different computer or console.
  49. void setDataByCopying(const char* buffer, int length, hkBool endianSwap = false);
  50. /// Make a Node tree from the current stream. If you provide an array to hold the strings
  51. /// for the Node names then the Nodes can persist after you have deleted this collector,
  52. /// but be default the Node names will just point into the original stream data (that
  53. /// has a copy of the names in it). Each node has two values corresponding to the
  54. /// Used and Allocated memory for the object(s) you collected.
  55. /// You own the returned Nodes, so delete them after you have inspected thier contents.
  56. /// The string table is optional. You will need to delete the hkStrings when you are done woth them if you requested them.
  57. void makeTree(hkArray<Node*>& m_nodesOut, hkArray<hkString*>* stringTable = HK_NULL);
  58. /// Write the stats to a text stream. It internally calls makeTree first and
  59. /// and deletes the nodes once produced when done. It is just a simple ascii
  60. /// version of the tree.
  61. void writeStatistics( hkOstream& outstream, int reportLevel );
  62.         // hkStatisticsCollector interface
  63.         virtual void addReferencedObject(const char* fieldName, const hkReferencedObject* obj, int flags = 0) ;
  64.         // hkStatisticsCollector interface
  65.         virtual void addObject( const hkClass& cls, const char* fieldName, const void* obj, int flags = 0);
  66.         // hkStatisticsCollector interface
  67.         virtual void addChunk(MemoryType type, const char* name, const void* chunkAddress, int usedSize, int allocatedSize = 0) ;
  68.         // hkStatisticsCollector interface
  69.         virtual void pushDir( const char* dirName );
  70.         // hkStatisticsCollector interface
  71.         virtual void popDir();
  72. /// Get the current data stream. Commonly used to then send this block of data to another process
  73. /// or computer
  74. inline const char* getDataStream() { return m_stream.getSize() > 0? m_stream.begin() : HK_NULL; }
  75. ///Get the size of the current data stream.
  76. inline int getDataStreamSize() { return m_stream.getSize(); }
  77. public:
  78. struct Command
  79. {
  80. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_BASE_CLASS, hkStreamStatisticsCollector::Command );
  81. char cmd; /// one of the three above
  82. hkUint8 slen; // chars following for name string. can be 0.
  83. hkUint16 memSize; // 0 for just a dir
  84. hkUint16 allocSize; // 0 for just a dir
  85. };
  86. hkArray<char> m_stream; // stream of commands (and names)
  87. inline hkBool hasSpace() { return m_stream.getCapacity() > (m_stream.getSize() + (int)sizeof(Command) + 64); }
  88. protected:
  89.         hkBool _isKnown(const void* obj) const { return m_knownObjects.getWithDefault(obj, 0) != 0; }
  90.         void _addKnown(const void* obj) { m_knownObjects.insert(obj, 1); }
  91.         void _startObject( const char* name, int size);
  92.         void _endObject( );
  93. hkPointerMap<const void*, int> m_knownObjects;
  94. //int m_enabledStatisticClasses;
  95. };
  96. #endif // HKBASE_HKMONITOR_STREAM_STATISTICS_COLLECTOR_H
  97. /*
  98. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  99. * Confidential Information of Havok.  (C) Copyright 1999-2009
  100. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  101. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  102. * rights, and intellectual property rights in the Havok software remain in
  103. * Havok and/or its suppliers.
  104. * Use of this software for evaluation purposes is subject to and indicates
  105. * acceptance of the End User licence Agreement for this product. A copy of
  106. * the license is included with this software and is also available at www.havok.com/tryhavok.
  107. */