§3.2记录错误信息

Debug游戏代码可能是非常复杂的,特别是如果您没有得到任何异常,但某些渲染循环却出错。只设置几个断点并不够,尤其是如果游戏在运行一段时间之后遇到错误,Debug并不是正确的选择。您想知道每一帧都运行了什么,但又不想逐步贯穿500帧去发现它。对于这类问题,您可以仅仅抛出一些文本到控制台,不过这只能在Visual Studio中使用,而且当你下次启动项目时将会丢失所有的控制台内容。

在我做过的所有比较大型的项目中,一个最重要的类就是Log类,它只是给一个简单的文本文件写入消息、警告、错误或者Debug文本。这个类本身很简短,也很简单,但如果你以正确的方式使用它,将会给您的debug调试和测试会话更令人愉快。另外,还有更加高级的日志记录类和框架(logging classes and frameworks)可利用,诸如Log4Net,你可以在http://logging.apache.org/log4net 找到。日志不仅仅只是给文本文件写入几行。来自于应用程序的日志数据常常用来远程获取用户错误,借助一个WebService,你可以激活Windows错误事件,还可以做很多其他事情。这些不是本书能涵盖的,因为这是一个非常复杂的话题。对于本书中的简单游戏,使用Log类应该足够了日志不仅仅只是给文本文件写入几行。来自于应用程序的日志数据常常用来远程获取用户错误,借助一个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对象,以便可以方便地在静态方法中访问。当这个类第一次被调用的时候,就会通过其静态构造器被初始化:

Log类使用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文件中,最后如果项目在debug模式,也把消息输出到控制台。现在,只是通过添加下列代码行,当你每一次完成来自第二章的Breakout游戏的一个关卡,你就给Log.txt文件添加一个新行:

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


发布时间:2008/6/24 下午4:07:40  阅读次数:5350

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号