《XNA高级编程:Xbox 360和Windows》3-3

3.3记录错误信息


     调试代码非常复杂,特别是渲染循环出错了,但您却得不到任何异常。只设置几个调试断点并不够,尤其是当游戏运行一段时间之后出现了错误,调试并不是合适的选择。您或许想知道每一帧都发生了什么,但又不想一步步地跟踪它。对于这类问题,您可以给控制台输出一些信息,不过这只能在 Visual Studio 中使用,而且当下次启动项目时这些信息就没了。

     在我做过的比较大型的项目中,有一个类非常重要,那就是 Log 类,它用来往一个文本文件中记录消息、警告、错误或者调试信息。这个类本身很简短,也很简单,但如果正确地使用它,会给您的调试和测试带来很大的乐趣。另外还有其他很多更加高级的日志记录类和框架( logging classes and frameworks )可以用,比如 Log4Net ,可以在这里得到: http://logging.apache.org/log4net 。日志并非仅仅记录几行信息那么简单,您可以使用一个 WebService 来远程获取用户使用您的应用程序时的日志信息,可以激活 Windows 错误事件,还可以做很多其他事情。本书并没有过多地讨论,因为这是一个很复杂的话题。对于本书中的简单游戏,使用 Log 类就足够了。

     先看一看 Log 类的实现(在 Breakout 游戏中有一个更复杂的版本):

public   class  Log
{
    
#region  Variables
    
private   static  StreamWriter writer  =   null ;
    
private   const   string  LogFilename  =   " Log.txt " ;
    
#endregion

它使用一个
Log.txt 文件来存储所有消息,并使用一个静态的 StreamWriter 对象,以便可以方便地在静态方法中访问。当这个类第一次被调用的时候,就会通过其静态构造器被初始化:

#region  Static constructor to create log file
static  Log()
{
    
//  Open file
    FileStream file  =   new  FileStream(
              LogFilename, FileMode.OpenOrCreate,
              FileAccess.Write, FileShare.ReadWrite);
    writer 
=   new  StreamWriter(file);
    
//  Go to end of file
    writer.BaseStream.Seek( 0 , SeekOrigin.End);
    
//  Enable auto flush (always be up to date when reading!)
    writer.AutoFlush  =   true ;
    
//  Add some info about this session
    writer.WriteLine( " /// Session started at:  "   +
              StringHelper.WriteIsoDateAndTime(DateTime.Now));
//  Log()
#endregion

枚举值 FileShare.ReadWrite 可以确保在游戏运行的时候从外部读写文件。除了这个还要把 writer 的位置设置到文件的末尾,启用属性 AutoFlush 可以确保新数据会被立即写入日志文件中,最后再添加某次操作开始的时间信息。要记录会话发生的时间还需要使用辅助类 StringHelper 的一个方法,稍后将介绍。

     最后,是这个类的最重要、也是您将一直调用的唯一的一个方法:

#region  Write log entry
static   public   void  Write( string  message)
{
    DateTime ct 
=  DateTime.Now;
    
string  s  =   " [ "   +  ct.Hour.ToString( " 00 " +   " : "   +
              ct.Minute.ToString(
" 00 " +   " : "   +
              ct.Second.ToString(
" 00 " +   " "   +
              message;
    writer.WriteLine(s);
#if  DEBUG
  
//  In debug mode write that message to the console as well!
  System.Console.WriteLine(s);
#endif
//  Write(message)
#endregion

     首先,在消息的前面加上一个时间戳,然后把消息写入 Log.txt 文件中,最后如果在调试项目,把消息输出到控制台。现在,您可以为 Breakout 游戏添加日志功能,每当您升级的时候在 Log.txt 文件的最后添加一行升级消息,如下所示:

Log.Write( " Level  "   +  level  +   "  completed. " );

你可能感兴趣的:(windows)