引擎之旅 Chapter.4 日志系统

关于近段时间为何没有更新的解释:Find a new job.
目录
  • 引言
  • 日志语句的分类
  • 控制台窗体 和 VSOutput Tab的日志打印
  • 存储至特定的文件中
  • 展示堆栈信息
引言一般来说,一个优质的商业级别的游戏本质上就是一个复杂庞大的软件系统 。在庞大系统的开发过程中难免会出现错误 。为了排查错误、校验代码的正确性,游戏引擎一般会提供一些调试和开发工具,一般有如下几个:
  • 日志及代码追踪:日志系统一般提供向控制台等页面打印字符串的功能;在打印中也能够清晰的显示调用的堆栈信息 , 以便于定位代码错误的位置 。
  • 调试绘图功能:引擎会提供在游戏场景中绘制辅助线的功能,这些辅助线能清晰的表示范围、方向等信息以供游戏开发者进行调试 。
  • 内置菜单:游戏编辑器的一些全局设置,通过不同的设置,方便游戏开发者对特定渲染、逻辑等进行调试 。
  • 内置控制台:对于游戏引擎来说,项目为非控制台程序,因此我们无法用简单的使用printf方法将日志输出至控制台 。内置控制台就是游戏编辑器中收集和显示日志的窗体 。
  • 性能剖析与统计:方便游戏开发者定位性能瓶颈(一个重要的模块)
当然,仅仅这一章节无法去完成对这些调试工具的阐述 。本文中的日志系统主要实现了日志及代码堆栈信息的输出功能(上述的第一点),其他部分的内容后续在将其慢慢的完善 。本章中的日志系统主要实现一下几点功能:
  • 日志语句可分类,且不同的分类有相关颜色的提示 。
  • 日志可打印到控制台窗体、Vistual Studio输出框 。
  • 日志可存储至特定的日志文件中 。
  • 日志语句可展示相关的堆栈信息 。
显示效果如下:
  • 不显示相关堆栈信息
    引擎之旅 Chapter.4 日志系统

    文章插图
  • 显示相关堆栈信息
    引擎之旅 Chapter.4 日志系统

    文章插图
日志语句的分类将日志语句分类可以让开发者打印不同重要性的Log 。比如Unity编辑器中的Console将日志语句分为了:Log、Warn、Error三个部分 。在TurboEngine的设计中,我将日志分类写为一个枚举类,并将不同的类型在二进制不同的位中岔开 , 方便筛选 。
//日志语句重要性等级enum LogImportantLevel : int{ CodeTrace = 0b00001,//最低级,用于记录代码执行轨迹(白) Info = 0b00010,//常规,显示日志消息(绿) Warn = 0b00100,//较高级,用于日志警告信息(警告) Error = 0b01000,//高级 , 用于日志错误信息(错误) Critiacal = 0b10000,//最高级,用于关键日志信息(关键信息)};控制台窗体 和 VSOutput Tab的日志打印这一部分很简单 。将日志打印到Console和VS Output主要使用以下两个函数
//to Consoleprintf(const char* format,...);//to VS OutputOutputDebugStringA(const char* lpOutputString);我一般喜欢将特定的功能封装在自己的函数中 , 一方面可以作为将函数用自己的命名形式统一命名方便调用 。另一方面,我们需要对原生函数进行功能上的拓展 。

    推荐阅读