88. 2023-11-26周总结

  1. Linux安装Unity问题
  2. 配置表热更

1. Linux安装Unity问题

我们打包机用的是Linux,Linux可以跑Unity,但因为官方对于Linux支持(特别是国内版本)不太够,整体使用起来没有Windows和Mac方便。

这次因为升级Unity版本,遇到比较多的问题:

  • unity hub问题
    通过国内的unity官网下载的rpm,安装的unity hub版本是3.1的(最新的已经是3.6了),这个版本的unity hub在linux下有bug,安装配套的Android平台组件没有执行权限,需要手动通过命令chmod +x加,这就会很麻烦,而且我也不知道要加哪些。

这里我尝试了几种方案:

  1. 通过ln -s命令链接到我们现有的2021.3.29f1c1的Android平台,但是编译会报错
  2. 通过这个网站下载海外版本的unity hub(这个版本是3.6的,修复了没有执行权限的bug),这个unity hub只能下载到不带2021.3.32f1的版本,继续通过ln -s命令链接Android 平台到2021.3.32f1c1,编译没有问题,但是运行报Unity Engine初始化失败
  3. 前面两种都行不通,最后通过写python脚本,对比2021.3.32f1 Android平台的所有文件,如果有可执行权限的,我给2021.3.32f1c1版本的也加上,完整代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # !/usr/bin/python

    import os

    a = set()
    def make_executable(path):
    mode = os.stat(path).st_mode
    mode |= (mode & 0o444) >> 2 # copy R bits to X
    os.chmod(path, mode)

    def walk(dir):
    for root, dirs, files in os.walk(dir):
    for name in files:
    if os.access(os.path.join(root, name), os.X_OK):
    print(name)
    a.add(name)

    def change(dir):
    for root, dirs, files in os.walk(dir):
    for name in files:
    if name in a:
    make_executable(os.path.join(root, name))
    print(os.path.join(root, name))

    walk("AndroidPlayer")

    change("AndroidPlayer2")
  • 显示器点不亮问题
    我们的Linux服务器怎么都点不亮显示器,各种命令,重启也都试过,就是不行,只能通过shell远程上去,这就遇到问题,unity hub之前都是界面操作的,不知道先做能不能通过命令行下载unity版本,搜了下是可以的,通过下面命令就能通过命令行安装unity
    1
    2
    export DISPLAY=:1
    /opt/unityhub/unityhub --headless install --version 2022.3.13f1c1 --module android --childModules

2. 配置表热更

我们客户端配置表做了一套跟随资源一起的热更的方案,但是策划觉得改个配置表还得打个热更包有点麻烦,想配置表单组都一套热更。

我们客户端的配置表热更主要问题是客户端配置表是代码和数据分离的方式,而且数据是走二进制配置表方案,所以代码和数据需要强依赖,但是现在只能更新数据,要考虑数据兼容性问题。

最后我们确定了方案:

  1. 数据由二进制改为csv格式,如果代码读不到数据(策划删除列)就使用默认值
  2. 进服务端的时候判断服务器的数据版本是否跟本地一致,不一致就下载服务器的数据到本地,并进行加载。为了加快下载速度,把所有csv压缩成一个zip包

这个过程中遇到几个问题:

  1. zip包每次导表都会变,即使配置表都一样的,这样导致每次md5都会不一样,原因是导表的时候csv每次都会被覆盖,导致文件时间修改了,而zip会记录文件修改时间,所有zip包每次都会修改。解决方案是在打成zip包之前,把所有的csv时间修改成一致,比如2023-1-1 0点。
  2. 配置表如何加密,因为我们用了zip包打包所有配置,所以直接使用zip自带加密来做,唯一的问题就是加载的时候需要浪费一点解压缩性能,但是我们测试发现加载比较耗时的是解析csv上,这里可以忽略。同时因为客户端只需要管理一个zip包即可,不需要管理散开的配置表文件,总体来说利大于弊吧。

还没有解决的问题:

  1. csv加载过慢,因为做了这个需求导致本来配置表加载在1s以内,现在需要3~4秒,还是比较耗时的,我们做了一些体验优化,但没解决根本问题。后续考虑用一种二进制和csv的结合方案来做,应该会加快一点性能。