适合OGRE程序的调试技巧:logManager

OGRE的程序由于大量使用STL,加上我们也喜欢STL.

所以在debug模式下,如果程序稍微大一点,要想调试几乎不可能,那速度不是人可以忍受的

所以好用的断点啊,快速监视啊,assert啊,基本不能用.

为了速度,只有在release模式下用log打印日志的方式自己输出重要信息.

而要大量使用logManager,就必须要用流的方式来打印数据,

可以把字符串和变量连接起来,省去转换变量为字符串的麻烦

至于怎么用流的方式,分2种情况

如果是早期的1.4X版本,可以用StringUtil::StrStreamType:

 

view plain copy to clipboard print ?
  1. // Log informational  
  2. StringUtil::StrStreamType str;  
  3. str << "Material " << mName << " Technique " << techNo;  
  4. if (!(*i)->getName().empty())  
  5.     str << "(" << (*i)->getName() << ")";  
  6. str << " is not supported. " << compileMessages;  
  7. LogManager::getSingleton().logMessage(str.str(), LML_TRIVIAL);  

 

如果是1.6X的版本,有更好方法,可以用stream:

 

view plain copy to clipboard print ?
  1. LogManager::getSingleton().stream()  
  2.     << "Generating " << lodDistances.size()  
  3.     << " lower LODs for mesh " << mName;  

 

log日志有级别,log信息也有级别,如果2个级别相加 >= 4

那么这个信息就会被打印到log文件.默认情况下log日志级别和log信息级别都是2

所以会打印出来,当然也可以手动设置.

 

view plain copy to clipboard print ?
  1. // LogMessageLevel + LoggingLevel > OGRE_LOG_THRESHOLD = message logged  
  2. #define OGRE_LOG_THRESHOLD 4  
  3.   
  4. /** The level of detail to which the log will go into. 
  5. */  
  6. enum LoggingLevel  
  7. {  
  8.     LL_LOW = 1,  
  9.     LL_NORMAL = 2,  
  10.     LL_BOREME = 3  
  11. };  
  12.   
  13. /** The importance of a logged message. 
  14. */  
  15. enum LogMessageLevel  
  16. {  
  17.     LML_TRIVIAL = 1,  
  18.     LML_NORMAL = 2,  
  19.     LML_CRITICAL = 3  
  20. };  

 

设置级别的好处就是可以根据需要观看log信息

比如调试的时候设置log级别最低,可以看到所有信息,

发布的时候设置最高,少打印很多不需要的信息,提高效率:

 

view plain copy to clipboard print ?
  1. void App::createRoot()  
  2. {  
  3.     mRoot = new Root();  
  4.     //LogManager::getSingleton().getDefaultLog()->setLogDetail(LL_LOW); // log级别设置为最低  
  5.     LogManager::getSingleton().getDefaultLog()->setLogDetail(LL_BOREME); // log级别设置为最高  
  6. }  

 

你可能感兴趣的:(Stream)