注意
并非真题,这是图灵托梦给我的题,仅供参考
有哪些知名游戏引擎?国内厂商为什么不自己开发游戏引擎?
游戏作为大热软件应用方向,其实现的根本需要引擎来支持。在介绍知名游戏引擎之前,首先需要解释什么是引擎。众所周知,游戏需要画面、任务、音效、物理模型等一系列操作,而这些较为底层的操作,在很多游戏中是没有很大差别的,比如原神中实现的人物移动和CS:GO中的人物移动显然没有差别。因此,为了避免重复造轮子,根据计算机的核心思想,我们就应当把这些底层的逻辑、实现抽离形成独立的库,这就是游戏引擎。
目前较为知名的游戏引擎有虚幻引擎(Unreal Engine)、Unity等,广泛适配了包括2D、3D等各种游戏类型。除了以上商业引擎外,也存在如Godot等开源引擎,Cocos等2D专用引擎。
接下来回答,为什么国内厂商不自己开发游戏引擎。这其实是一个反复造轮子的问题,对于一个现有的高质量的库,对其进行重发开发的时间收益并不大:开发一个3A游戏引擎需要实现海量的功能,因此需要极长的开发周期。进一步来说,引擎的收益来源一般是授权费,之前Unity更改收费模式之事闹得沸沸扬扬,正是游戏引擎开发公司逐利的表现。然而,进一步思考就可以看出,在引擎的开发过程中吗,由于无人使用,所以需要海量的资本投入而0产出,这对国内厂商的资金链是重大挑战,十分容易入不敷出,在开发完成前就倒闭。此外,由于Unity和UE等商业引擎使用人数众多,有了极多的文档和实践积累,也在不断的版本更迭中磨炼了兼容性、稳定性和异常处理机制。这对后来的开发者形成了进一步地吸引。综上从总利益平衡的角度考虑,自己开发游戏引擎是吃力不讨好的行为,使用商业引擎是一种符合商业逻辑的、理性的选择。
当然,国内厂商也没有就此止步,一些厂商也小范围地使用了自研引擎或魔改引擎,比如米哈游在《原神》中对Unity的ktcp、着色器等的魔改,用以提升性能;又如腾讯在《逆水寒》使用了自研的Messiah引擎。体现了国内厂商的折中思路:即不做大刀阔斧的创新,而针对一些需要提升的痛点进行针对化改善。
点击打开一个程序,计算机内部发生了什么
第一阶段:输入事件捕获与解析
-
硬件中断触发:鼠标双击的物理动作被鼠标控制器转换为数字信号,并通过总线(如USB)传送至计算机。随后,一个硬件中断请求 被发送到中央处理器。CPU会立即暂停当前正在执行的线程,保留其上下文状态,并转而执行预设的中断服务程序。
-
操作系统响应:ISR作为操作系统内核的一部分,被激活以处理该中断。它从鼠标驱动程序获取点击的坐标数据以及按键状态(如“双击”事件),并将该信息传递给操作系统的用户界面子系统(例如Windows的窗口管理器)。
-
目标识别:窗口管理器接收到坐标(X, Y)后,在其维护的窗口/控件层次结构中进行命中测试,确定该坐标点对应的UI元素——即被点击的应用程序快捷方式图标。
第二阶段:程序映像定位与加载
-
解析快捷方式:快捷方式文件(如Windows的
.lnk文件或Linux的.desktop文件)是一个包含目标程序路径、启动参数等元数据的引导文件。操作系统解析该文件,获取到目标可执行文件在存储设备(如硬盘、SSD)上的绝对路径(例如,C:\Program Files\CloudMusic\CloudMusic.exe)。 -
创建进程:操作系统通过系统调用(如Windows的
CreateProcess或Linux的forkfollowed byexec)为新程序创建一个空的进程。进程是系统进行资源分配和调度的基本单位,它拥有独立的虚拟地址空间和初始的执行上下文。 -
加载可执行文件:
- 操作系统中的加载器 根据解析出的路径,定位到存储在磁盘上的可执行文件。
- 它检查文件格式(如PE on Windows, ELF on Linux)的合法性与兼容性。
- 加载器为进程分配物理内存页,并将可执行文件的代码段(
.text)和数据段(.data,.bss)等关键部分映射到进程的虚拟地址空间中。此时,并非所有代码都被立即读入物理内存,而是利用了按需调页 机制,即当程序执行到特定代码时,若发现该页不在内存中,会触发页错误,再由操作系统从磁盘调入。
-
动态链接:绝大多数现代程序依赖于共享库(如Windows的DLL,Linux的
.so文件)。加载器会解析程序的导入表,定位所需的动态链接库,并将它们同样映射到进程的地址空间。链接器会完成符号解析与重定位,确保程序能正确调用库中的函数。
第三阶段:执行与用户交互
-
执行入口点:在完成所有初始化加载和链接后,CPU的程序计数器被设置为该程序的入口点(通常是
main或WinMain函数),进程中的主线程开始正式执行程序的代码。 -
初始化与窗口创建:
- 程序首先执行其初始化例程,包括初始化全局/静态变量、建立堆栈等。
- 随后,它通常会通过操作系统提供的API(如Windows API或Xlib/Wayland on Linux)创建应用程序窗口、注册消息处理函数,并进入消息循环。
-
进入事件驱动模式:从此,应用程序的生命周期由事件驱动。操作系统将用户的后续输入(如键盘键入、鼠标移动)封装为消息,并投递到应用程序的消息队列中。应用程序的消息循环不断从队列中取出消息,并分发给相应的窗口过程函数进行处理,从而实现与用户的持续交互。
在C程学习中你和其他同学合作完成任务,最后挂科了,应该怎么办?
草饲这些同学 没错以下是AI写的:
📚 分析挂科原因与制定应对策略
立即行动:成绩复核与沟通
- 联系课程教授,礼貌地询问挂科的具体原因,尤其是团队项目中的个人表现评价
- 申请成绩复核(如果学校有相关程序)
- 与团队成员坦诚交流,了解彼此对项目过程的看法
深入分析问题根源
挂科可能有多种原因,需要你客观评估:
| 可能原因 | 具体表现 | 解决方案 |
|---|---|---|
| 团队分工不均 | 部分成员承担过多或过少工作 | 未来合作前明确分工,定期检查进度 |
| 代码整合问题 | 个人部分完成但整体无法运行 | 学习使用Git等版本控制工具,增加集成测试 |
| 基础知识薄弱 | 即使完成分配任务,但理解不足 | 加强C语言核心概念学习,指针、内存管理等 |
| 考试表现不佳 | 项目完成但考试成绩差 | 调整学习策略,注重理论与实践结合 |
补救措施与未来规划
- 了解学校关于补考、重修的政策,立即制定复习计划
- 向优秀同学请教学习方法,特别是他们如何理解C语言难点
- 利用假期时间通过慕课、实践项目巩固编程能力
- 考虑组建学习小组,定期交流编程问题和学习心得
💻 提升C语言能力的具体建议
-
夯实基础:重新学习C语言核心概念,特别是你感到困难的部分。可以观看中国大学MOOC平台上翁恺老师的《C语言程序设计》课程。
-
独立编程:除了团队项目,确保自己有独立完成小程序的能力。从简单题目开始,逐步提升难度。
-
代码审查:请学长或助教查看你的代码,指出问题和改进方向。
-
实践平台:在PTA平台上刷题,巩固知识点。


