各位盒友好久不见! 这两个月没摸鱼,而是闭关手搓了一个 2D游戏引擎(造轮子真好玩) 的核心部分。今天不搞抽象的,纯技术向,带大家看看游戏背后的“发动机”是怎么运作的。
相信大家都玩过《黑神话》《艾尔登法环》这类神作,但3D引擎太复杂(我也不会写)咱们不讲,咱们从更简单的 2D引擎切入,用最直白的语言讲清楚——游戏到底是怎么跑起来的?
想象你玩《空洞骑士》:角色移动、怪物攻击、画面渲染、音效播放……这些看似独立的操作,其实全靠引擎在后台协调。类比汽车:引擎就像发动机,游戏逻辑是油门,渲染是车轮,物理系统是悬挂——缺一不可。什么!你说你不会开车?没吃过猪肉总见过猪跑吧
不过这么说是有道理的,首先我们作为人类作为感官动物最直觉的就是看到画面在变换,对于车辆你看到轮子在转动肯定是第一反应是这辆车在动,那么是什么让我们的“车”动起来的呢?毫无疑问是油门哒!你只需要给一脚油门,“车子”就神奇的动起来了,聪明的你肯定能想到是踩油门这动作告诉了“发动机”:“死机!快动啊!快动啊!”,然后“发动机”又去问“悬挂”系统:“这能跑吗?怎么跑呀?跑到哪?”,当“发动机”获取到悬挂系统的回复后最终传给“轮子”:“你转xxx圈,角度xxx”,这样一套流程就下来车辆就完成了一个小的周期,随后往复,就形成连贯的行驶,然后你就能倒车入库,半坡起步啦!(有错误请指出,也不是很懂车辆结构)
不过呢现实中车辆是机械结构是耦合的,联动的,在游戏里呢各个系统一般都被设计为各干各的,这被称为解耦,对于耦合系统呢这个很直观很符合直觉的设计不过呢有个非常严重的问题:那就是当我一个零件损坏了依赖此零件的一切结构都直接gg了,而且呢动一发而牵动全身,有过修车经验的小伙伴都知道发动机坏了还需要调教变速箱吧,而解耦系统呢,就是为了规避耦合系统的缺点,不过呢各个系统都是独立的,要怎么样才能沟通各个系统呢?
相信聪明的你也能想到:这不很简单吗?这不就和电话通信一样嘛,拨打电话时想基站发送信号:“我要给xxx打电话”,然后基站协调一下经过多个交换机就为你接通好了,不过有时候呢对方不想理你直接给你挂了。基于这个我们就可以实现一个中枢,多个节点的结构,这样我只要知道对方给我电话号码,我就能联系上他了,如果要发生直接的对话,我首先得知道对面的位置吧,然后咱俩约个时间来见一面来谈一谈,这样但凡地址时间变一下,我就被放鸽子了。不过也能看出解耦系统的弊端,原来明明可以直接传输消息,好比你和你朋友面对面可以直接交谈,但是呢非要用打电话交流,这样就会有中间商了,传输效率会比直接略低一点,而且很考验对中枢的设计。一个不小心延迟就高到起飞了。
咳咳扯远了,回到正题,我为什么要写游戏引擎呢?现成的unity,godot,ue这些引擎不香吗?干嘛自己写?首先写点个人原因,在两年前就有这个企划了,我艹!写一个游戏引擎,好酷(那时候还是高中生,比较中二)!不过就我个人而言,虽然自己写多半都会中道崩殂,放弃。不过只要写了就会对游戏开发有帮助,对现代引擎/软件架构更了解,也能对游戏mod开发有更深的理解。像我我在之前写了四五次了但是都放弃了,完成度远远不如这次,都是因为耦合度太高了根本无法扩展,就不了了之了,不过呢还是能从中学到不少知识的。
到这里我们导论部分结束了,最后贴一下我的引擎目前的成果:脚本系统(.net 9),物理系统,渲染系统,资源管理系统(仿照的unity的meta),这四个大模块已经实现,然后预制体,场景这些内容也已经过测试,功能正常,性能虽然不是一流但也差强人意(图4为性能测试 :1w实体动态刚体的连续碰撞)。
下一期预告:如何设计一个烧烧的架构
喜欢的hym可以点个关注哦~
![]()
![]()
![]()
![]()
更多游戏资讯请关注:电玩帮游戏资讯专区
电玩帮图文攻略 www.vgover.com
