Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] 基于符号链接的多客户端共存方案 #749

Open
Scighost opened this issue Apr 3, 2024 · 7 comments
Open

[Feature] 基于符号链接的多客户端共存方案 #749

Scighost opened this issue Apr 3, 2024 · 7 comments

Comments

@Scighost
Copy link
Owner

Scighost commented Apr 3, 2024

感谢 @AbyssMorax 提出的建议 DGP-Studio/Snap.Hutao#1524

部分玩家有同时游玩中国官服和国际服的需求,针对转换客户端的功能,Starward 前后推出了两个方案:一是修复客户端的全部文件,优点是保证了客户端的完整性,缺点是每次转换需要验证全部文件、下载 0.7GB 的资源文件;二是仅修改两客户端中存在差异的文件,并且在本地缓存这部分文件,解决了前者的缺点,但转换过程操作繁琐。而基于符号链接的客户端共存方案与上两个方案不同,无需转换文件的步骤,操作简单,仅需额外占用少量的存储空间。

以原神为例,4.5 版本本体+汉语语音包总计大小 84.9GB,绝大多数相同的文件集中在 StreamingAssets 文件夹中,仅这个文件夹就有 83.3GB。如果把此文件夹符号链接,那么能以不到 2GB 的存储空间为代价安装另一个客户端。

实现这个功能的过程中需要考虑以下要点,涉及到功能本身、用户提醒、符号链接技术等:

  • 首次定位/安装游戏时的步骤和之前相同
  • 如果检测到已安装大陆官服,切换页面到国际服时,左下角的安装键应替换为更明显的提示
  • 尝试安装第二个客户端时应提醒玩家此功能的存在,以简单易懂的语言解释此功能;玩家也应该有选择完整安装另一客户端的选择项
  • 使用符号链接时,StreamingAssets 文件夹本体保留在原位置,还是移动到游戏文件夹之外单独存储?
  • 游戏预下载时,两客户端的预下载资源有很大一部分重复,但是不能仅下载非重复部分(不能吗?),需要解决好多客户端预下载的重复问题
  • 某一客户端更新后,另一客户端的 StreamingAssets 文件夹内外的版本不一致,但按正常的更新流程会下载很多不必要的文件,需要在此文件夹内新增 config.ini 做好版本记录
  • StreamingAssets 移动到游戏文件夹之外,卸载某一客户端后,此文件夹应移回游戏文件夹内
  • 不移动 StreamingAssets 时,当玩家手动删除包含此文件夹本体的游戏文件夹时,另一客户端是否仍然可用?
  • StreamingAssets 的父文件夹被移动,符号链接是否会被破坏?

实现此功能后,现有的转换客户端的功能会被移除。

@Scighost Scighost changed the title [Enhancement] 基于符号链接的多客户端共存方案 [Feature] 基于符号链接的多客户端共存方案 Apr 3, 2024
@Scighost
Copy link
Owner Author

Scighost commented Apr 3, 2024

坏消息是原的 StreamAssets\20527480.blk 文件在两服之间存在差异,和账号登录有关;铁也有部分文件存在差异,并且分布在不同文件夹中,所以上述仅链接 StreamAssets 的方案不可行。

考虑另一种方案,把首次安装的游戏客户端称为主客户端,同游戏不同服务器的其他客户端称为从客户端(暂且这样命名)。主客户端的安装更新流程都按照正常流程处理,从客户端安装时仅下载差异文件,其他的相同文件使用单文件硬链接的方式链接到主客户端对应的文件;从客户端禁用预下载、更新流程,在主客户端更新期间完成从客户端的更新。此方案不影响单客户端的正常使用和更新,也能和官方启动器兼容。

同样的,也有一些问题需要考虑:

  • 同上
  • 大量文件的硬链接是否会影响性能
  • 如何解决两客户端同时更新时国际服资源的网络连接不稳定的问题

铁道的本地化音频资源没有 pkg_version 给出校验信息,暂时不能实现此功能。

@starward-bot

This comment was marked as spam.

@gottyduke
Copy link

大量文件的硬链接是否会影响性能

@Scighost
不需要考虑符号链接/硬链接对于性能的影响, 至少游戏内其他所有的性能开销都会比解析符号链接高, 具体可以参考Nexusmods的mod管理器Vortex, 其使用符号链接部署mod文件.

@starward-bot
Copy link

starward-bot bot commented Apr 17, 2024

@AbyssMorax deleted the following comment
published at 2024-04-04 21:19:34 +00:00
updated at 2024-04-05 09:56:06 +00:00

https://github.com/AbyssMorax/GenshinImapctStarter/tree/master
已实现基本功能及命令行交互

@starward-bot
Copy link

starward-bot bot commented Apr 17, 2024

@AbyssMorax deleted the following comment
published at 2024-04-04 15:43:48 +00:00
updated at 2024-04-05 04:42:49 +00:00

@Scighost
问题说明(在完全使用starward情况下,不包含官方启动器):
1.StreamingAssets建议放在主游戏目录,更新主游戏时可以像原来一样,不需要额外的代码
2.游戏预下载如上一次所述,仅下载主游戏预更新包即可,其他子区服游戏更新须由开发人员自制更新包(如资源替换一样)
3.版本记录可选,建议starward一起更新主游戏和其他子区服游戏,保证所有资源版本统一
4.符号链接基于路径,所以StreamingAssets移动会影响符号链接
5.若玩家删除了主游戏,则应当选择另一个区服为主游戏,将原先的符号链接删除,并把StreamingAssets移动至后者
6.因为链接的只是相同的文件,所以每个游戏区的文件都为自己本身并与其他区服共存,StreamingAssets只占用一份,因此,若用户想要完整安装多个客户端,可以通过简单的复制粘贴完成,可以大幅缩小因国际服网络问题而下载速度慢的问题
7.在我的代码中,dirlink和filelink包含了StreamingAssets下各文件夹和文件的路径,除blk文件之外,所以blk事实上为每个区服自己的文件,blk也应该包含在开发人员制作的更新包中
8.符号链接性能探究,若符号链接不多层链接,在我的方案中(链接了StreamingAssets下多个文件),对比了多次场景加载时长,没有差别,本人电脑配置不高,内存仅8G,运行时占用率高达90%
9.国际服更新已给出方案,须由开发人员自制更新包(差异文件,不包括主体文件),国际服不需要下载资源(若本地已有国服客户端),可以直接复制

@starward-bot
Copy link

starward-bot bot commented Apr 17, 2024

@AbyssMorax deleted the following comment
published at 2024-04-04 06:54:25 +00:00
updated at 2024-04-04 06:54:25 +00:00

1.StreamAssets下仅有20527480.blk和APMConfig.json不同,后者的不同仅在区服说明,那么是否可以链接除这两个文件之外的文件和文件夹
2. .blk是打包文件,类似于unity中的assetbundle,我是在最近才仔细查看原神目录结构,不知道20527480.blk是否会变换名字,若不变换名字,则可以采用1点所说的方法
3. 要了解StreamAssets的游戏版本,可以查看其asb_settings.json文件来确定(此文件明文说明了版本,游戏增量包中更新了此文件)
5. 因本人没有之前游戏版本文件,以上所述仅根据已有情况概括和猜测,但希望有所帮助

@Scighost
Copy link
Owner Author

Scighost commented Jul 30, 2024

原神在校验时首先会检查文件信息中的大小,符号链接无法通过这种校验,进入游戏后会重新下载全部文件,改为使用硬链接实现此功能。

https://github.com/Scighost/Starward/releases/tag/0.12.2-preview.1

Genshin Impact Screenshot 2024 08 13 - 13 32 49 31

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants