一.调试技巧及工具

(1)基础调试

a)   日志及追踪,有些bug难以用VS自带的调试来进行单步调试,最好的解决方案就是printf调试法,打印一组数据,观察情况。之前我的做法是单独生成一个控制台,不过VS自带了一个OutPutDebugString()的方法,可以打印调试信息。不过这个只支持char*内容,我们可以将这个函数加工一下,使其支持不同类型的数据,甚至可以使其接受可变参数个数。

b)   冗长级别:我们有时想要打印,有时又不想打印,所以可以设置打印内容的级别,每个信息设置一个级别,然后设置一个全局的级别,大于这个级别的打印,然后可以通过调节全局级别,控制打印内容的范围。

c)      频道:再扩展的想一想,有很多要打印的内容时,就会比较乱,那么,将不同模块的打印信息分成不同的频道就可以解决问题了,再增加一个频道的参数,就可以控制打印哪个频道的相关信息啦。

d)      日志:有时候程序会莫名的崩掉,这时候就不单单要只看打印信息了,我们需要将程序的执行过程写入日志文件来供运行后查看结果。这里有个纠结的地方,如果每次打印都输入到日志文件,会保证日志的完整性,但是会损失性能,如果缓冲满了才输出到日志,有可能程序崩了就没办法将缓冲区的内容输出了,所以这是个取舍的问题。

e)  崩溃报告:崩溃报告也是一种日志,不过是程序崩溃时才有的日志,多数操作系统有一个顶层的异常处理函数,可以在此函数中打印各种异常信息,甚至发送电子邮件给程序团队(这个有点6啊),这些异常信息包括玩家状态,关卡,正在运行的脚本,堆栈信息等等帮助我们发现bug的信息。

(2)游戏中特有的调试功能

上面的一般的程序也可以使用,不过下面的这个应该是游戏中特有的东东了,绘图调试。

游戏几乎全是数学内容驱动的,我们用数学来定位物体,比如碰撞检测,投射光线,检测视线等等,如果我们这些东东都打印出来,一方面特别麻烦,另一方面也不好观测,更好的解决方案是用绘图将信息绘制出来,比如一个包围盒,那就把它画出来,正所谓一图顶千言,画面是最好的表现方式。

调试绘图API:应该简单易用,图形包扩直线,球体,点,坐标轴(x红色,y绿色,z蓝色),包围盒,文本。最好加上可以控制颜色,线的宽度,球体半径,坐标轴长度等的功能。

我们可以通过参数调节这些图元的位置,大小等等,自由度很高。而且这些内容可以使用一个DebugDrawManager类来进行管理,将调试绘图内容添加到调试内容队列中,在渲染时一起渲染出来。

(3)游戏内置菜单,或者主控台也是很好的选择,我们可以通过菜单或者控制台在游戏中对游戏进行控制,如果支持强大的脚本语言,甚至可以操纵整个游戏。比如一个AI,可以去掉其AI,改用手动控制AI以达到调试的目的。

(4)我们在调试游戏的时候,可以给人物手动添加点buff,比如去掉碰撞检测,移动到任意场景。

(5)摄像机移动:有时在调试游戏时,从某个角度我们不能很好的看到游戏的情况,所以我们可以设计一个在游戏暂停运行时也可以移动的摄像机来帮助我们调试。

(6)截屏也是一个很重要的调试方法,有些时候我们不能很好的重现bug,这种情况下截图或者屏幕录制就可以很好的帮我们定位bug。

(7)性能检测:游戏是实时系统,保证FPS很重要,我们要把握好性能,一种方法是查看函数的调用时间,一方面是函数本身的执行时间,另一方面则是函数的调用次数。

(8)如果资源载入失败,应该给出明确的Log提示信息,或者直接在游戏中显现出来。

(9)内存以及内存泄露检测也是很重要的。

二.渲染引擎

