FEATURED · 精选文章

quake3源码大致流程

发布时间 / 2026/8/28 1:18:59
来源 / 创域科博编辑部
栏目 / 资讯中心
quake3源码大致流程 现在这一部分很大意义上是游戏的初始化部分。很大意义上是从你点击3D游戏开始出现的画面到这个游戏结束的一个过程经历罢了在刚开始的游戏画面一般是游戏公司的标志例如id的公司标志乃是出现的比如 游戏开始时候加载的视频画面代表 深思(deep idea)还记得《doom启示录》里的id公司名字的来临吗这个就是。有好几个阶段的 游戏技术 使用的是 roq 视频 格式有的函数 比如 加载roq视频文件解压缩 等等 函数……一开始q3游戏就会显示加载bsp等等文件你可以看见或者在游戏中按下“~” 可以显示出来 控制台……windows 的代码windows-load库文件{ 检测cpu,gpu等等显卡的信息者也检测机器的类型比如显卡cpu的种类之类生成配置文件 初始化d3d,初始化opengl,初始化网络端口鼠标键盘的初始化时间的记录等等加载cfg配置文件配置各个系统。。。。。。。。。。。。。等等初始化内存空间部分联网如果出现问题的话那么在会出现了控制台就会显出错误来创建虚拟机 加载qvm等脚本文件根据这个ui。qvmcgame.qvm,game.qvm等逻辑部分要对于文件进行编译不断遍历虚拟机的各项状态例如断开运行中 了等等了如果是单机 server的配置等等例如玩家的数目 开始进行游戏启动cgame中的内容对于游戏开始状态的遍历将硬盘或者其他存储形式的设备 文件中ui的图片标签来进行调用渲染器来进行显示在了 屏幕上面加载 Ui 背景音乐然后 加载 代表 工作室 的电影来显示……然后会出现这个ui游戏的界面部分一般单人部分多人部分设置制作团队退出等等这几个选项吧然后加载代表ui的图像文字等等在屏幕上显示出来ui的显示部分包括了显示部分鼠标点击部分菜单子菜单按钮标签等等。可以按格式分为分为icon,string图片等等以及相应的位置颜色。然后在游戏运行时被编译为机器码以后再被render的2D部分渲染之例如 调用这些函数 等等ui很大意义上能够调用引擎的部分函数改变游戏中的的设置。ui与控制台很大意义上对应的是各个部分函数对应的命令虚拟机通过这个命令把命令转换为对应的真正的函数来调用之这个极为重要者也quake3把各个部分的主要的接口例如渲染ai音效等等的函数对应成命令就像快捷方式一样通过虚拟机执行陷入 来实现汇编语言的跳转来转到真正的函数上来整个quake3其实就是根据命令行的输入执行来处理的你可以输入控制台命令来使用引擎的功能的例如god表示无敌give all给你所有的东西这其实是控制台命令罢了命令行驱动是的运行方式其实就是有限状态机……状态的变化使得调用的函数不同者也。例如 (伪代码 如下)loadFile 0readfile 1write 2closefile 3addEntity 4renderCurentFrame 5startAI 6举了个简单的例子不太恰当大致就是quake3使用一个变量保存的各种状态等等不断的转换 各种状态来调用的真实的函数执行。机器人也是用的这个。在 控制台 里可以使用命令行的一部分命令了要用这种思路来看的代码运行时不光是的运行还有一个控制台程序运行呢要用调试的眼光看的代码。查看内存的大小以及那块文件未被加载实时的调试程序查看每一幁的多边形多少时间的长短改错误。加载每一副地图检验有没有问题这个要求在游戏程序时候 时要进行对各个部分的处理信息显示完成消息在 控制台里例如我们平时玩的游戏可以输入调试 我感觉这个词语相对合适 命令的例如上帝模式加载地图加载“游戏中health值”其实都是在加载间接调用的真正的函数运行罢了。大致的流程在游戏开始了以后在cgame文件夹里包含了对于地图的场景数据音效等等的记录等等很像是把物体放到房间里来摆好位置。在加载成功后要在控制台显示加载成功者也。利于程序猿进行知道是否加载成功了。对文件加载进来后分析文件有没有问题在进行游戏的逻辑阶段客户端的比较简单了就是其他的玩家显示你自己的统计起来发到网络渲染等等各部分在加载地图后还要加载表示物体的模型与音效拿去后的音效初始化位置动得要进行运动者也初始化 玩家信息玩家属性 包括了1相应的模型三部分头部胸部下部放到3D阶段渲染。2 声音例如起跳时的声音落到水里时的声音游戏中败倒时的声音受伤时的声音(3玩家的生命值弹药数目武器装甲等等通过2D窗口的文字来进行2D渲染者也如果是bot,还要加载bot 对应的脚本程序编译赋给bot以参数者也等等4手里预先的的weapon一般很多配置信息 从 配置文件 设置出quake3初始的默认weapon就是一把机关枪。位置移动速度。状态爬着走路跑步游泳等等5以上是共性的一些东西你和机器人或者你和在某个地方的玩家的共性。如果这个玩家就是你自己的话鼠标与键盘初始化来控制你在游戏中的角色一般就是 枪 用来来代表你自己鼠标键盘相当于你的腿脚枪像是你手里的武器者也你通过武器来控制游戏中的这个枪来模拟你自己从而感觉你就在游戏中者也显示部分音效刚发现其实玩家信息位置状态部分》多人对战时主要要更新的数据加载配置文件的照相机的位置坐标朝向等等根据照相机坐标与pvs潜在可视集判断你在哪个房间其实就是根据你的坐标位置判断你在哪个立方体的房间中将你所在的房间或者地形画出来房间中的你能看到的物体画出来你能看到的bot机器人。正如现实世界你看不到山不代表没有山在电脑里你看不到山有可能就是没有山。在游戏运行中发现了一些的东西例如游戏中玩家的健康值弹药数目盔甲显示自己名字十字准星控制台等等。使用渲染器的2d进行渲染者也。对于得分板分为游戏类型夺旗多着加分死亡竞赛 杀的人多 加分者也群战 杀的对方多的加分等等对于3D的渲染则是使用的opengl把你所选的地图敌人的数据 发送到显卡中去渲染 出来例如渲染的状态分为场景电影2D3D这几个状态分别在ui界面时渲染器转换到 2D渲染进入游戏后转换到3D渲染在播放游戏开始的画面视频时在切换到视频的状态每个状态对应的执行过程不同例如3D的渲染3空间的物体渲染的平面的物体场景的电影通过投影变换等等 变换 把它转换为 一幁一幁地画上去与的切换可使用的矩阵的正视矩阵与透视矩阵切换而成的。在点击了编译所有的脚本quake3 的脚本quakec。经历了3代的发展脚本与游戏中的很多函数是一一对应着的使用脚本好比是使用装载机人手一按操作杆装载机立即将土挖起在不了解源码的基础上充分的使用整个 游戏程序 的 威力然后根据脚本来处理游戏逻辑者也使得关卡设计者能够编辑脚本语言来控制游戏流程者也当你点击了单人部分以后2单人阶段单人游戏 —加载bsp文件进行渲染阶段客户端初始化bot数量 加载aas地图根据aas地图进行机器人的人工智能阶段根据玩家选择的bot机器人数目初始化bot 数量根据bsp的entity将表示bot物体的md3模型 加载到 内存 中根据bsp文件存放的中的位置数据在屏幕中显示出来。初始化bot的性格加载表示bot性格的权重文件使得每个bot的性格不同导航寻路根据不同的地形选择不同的运动方式机器人 -{遇见物体如弹药生命值如果缺少就拿取拿上后健康加值子弹加倍追逐目标谈话同一队的可以互相谈话更新部分如果游戏的时间未到1机器人或你挂了随机选一个重生点重生复活继续战斗吧2装甲弹药被人拿走了过一会时间重生如果没拿走继续在原位置旋转等着3 更新每个玩家的战斗成绩当你点击了联网多人作战以后网络部分网战部分玩家可以自己在自己的机子上建立了局域网服务器这部分未通或者连到id的quake3的服务器多人对战者也。对于玩家的ip地址首先要进行过滤查看是否是合适的地址者也然后给玩家建立一个记录1 将玩家的ip值端口号ip协议作为数据包的第一部分2玩家对于服务器的命令例如申请连接退出下载文件等等3玩家之间在对战时的对话声音数据通话信息呼叫防守等等信息当然还有发送时的时间玩家现在执行的的状态向前走跳举weapon射击等等一幁的信息这三部分组织到一块后历经 赫尔曼编码 压缩 后发送到 服务器处理者也为了防止玩家作弊需要先把玩家的数据发到服务器进行逻辑判断正确后才发数据到客户端使得显示者也否则不行在quake3之中为了解决网络延迟使用了udp协议我们知道tcp是根据的 阻塞数据 保证的数据能够正确的到达但是由于网络有问题延迟了丢数据报了又得重新申请数据包quake3直接udp数据报出了问题后、直接丢了发新的数据包不再阻塞了服务器直接响应,直接处理对于玩家的机器是什么协议连到服务器的不知道按照玩家的协议服务器组织数据包发到玩家手中去者也值得注意是quake也是分区的进行处理。累了隔一会在写在游戏中每时每刻都要进行对鼠标键盘的检测渲染画面等等但我们可以往下这样子想网络对战时你用鼠标来控制游戏画面中手里拿的枪按w前进了一步将前进一步的这个数据命令发到服务器上服务器判断你走的地方能不能走的通一步走多远发送数据给你你的机器接到后如果能走按服务器的数据向前走多远。1游戏阶段加载配置文件 加载bsp,渲染器阶段windows-{ 检测机器的类型如什么显卡什么cpu之类 等等篇幅太小难一写全加载ui.qvm,cgame.qvm,game.qvm等开始游戏逻辑阶段3多人阶段及游戏逻辑部分单人部分game运行人工智能部分代码 不运行联网代码 仿照客户端-服务器端的game——server -{多人游戏部分联网代码运行 不运行AI代码 运行玩家所选择的地图的逻辑部分场景电影管理} ———— client ——cgame{ 声音文件的管理渲染数据的管理-render渲染器渲染. ....................client 文件夹中包含了控制台的建立声音文件的处理输入与输出场景电影文件的处理等等cgame 文件夹里包含了 粒子系统的代码 weapon的代码控制台客户端命令代码 服务器命令2D图片按钮的代码得分板 玩家数目加载玩家的模型文件 声音wav文件的解压播放等处理server文件夹里 包含了游戏数据的下载处理玩家所选的地图处理命令的解析处理等等这个有待完善服务器与客户端的数据要经过压缩与解压数据压缩的越短传输的速度就快到了另一段后再解压……服务器端保存着每个玩家的信息当一个玩家的信息到了传输到所有的玩家上广播之早晚这一部分必须重写者也我们打游戏的时候鼠标键盘的操作无论古董级别的游戏应该是 配置 还是现在的游戏都需要这个的操作的处理画面的处理等等引擎一共分为几个组件渲染部分和音频aiaas路径服务器部分逻辑将各种渲染阶段的主要的流程如下所示了cgame render部分代码 -根据配置文件的来配置opengl-设置视口大小-加载bsp文件-根据 玩家位置计算pvs潜在可视集-找到玩家所在的房间及邻居房间敌人模型或表示物体的模型渲染天空使用的天空盒进行渲染 -(1)表示房间多边形 数目2表示物体的多 边 形3光源数目等等-1将表示房间的多边形与表示物体或人物模型的多边形组合到一起2光源部分-在确定完玩家潜在能看到的多边形后-对玩家生成平截头体根据平截头体再进一步梳理我感觉这个词语更合适一些 pvs中看不见的多边形剩下的多边形其实就是一幁所要处理的图像-将多边形进行排序对不透明的多边形从前往后渲染从后往前对透明的多边形先渲染-当对于多边形阶段完了后对多边形进行细分-再进行 backend后置阶段根据多边形对应的shader文件的参数则对于幁缓存区进行操作-如果多边形是水波人物等则计算运动时水波运动物体表面的颜色加在物体的最终颜色之中,水波计算它的波动率而怪物则要根据更新动画来显示出来 光照部分使用有光的照片代替 -比较深度测试模板测试颜色测试等等对于纹理图片也是根据shader文件中的格式参数等等加载多边形相对应的bmp,jpg,tga等等图像进行加载根据纹理对应的混合参数进行对应的纹理混合方式然后再渲染阴影如平面阴影阴影体等等阴影也是根据幁缓存区的内容来生成的渲染2D时 对投影方式进行改为正投影使得用于渲染2D的文字图片按钮之类例如生命值弹药数可能看起来有一些复杂但实际的过程其实更为复杂声音的处理上雷神之锤3主要使用的wav文件来进行播放音乐 在windows上面调用d3d中的音频函数来播放在游戏开始了以后在cgame文件夹里包含了对于地图的场景数据音效等等的记录等等很像是把物体放到房间里来摆好位置。在加载成功后要在控制台显示加载成功者也。利于程序猿进行知道是否加载成功了。对文件加载进来后分析文件有没有问题在进行游戏的逻辑阶段客户端的比较简单了就是其他的玩家显示你自己的统计起来发到网络渲染等等各部分在加载地图后还要加载表示物体的模型与音效拿去后的音效初始化位置动得要进行运动者也初始化玩家信息玩家属性包括了1相应的模型三部分头部胸部下部放到3D阶段渲染。2 声音例如起跳时的声音落到水里时的声音死亡时的声音受伤时的声音(3玩家的生命值弹药数目武器装甲等等通过2D窗口的文字来进行2D渲染者也如果是bot,还要加载bot对应的脚本程序编译赋给bot以参数者也等等4手里预先的的weapon一般从配置文件设置出quake3初始的默认武器就是一把机关枪。位置移动速度。状态爬着走路跑步游泳等等5以上是共性的一些东西你和机器人或者你和在某个地方的玩家的共性。如果这个玩家就是你自己的话鼠标与键盘初始化来控制你在游戏中的角色显示部分音效刚发现其实玩家信息位置状态部分》多人对战时主要要更新的数据加载配置文件的照相机的位置坐标朝向等等根据照相机坐标与pvs潜在可视集判断你在哪个房间其实就是根据你的坐标位置判断你在哪个立方体的房间中将你所在的房间或者地形画出来房间中的你能看到的物体画出来你能看到的bot机器人。正如现实世界你看不到山不代表没有山在电脑里你看不到山就是没有山。在游戏运行中我们发现了一些的东西例如玩家的生命健康值弹药数目盔甲显示自己名字十字准星控制台等等。使用渲染器的2d进行渲染者也。对于得分板分为游戏类型夺旗多者加分对于3D的渲染则是使用的opengl把你所选的地图敌人的数据发送到显卡中去渲染出来例如渲染的状态分为场景电影2D3D这几个状态分别在ui界面时渲染器切换到2D渲染进入游戏后转换 到3D渲染在播放游戏开始的画面视频时在切换到视频的状态每个状态对应的执行过程不同例如3D的渲染3空间的物体渲染的平面的物体场景的电影我们把它剪成一幁一幁地画上去与的切换可使用的矩阵的正视矩阵与透视矩阵切换而成的。在点击了编译所有的脚本quake3 的脚本quakec。经历了3代的发展脚本与游戏中的很多函数是一一对应着的在不了解源码的基础上充分的使用整个引擎的 威力。然后根据脚本来处理游戏逻辑者也使得关卡设计者能够编辑脚本语言来控制游戏流程者也当你点击了单人部分以后2单人阶段单人游戏 —加载地图bsp文件进行渲染阶段客户端初始化bot数量 加载aas地图根据aas地图进行机器人的人工智能阶段根据玩家选择的bot机器人数目 初始化bot 数量根据bsp的entity将表示bot物体的md3模型加载到内存中根据bsp文件存放的中的位置数据在屏幕中显示出来。初始化bot的性格加载表示bot性格的权重文件使得每个bot的性格不同导航寻路根据不同的地形选择不同的运动方式机器人 -{遇见物体如弹药生命值如果缺少就拿取拿上后健康加值子弹加倍追逐目标谈话同一队的可以互相谈话更新部分如果游戏的时间未到1机器人或你挂了随机选一个重生点重生复活继续战斗2装甲弹药被人拿走了过一会时间重生如果没拿走继续在原位置旋转等着3 更新每个机器人的战斗成绩如果遇到途中的而武器捡起对于chat这个ai的更新模拟现实人物的谈话见到敌人攻击受伤了寻找健康包。等等游戏逻辑的判断单挑的死亡竞赛谁干掉的人最多谁胜利组队死亡竞赛 红队绿队哪一组干掉的人多谁就胜利了夺旗模式谁先把对方的旗帜抢走谁算是胜利等等在这个过程中单人部分服务器运行人工智能部分代码 不运行联网代码 仿照客户端-服务器端的game——server -{多人游戏部分联网代码运行 不运行AI代码 运行玩家所选择的地图的逻辑部分当你点击了联网多人作战以后网络部分网战部分玩家可以自己在自己的机子上建立了局域网服务器这部分未通或者连到id的quake3的服务器多人对战者也。简单来说对于玩家的ip地址首先要进行过滤查看是否是合适的地址者也然后给玩家建立一个记录1 将玩家的ip值端口号ip协议作为数据包的第一部分2玩家对于服务器的命令例如申请连接退出下载文件等等3玩家之间在对战时的对话声音数据通话信息呼叫防守等等信息当然还有发送时的时间玩家现在执行的的状态向前走跳黄河举枪射击等等一幁的信息这三部分组织到一块后历经赫尔曼编码压缩后发送到服务器处理者也为了防止玩家作弊需要先把玩家的数据发到服务器进行逻辑判断正确后才发数据到客户端使得显示者也否则不行在quake3之中为了解决网络延迟使用了udp协议我们知道tcp是根据的阻塞数据保证的数据能够正确的到达但是由于网络有问题延迟了丢数据报了又得重新申请数据包quake3直接udp数据报出了问题后、直接丢了发新的数据包不再阻塞了服务器直接响应,直接处理对于玩家的机器是什么协议连到服务器的不知道按照玩家的协议服务器组织数据包发到玩家手中去者也值得注意是quake也是分区的进行处理。累了隔一会在写在游戏中每时每刻都要进行对鼠标键盘的检测渲染画面等等但我们可以往下这样子想网络对战时你用鼠标来控制游戏画面中手里拿的枪按w前进了一步将前进一步的这个数据命令发到服务器上服务器判断你走的地方能不能走的通一步走多远发送数据给你你的机器接到后如果能走按服务器的数据向前走多远。但如果你想在游戏里跳悬崖我们知道游戏的2.5d是不让玩家跳过悬崖的结果你就在悬崖边一直往下按w前进一步就是悬崖了可就是画面还是你被挡在了场景电影管理client ——cgame{ 声音文件的管理渲染数据的管理-render渲染器渲染. ....................client 文件夹中包含了控制台的建立声音文件的处理输入与输出场景电影文件的处理等等cgame 文件夹里包含了 粒子系统的代码 武器的代码控制台客户端命令代码 服务器命令2D图片按钮的代码得分板 玩家数目 加载玩家的模型文件 声音wav文件的解压播放等处理server文件夹里包含了游戏数据的下载处理玩家所选的地图处理命令的解析处理等等这个有待完善服务器与客户端的数据要经过压缩与解压数据压缩的越短传输的速度就快到了另一段后再解压服务器端保存着每个玩家的信息当一个玩家的信息到了传输到所有的玩家上广播之早晚这一部分必须重写者也我们打游戏的时候鼠标键盘的操作无论古董级别的游戏还是现在的游戏都需要这个的操作的处理画面的处理等等引擎一共分为几个组件渲染部分和音频aiaas路径服务器部分逻辑将各种渲染阶段的主要的流程如下所示了渲染的大致一个流程分为好几种状态线程的交换渲染2d渲染3d,设置颜色在线程闲暇显示fps幀数在渲染器中实现了增加entity的函数渲染一个entity增加当前的渲染队列的光源的函数了增加动态的面例如水波的面还有刷新渲染队列等等 这里只是写的在游戏中运行的一个过程(1)表示房间多边形 数目2表示物体的多 边 形3光源数目等等- 经过裁剪之后。在确定完玩家潜在能看到的多边形后-对玩家生成平截头体根据平截头体再进一步裁剪pvs中看不见的多边形)1 双线程交换渲染将表示房间的多边形 物体或人物模型的多边形活跃的粒子运动的模型烟雾等等加入到了渲染队列中 组合到一起 将多边形进行从后往前的排序2光源部分-剩下的多边形其实就是一幁所要处理的图像所需要的数据了-在系统能够达到最大的多边形的阶段 细分多边形使得画面比较的逼真了再进行 backend后置阶段根据多边形对应的shader文件的参数来设置entity的物体的属性则对于幁缓存区进行操作-根据lod来适当了model的多边形增加多边形-》进行alpha测试这是为了画出透明的多边形这个使用的c函数中的qsort快速排序对不透明的多边形从前往后渲染从后往前对透明的多边形先渲染-增加动态面如果多边形是水波人物等则计算运动时水波运动物体表面的颜色加在物体的最终颜色之中,水波计算它的波动率而怪物则要根据更新动画来显示出来 在游戏中的比如闪烁的灯使用flare来进行 渲染了 -比较深度测试模板测试颜色测试,来对像素进行相应的调整了。对于纹理图片也是根据shader文件中的格式参数等等加载多边形相对应的bmp,jpg,tga等等图像进行加载根据纹理对应的混合参数进行对应的纹理混合方式使用多重贴图来保证贴图的质量然后再渲染阴影如平面阴影阴影体等等阴影也是根据幁缓存区的内容来生成的渲染天空使用这个brush上的sky天空纹理最后进行gamma修正等等渲染2D时 对投影方式进行改为正投影使得用于渲染2D的文字图片按钮之类例如生命值弹药数可能看起来有一些复杂但在实际过程上更为的复杂了。声音的处理上雷神之锤3主要使用的wav文件来进行播放音乐以上乃是一个比较相对简单的叙述对于整个的游戏运行很对内容其实是我五六年前写的
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