乐趣区

关于typescript:游戏开发性能优化之对象池

前言

  1. 在这里,我遇到的问题是:游戏包超过 4m,并且小于等于 8M,不须要近程资源服务器,应用分包即可。
  2. Creator 推出了 2.4 版本,使得全平台都有了分包治理的能力,其实这句话我说的不够谨严,对于头条来说,这个 AssetBundle 就有些难堪了。如果将 bundle 放入 resource 目录下打包微信小游戏报错


因为咱们公布头条小游戏根本都是通过微信小游戏批改后上线,然而头条小游戏是不反对分包加载的,只能把资源都放到 resource 下,这岂不是难堪了吗?

我想到的计划

打包头条小游戏的时候还是须要先打微信包,只是在打包之前须要将之前设置的 AssetBudle 目录设置为一般目录,而后将资源包放回 resource 中。而后打其余包的时候再将 Bundle 文件夹从 resource 目录中拿进去。

公布步骤

  1. 敞开 Creator,将所有 bundle 目录及批改后的 meta 文件挪动到 resource 目录下并删除所有 bundle 目录及 meta 文件。
  2. 关上 Creator 批改代码逻辑,不应用引擎的 AssetBundle,这一部分通过我的 sdk 整合框架 + 我的 AssetBundle 应用形式很容易做到,这一步其实在切换平台的时候就实现了。
  3. 应用 Creator 公布微信小游戏,用头条开发者工具调试公布上线。
  4. 敞开 Creator 运行另脚本将 resource 下的所有 bundle 目录及批改后的 meta 文件再拷贝到 resource 外,并删除 resource 中的所有 bundle 目录及 meta 文件。
  5. 关上 Creator 公布其余渠道。

要害脚本

var fs = require('fs');
var path = require('path');
var file_util = require('./file_util')
// 须要被挪动到 resource 下的 bundle。var folderList = ['lobby','decoration','outdoor']
// 源目录
var asset_path = process.argv[2];
// 目标目录
var export_dir = process.argv[3];
// 是否是 bundle 1 和 0
var opt = process.argv[4];

function getBundleName(name){for(var i = 0; i < folderList.length; i ++){let s = folderList[i]
        if(name.indexOf(s) >= 0){return s;}
    }
    return null;
}

function setBundle(meta_name,opt){console.log('meta_name',meta_name,'opt',opt)
    var flag = opt == '1' ? true : false;
    console.log('flag',flag)
    let fileData = file_util.readFile(meta_name)
    if(fileData){var obj = JSON.parse(fileData);
        obj['isBundle'] = flag
        console.log('fileData 2222',JSON.stringify(obj))
        file_util.writeFile(meta_name,JSON.stringify(obj))
    }
}


function exchangeFiles(asset_path,export_dir,opt) {var stat = fs.statSync(asset_path);
    if (!stat.isDirectory()) {return;}
    var subpaths = fs.readdirSync(asset_path),
        subpath;
    for (var i = 0; i < subpaths.length; ++i) {if (subpaths[i][0] === '.') {continue;}
        subpath = path.join(asset_path, subpaths[i]);
        console.log("subpath", subpath);
        var fname = getBundleName(subpath)
        if(fname){stat = fs.statSync(subpath);
            if (stat.isDirectory()) {let dest_path = path.join(export_dir,fname) 
                file_util.mkdir(dest_path)
                file_util.copyDir(subpath,dest_path)
                file_util.delDir(subpath)        
            }else{
                var meta_name = subpath
                var exportMeta_name = path.join(export_dir,fname)+'.meta'
                setBundle(meta_name,opt)
                file_util.copyFile(meta_name,exportMeta_name)
                file_util.deleteFile(meta_name)
            }
        }
    }
}
exchangeFiles(asset_path,export_dir,opt)

结语

以上是我在应用 Creator2.4 版本公布头条小游戏时遇到的问题及解决方案。计划可能那个有点蠢笨,然而心愿对遇到同样问题的小伙伴有所帮忙,也心愿如果哪位小伙伴有更好的解决方案能够分享进去。
如需残缺脚本,请进入公众号回复”公布头条“获取网盘链接。

欢送扫码关注公众号《微笑游戏》,浏览更多内容。如果您感觉文章还能够,点赞、在看、分享、资助都是对我最大的激励,在下将感激不尽。

欢送扫码关注公众号《微笑游戏》,浏览更多内容。

退出移动版