渲染引擎是游戏引擎中的重中之重,同时也是最难的部分。作为一个图形学,DX还没怎么学的小白,表示这一章并看不懂多少,只是知道一些概念,得继续恶补了。

(1)      首先就是介绍3D世界构成的那些元素:顶点,三角网格,光照,材质纹理,光照模型,摄像机,光栅化,Z缓存,抗锯齿等等。

(2)      渲染管道:渲染的架构是基于管道(pipeline)的,管道最大的优势就是并行性,各个阶段的计算同时进行,极大的增大了渲染系统的吞吐量。

(3)      渲染管线广义上的划分:

a)        工具阶段(脱机):定义几何体和材质

b)        资产调节阶段(脱机):调节几何体和材质数据,使之变成引擎可用的格式

c)        应用程序阶段(CPU):识别出潜在可视的网格实例,将他们及其材质送至图形硬件以供渲染。

d)        几何阶段(GPU):顶点变换,光照,投影至齐次裁剪空间

e)        光栅化阶段(GPU):三角形转化为片段,对片段着色。经过多重测试(深度测试,alpha测试,模板测试等)最终和帧缓冲融合。

(4)      在渲染之前设置世界矩阵,光源方向矢量,纹理绑定,纹理寻址及过滤模式,基于时间的纹理滚动或动画效果,深度测试(禁用或者启用),alpha混合选项。在提交图元之前要进行设置,绘制只有有时需要还原设置。如果我们忘记了,则会造成渲染状态泄露,即上一个图元的渲染状态影响了下一个图元的渲染状态。

(5)      设置渲染状态是全局的,对整个GPU有效,改变渲染状态时,整个GPU管道必须完成工作才能换上新的设置,所以对于渲染的顺序一定要把握好,不然会有性能损失。最好是按照材质排序来渲染,但是如果按材质来,又会有overdraw即重复渲染同一个像素。解决的办法是使用GPU的深度预渲染步骤(z prepass),即第一次迅速产生深度缓冲内容,第二次才用完整的颜色填进帧缓冲。

(6)      场景图(scene graph):所谓场景图不是图,而是管理场景中对象的数据结构,在平头截体剔除之前先进行显示对象剔除,通常为四叉树,八叉树,BSP树,kd树,空间散列技术等。四叉树和八叉树使用的是递归的思想,将场景不断细分,查询的开销维持在最小。BSP树使用一个平面将空间平分,即传说中的二元空间分割树。

BSP树或者入口系统:用于室内环境

四叉树:室外平坦地形,上帝视角

额外剔除机制:室外大场景,第一人称或第三人称游戏

(7)      好吧,剩下的我基本都看不懂了…诸如:法线贴图,高动态范围光照(HDR),全局光照(GI),伽马校正,全屏后期处理(动态模糊,景深模糊,晕影,着色等等)

游戏引擎真的是博大精深,即使十年时间,也不一定能全部搞懂。做游戏简单,前提是有引擎。做一个引擎真的是太难了!

