找回密码
 立即注册
查看: 184|回复: 0

《 Minecraft 》为什么要以启动器的形式启动?

[复制链接]
发表于 2022-2-4 09:30 | 显示全部楼层 |阅读模式
泻药。
我是BMCL的作者
MC需要启动器的原因说到底只有一个,因为他是用Java写成的。
Java的运行需要JVM,但是JVM需要传入相应的参数才能让一个Java程序正确的运行。
举个简单的例子,网上下载得到的一个可执行的jar包,是不能像exe一样双击运行的。需要用命令行调用java -jar a.jar才能够执行,而启动器最核心的功能就是完成这个过程。
但是如果一个程序复杂到一定程度之后,是不可能一个jar搞定所有功能的,否则会有很复杂的依赖以及人员之间的协调成本,这种时候就需要将一个完整的程序拆成模块,各个模块之间可以按照一定的约定协同工作。
仔细看一些比较大的软件,比如QQ,除了一些exe以外还有大量的dll文件存在,这就是拆开后的结果。这种跑到Java下就会成为一个一个的jar包,但是Java允许jar包内嵌jar包解决依赖的问题。
然而实际上,如果将一个程序所需要的所有jar包全部打包起来,那么最终得到的jar包体积会非常恐怖,而且有一些软件的用户协议不允许这么打包,所以在启动阶段就需要加载许多jar包,开启一个Java程序的命令就会变成java -cp a.jar:b.jar:c.jar,需要一个一个将所用到的jar包列清楚。
这是MC启动器的最大的作用,也是 1.6版本之前的启动器主要在做的事情。
启动器要做的第二个事情,是确定JVM的内存大小。
JVM的全称是Java Virtual Machine,是jar的执行环境。正如名字所说,其原理简单来说是虚拟机,所以需要指定一个所占用的内存空间。尽管并不是必须的,因为JVM也会自行根据主机的环境确定一个范围,但是有些情况下是需要手工调优的,这个功能在很多启动器上也是有提供的。
之后在1.6这个版本上,Minecraft对启动器做了一次大的更新,启动器有了更多的事情要完成才能将MC成功的运行起来,简单对比一下更新前后的差距。
更新前最终MC启动器生成的命令行:
javaw.exe -Xincgc -Xmx1024M -XX:PermSize=64m -XX:MaxPermSize=128m -Dsun.java2d.noddraw=true -Dsun.java2d.pmoffscreen=false -Dsun.java2d.d3d=false -Dsun.java2d.opengl=false -cp C:\.minecraft\bin\minecraft.jar;C:\.minecraft\bin\lwjgl.jar;C:\.minecraft\bin\lwjgl_util.jar;C:\.minecraft\bin\jinput.jar -Djava.library.path=C:\.minecraft\bin\natives net.minecraft.client.Minecraft bangbang93
源码:
2dmmclauncher4th/Form1.cs at master · bangbang93/2dmmclauncher4th · GitHub这里面启动器提供的参数有
1、垃圾回收器
2、JVM内存(永久代和堆内存总大小)
3、lwjgl相关参数
4、mc所用到的jar文件
5、JNI文件,用于绘制图形界面
6、mc所在的主类(程序入口)
7、玩家名
更新后MC启动器最终生成的命令行


源码:
BMCL/Launcher.cs at master · bangbang93/BMCL · GitHub可以看到的是信息量已经完全不是同一个数量级了,其中最长的那段就是我上面说的不同的模块,除此之外还有
1、垃圾回收器
2、让Forge忽略自身文件被修改,否则无法兼容Optifine
3、JVM内存
4、JNI文件,用于绘制图形界面
5、最长的,模块
6、主类(程序入口)
7、玩家名
8、启动的版本
9、游戏路径
10、资源文件路径(没有声音和没有中文就是这个锅)
11、资源文件索引(上面问题也有可能是这个锅)
12、用户uuid,正版用户缺失这个参数会回退离线模式
13、accessToken,作用同上
14、userType
15、Forge的类入口
16、Forge标识
满足传递jvm参数的启动器,只是能用而已,会让游戏丢失很多功能,或者只能启动特定的一些版本。所以在1.6更新之后启动器还要做以下这些事情
(序号接上)
第三,资源文件管理
资源文件管理在1.6之前是MC游戏内部完成的,老玩家可能还记得,以前的版本如果出现声音异常,只需要F3+S,等一下MC就会完成声音文件的重新下载,在1.6上这一步由启动器完成了,启动器在启动前需要将所需要的声音和语言文件全部下载完毕,然后将索引文件交给MC,之后MC就能够正确加载声音和语言了(BMCL在这里为了能够快速启动,并没有强制要求下载完毕,而是启动游戏的同时开始下载,缺点是必须重启游戏才能够修复初次启动没有声音和汉语的问题)
第四,正版登录以及验证
其实老的启动器也是有正版登录的功能在的,但是和1.6完全不同的是,1.6的正版登陆叫做Yggdrasil,使用了新的验证方式,所以需要传入更多参数。老的启动器只需要在登录完成之后和离线模式一样的参数启动mc即可,但是新启动器就需要获取到玩家信息后传入accessToken和uuid,这么改是为了支持一个用户拥有多个角色和角色改名,尽管这两个功能在很久一段时间之后才上线。
第五,版本管理
旧的mc文件结构决定了一个启动器下只能对应一个版本,但是1.6启用的新文件结构可以让多个mc版本共存并且自由切换使用,并且下载功能也需要兼容多个mc版本,而且mc版本之间所依赖的文件也并不相同。
第六,依赖管理
依赖管理的结果就是启动参数最长的那一段,现在的mc使用了很多开源项目作为基础,必须把它们一同和mc加载,mc才能够正常运行,并且图形渲染部分是直接用C++完成的,所以这部分的文件管理也都交给了启动器,启动器必须能够区分不同版本所需要的不同的文件,有时候差一个版本号都会导致启动失败。
以上是新启动器的基础功能,此外还会有一些额外的功能
比如Forge下载或者是国内镜像下载点之类的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-6-1 17:52 , Processed in 0.091375 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表