辅助类——记录错误信息
記錄錯(cuò)誤信息
Debug游戲代碼可能是非常復(fù)雜的,特別是如果您沒(méi)有得到任何異常,但某些渲染循環(huán)卻出錯(cuò)。只設(shè)置幾個(gè)斷點(diǎn)并不夠,尤其是如果游戲在運(yùn)行一段時(shí)間之后遇到錯(cuò)誤,Debug并不是正確的選擇。您想知道每一幀都運(yùn)行了什么,但又不想逐步貫穿500幀去發(fā)現(xiàn)它。對(duì)于這類(lèi)問(wèn)題,您可以?xún)H僅拋出一些文本到控制臺(tái),不過(guò)這只能在Visual Studio中使用,而且當(dāng)你下次啟動(dòng)項(xiàng)目時(shí)將會(huì)丟失所有的控制臺(tái)內(nèi)容。
在我做過(guò)的所有比較大型的項(xiàng)目中,一個(gè)最重要的類(lèi)就是Log類(lèi),它只是給一個(gè)簡(jiǎn)單的文本文件寫(xiě)入消息、警告、錯(cuò)誤或者Debug文本。這個(gè)類(lèi)本身很簡(jiǎn)短,也很簡(jiǎn)單,但如果你以正確的方式使用它,將會(huì)給您的debug調(diào)試和測(cè)試會(huì)話(huà)更令人愉快。另外,還有更加高級(jí)的日志記錄類(lèi)和框架(logging classes and frameworks)可利用,諸如Log4Net,你可以在http://logging.apache.org/log4net/找到。日志不僅僅只是給文本文件寫(xiě)入幾行。來(lái)自于應(yīng)用程序的日志數(shù)據(jù)常常用來(lái)遠(yuǎn)程獲取用戶(hù)錯(cuò)誤,借助一個(gè)WebService,你可以激活Windows錯(cuò)誤事件,還可以做很多其他事情。這些不是本書(shū)能涵蓋的,因?yàn)檫@是一個(gè)非常復(fù)雜的話(huà)題。對(duì)于本書(shū)中的簡(jiǎn)單游戲,使用Log類(lèi)應(yīng)該足夠了。
先看一看Log類(lèi)(在Breakout游戲中能找到一個(gè)更復(fù)雜的版本):
public class Log {#region Variablesprivate static StreamWriter writer = null;private const string LogFilename = "Log.txt";#endregion它使用一個(gè)Log.txt文件來(lái)存儲(chǔ)所有消息,并使用一個(gè)靜態(tài)的StreamWriter對(duì)象,以便可以方便地在靜態(tài)方法中訪(fǎng)問(wèn)。
#region Static constructor to create log file static Log() {// Open fileFileStream file = new FileStream(LogFilename, FileMode.OpenOrCreate,FileAccess.Write, FileShare.ReadWrite);writer = new StreamWriter(file);// Go to end of filewriter.BaseStream.Seek(0, SeekOrigin.End);// Enable auto flush (always be up to date when reading!)writer.AutoFlush = true;// Add some info about this sessionwriter.WriteLine("/// Session started at: "+StringHelper.WriteIsoDateAndTime(DateTime.Now)); } // Log() #endregion在游戲運(yùn)行的時(shí)候,枚舉值FileShare.ReadWrite確保你總是可以從外部讀寫(xiě)文件。除此之外,要把writer設(shè)置到文件的末尾,AutoFlush屬性能夠確保寫(xiě)入新數(shù)據(jù)會(huì)被立即存儲(chǔ)到日志文件中,最后再添加一點(diǎn)兒文本指示這次會(huì)話(huà)已經(jīng)開(kāi)始。對(duì)于時(shí)間戳你將使用StringHelper類(lèi)的一個(gè)輔助方法,你立刻就會(huì)學(xué)到這個(gè)類(lèi)。
最后,這是該類(lèi)的最重要的一個(gè)方法、也是您將一直調(diào)用的唯一方法:
#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首先,在消息的前面加上一個(gè)簡(jiǎn)單的時(shí)間戳。然后消息被寫(xiě)入Log.txt文件中,最后如果項(xiàng)目在debug模式,也把消息輸出到控制臺(tái)。現(xiàn)在,只是通過(guò)添加下列代碼行,當(dāng)你每一次完成來(lái)自第二章的Breakout游戲的一個(gè)關(guān)卡,你就給Log.txt文件添加一個(gè)新行:
Log.Write("Level " + level + " completed.");轉(zhuǎn)載于:https://www.cnblogs.com/AlexCheng/archive/2010/07/28/2120269.html
總結(jié)
以上是生活随笔為你收集整理的辅助类——记录错误信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: AjaxControlTookit中的A
- 下一篇: C#程序出现内存溢出错误的解决办法