《游戏引擎架构》读书笔记(二)相关推荐

  1. 深入理解JVM读书笔记二: 垃圾收集器与内存分配策略

    3.2对象已死吗? 3.2.1 引用计数法 给对象添加一个引用计数器,每当有一个地方引用它的地方,计数器值+1:当引用失效,计数器值就减1;任何时候计数器为0,对象就不可能再被引用了. 它很难解决对象 ...

  2. 《Docker 技术入门与实践》-读书笔记二

    <Docker 技术入门与实践>-读书笔记一 <Docker 技术入门与实践>-读书笔记二 一.数据管理 用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据 ...

  3. 《Introduction To Modern Cryptography》读书笔记二

    <Introduction To Modern Cryptography>读书笔记二 本笔记纯粹个人读书习惯与相应见解,内容归纳完全出于个人需要与个人局限,如有修改意见(比如哪儿应该是值得 ...

  4. oracle直查和call哪个更快,让oracle跑的更快1读书笔记二

    当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net  网友分享于:2013-08-23  浏览:9次 <> ...

  5. 《How Tomcat Works》读书笔记(二)

    <How Tomcat Works>读书笔记(二) 这是<How Tomcat Works>第一二章的读书笔记.第一张主要写了一个静态资源处理的web服务器,第二章加了对ser ...

  6. 3D游戏设计读书笔记二

    3D游戏设计读书笔记二 一.简答题 • 解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系.   GameObjects是一个具体的实例,Assets是包括诸多游戏素材的资 ...

  7. 《李元芳履职记》读书笔记二 IT技术管理的沟通与团队建设

    <李元芳履职记>读书笔记二 接一 https://blog.csdn.net/qq_45937199/article/details/103305223 IT技术人员从技术岗走向管理岗,所 ...

  8. python图像处理《数字图像处理与python实现》读书笔记二:空间滤波

    文章目录 重要! 第三章 空间滤波 概览 3.1 空间滤波基础 3.1.1 空间滤波的机理 3.1.2 空间滤波器模板 3.2 平滑处理 3.2.1 平滑线性空间滤波器 3.2.2 统计排序滤波器 3 ...

  9. 第一行代码 Android读书笔记(二)

    第一行代码 Android读书笔记 第三章 软件也要拼脸蛋-UI开发的点点滴滴 常用控件的使用方法 详解4种基本布局 自定义控件 最常用和最难用的控件-ListView 更加强大的滚动控件-Recyc ...

  10. 《淘宝技术这十年》读书笔记 (二).Java时代的脱胎换骨和坚若磐石

    马云说过"一个好的东西往往是是说不清楚的",姑且不论这句话的对与错.但我真的很佩服<淘宝技术这十年>这本书的作者子柳,能够通过淘宝的一些故事,按照时间顺序和IT发展的各 ...

最新文章

  1. knn计算机在图片中的应用,图像分类和kNN
  2. pelee yuface 手势模型
  3. aix oracle监听配置_LINUX系统下Oracle修改默认监听端口号操作
  4. 自动打包_全自动打包机行业发展如何?全自动打包机行业发展现状分析
  5. python读取raw图片文件_在python下读取并展示raw格式的图片实例
  6. linux脚本编程延时函数,shell脚本编程之函数
  7. [JavaScript]20个优秀的Javascript导航技术
  8. 实对称矩阵的特征值求法_【8】实(反)对称矩阵的特征值
  9. 饥荒指令代码大全一览
  10. Unity环境光 Environment面板
  11. 使用微擎 微赞 微信登陆遇到redirect_uri 参数错误的设置办法
  12. elementUI表格合并单元格详解
  13. 每天一个linux命令(26):用SecureCRT来上传和下载文件(转载自竹子)
  14. 实现简单的轮播图(单张图片、多张图片)
  15. C#中的MemoryStream
  16. 如何安装projectlombok
  17. matlab中求最大因数,matlab最大公约数 三种算法
  18. 【bzoj 1616】: [Usaco2008 Mar]Cow Travelling游荡的奶牛 dp
  19. 10.26 酷狗音乐校招前端一面经历
  20. org.springframework.beans.factory.UnsatisfiedDependencyException

热门文章

  1. C# linq的学习及使用
  2. 圣诞节快来了~用python做一个粒子烟花震撼众人赚个女孩回来吧~
  3. 通过服务器给多台计算机装系统,局域网有100多台电脑怎么 同时装系统
  4. [Unity]Optimize Your Mobile Game Performance中文版
  5. 3D建模教程讲解!PBR场景制作破损的图书馆
  6. 《用户至上:用户研究方法与实践(原书第2版)》一3.1 概述
  7. 09组团队项目-Alpha冲刺-3/6
  8. Vue 正确理解mounted、beforeUpdate、updated三个钩子函数的关系
  9. mkv视频格式转换mp4格式
  10. Topmobi接口协议