no message
This commit is contained in:
@@ -12,13 +12,16 @@ const zlib = require('zlib');
|
||||
const { execSync } = require('child_process');
|
||||
const {
|
||||
patchPreloadSettings,
|
||||
patchSplashSettings,
|
||||
printPackageReport,
|
||||
minifyLevelsDatabase,
|
||||
brotliCompressFile,
|
||||
brotliCompressWebglBundles,
|
||||
formatBytes,
|
||||
} = require('./package-optimize');
|
||||
const { listRuntimeFiles, assertRuntimePack } = require('./runtime-pack');
|
||||
const { splitLevelBundles } = require('./split-level-bundles');
|
||||
const { splitLevelsDatabase } = require('./split-levels-database');
|
||||
|
||||
const buildDir = path.resolve(process.argv[2]);
|
||||
const outDir = path.resolve(process.argv[3]);
|
||||
@@ -83,9 +86,11 @@ function attachLevelsDatabase(outDir) {
|
||||
console.warn('>>> 警告: 未找到 levels-database.json');
|
||||
return;
|
||||
}
|
||||
splitLevelsDatabase(levelsDbSrc, outDir);
|
||||
|
||||
const levelsDbDst = path.join(outDir, 'levels-database.json');
|
||||
const { before, after } = minifyLevelsDatabase(levelsDbSrc, levelsDbDst);
|
||||
console.log(`>>> levels-database.json 压缩: ${formatBytes(before)} → ${formatBytes(after)}`);
|
||||
console.log(`>>> levels-database.json (legacy 回退): ${formatBytes(before)} → ${formatBytes(after)}`);
|
||||
const { raw, br } = brotliCompressFile(levelsDbDst, path.join(outDir, 'levels-database.json.br'));
|
||||
console.log(`>>> levels-database.json.br: ${formatBytes(raw)} → ${formatBytes(br)}`);
|
||||
}
|
||||
@@ -139,6 +144,56 @@ function patchMainIndexForSplitLoad(mainIndexPath) {
|
||||
}
|
||||
let s = fs.readFileSync(mainIndexPath, 'utf8');
|
||||
const rules = [
|
||||
{
|
||||
desc: 'AppBootstrap: 首屏只 loadLevelDatabase + bounds',
|
||||
old: 'yield I(),yield _(),yield E(),yield A(),L(),yield D.preload();',
|
||||
neu: 'yield A(),L();',
|
||||
},
|
||||
{
|
||||
desc: 'GameController: 进关前按需拉 assets / 关卡库分片',
|
||||
old: 'if(!this.creating){this.creating=!0;var t=R(e);',
|
||||
neu: 'if(!this.creating){this.creating=!0;try{if(globalThis.__tfrhEnsureAssetsCore)yield globalThis.__tfrhEnsureAssetsCore();yield I(),yield _(),yield E();if(globalThis.__tfrhEnsureLevelDbShard)yield globalThis.__tfrhEnsureLevelDbShard(e);}catch(err){console.error("[GameController] 运行时资源加载失败",err),this.creating=!1;return}var t=R(e);',
|
||||
},
|
||||
{
|
||||
desc: 'LevelDatabase: 分片索引模式 isReady',
|
||||
old: 'isLevelDatabaseReady:function(){return null!==s}',
|
||||
neu: 'isLevelDatabaseReady:function(){return null!==s||("undefined"!=typeof window&&!!window.__tfrhLevelsDbIndex)}',
|
||||
},
|
||||
{
|
||||
desc: 'LevelDatabase: 启动读 index 而非全量库',
|
||||
old: 'try{if("undefined"!=typeof window&&window.__tfrhLevelsDatabaseJson)',
|
||||
neu: 'try{if("undefined"!=typeof window&&window.__tfrhLevelsDbIndex){s={version:window.__tfrhLevelsDbIndex.version||2,levels:{}},console.log("[LevelDatabase] 已加载索引 "+window.__tfrhLevelsDbIndex.total+" 关");return}if("undefined"!=typeof window&&window.__tfrhLevelsDatabaseJson)',
|
||||
},
|
||||
{
|
||||
desc: 'LevelDatabase: validate 接受 index',
|
||||
old: 'function w(){var e=c.length,n=null!=(t=c[0])?t:0;if(e<100||n<a)throw new Error',
|
||||
neu: 'function w(){if("undefined"!=typeof window&&window.__tfrhLevelsDbIndex){var e=window.__tfrhLevelsDbIndex;if(e.total<100||e.min<a)throw new Error("关卡库索引过旧 ("+e.total+" 关)");return}var e=c.length,n=null!=(t=c[0])?t:0;if(e<100||n<a)throw new Error',
|
||||
},
|
||||
{
|
||||
desc: 'LevelRegistry: min/max 读 index',
|
||||
old: 'function f(){return c()?d():t}function E(){return c()?I():t}',
|
||||
neu: 'function f(){var e="undefined"!=typeof window&&window.__tfrhLevelsDbIndex;return e?e.min:c()?d():t}function E(){var e="undefined"!=typeof window&&window.__tfrhLevelsDbIndex;return e?e.max:c()?I():t}',
|
||||
},
|
||||
{
|
||||
desc: 'LevelRegistry: hasLevel 读 index 范围',
|
||||
old: 'hasLevel:function(e){return v(e)}',
|
||||
neu: 'hasLevel:function(e){if(v(e))return!0;var n="undefined"!=typeof window&&window.__tfrhLevelsDbIndex;return!!n&&e>=n.min&&e<=n.max}',
|
||||
},
|
||||
{
|
||||
desc: 'LevelDatabase: getLevelConfig 读 loader 分片',
|
||||
old: 'getLevelConfig:function(e){var n;return null!=(n=f[e])?n:null}',
|
||||
neu: 'getLevelConfig:function(e){var n;if(null!=(n=f[e]))return n;var t="undefined"!=typeof window&&window.__tfrhLevelsDatabaseJson&&window.__tfrhLevelsDatabaseJson.levels;return t&&t[String(e)]||null}',
|
||||
},
|
||||
{
|
||||
desc: 'GameController: 使用 loader 全局 loadLevelPrefab hook (新构建 K)',
|
||||
old: 'var l,r=yield K(i);',
|
||||
neu: 'var l,r=yield(globalThis.__tfrhLoadLevelPrefab||K)(i);',
|
||||
},
|
||||
{
|
||||
desc: 'GameController: 使用 loader 全局 loadLevelPrefab hook (旧构建 z)',
|
||||
old: 'var l,r=yield z(i);',
|
||||
neu: 'var l,r=yield(globalThis.__tfrhLoadLevelPrefab||z)(i);',
|
||||
},
|
||||
{
|
||||
desc: 'AppBootstrap: 首关前不 preload UI 贴图',
|
||||
old: 'yield h.preload(),yield O.preload()',
|
||||
@@ -256,10 +311,14 @@ patchText(path.join(scenesStage, 'src', 'settings.json'), (t) => {
|
||||
j.assets = j.assets || {};
|
||||
j.assets.server = '';
|
||||
patchPreloadSettings(j, { preloadResources: false, preloadLevelPrefabs: false });
|
||||
patchSplashSettings(j, { stripSplashAssets: true });
|
||||
return JSON.stringify(j);
|
||||
});
|
||||
|
||||
zipDir(scenesStage, path.join(webglDir, BUNDLE.scenesAll));
|
||||
const scenesZip = path.join(webglDir, BUNDLE.scenesAll);
|
||||
const scenesBr = brotliCompressFile(scenesZip, scenesZip + '.br');
|
||||
console.log(`>>> ${BUNDLE.scenesAll}.br: ${formatBytes(scenesBr.raw)} → ${formatBytes(scenesBr.br)}`);
|
||||
|
||||
// —— 3a. assets_all:核心资源(不含 level-prefabs)——
|
||||
// 默认分包;MERGE_LEVELS=1 时合并 level-prefabs 进 assets_all(不推荐)
|
||||
@@ -299,6 +358,8 @@ if (fs.existsSync(path.join(scenesStage, 'src', 'effect.bin'))) {
|
||||
const assetsCoreZip = path.join(webglDir, BUNDLE.assetsAll);
|
||||
zipDir(assetsCoreStage, assetsCoreZip);
|
||||
console.log(`>>> assets_core (assets_all): ${formatBytes(fs.statSync(assetsCoreZip).size)}`);
|
||||
const assetsBr = brotliCompressFile(assetsCoreZip, assetsCoreZip + '.br');
|
||||
console.log(`>>> ${BUNDLE.assetsAll}.br: ${formatBytes(assetsBr.raw)} → ${formatBytes(assetsBr.br)}`);
|
||||
|
||||
// —— 3b. 每关独立 bundle + levels-manifest.json ——
|
||||
const levelPrefabsSrc = path.join(buildDir, 'assets', 'level-prefabs');
|
||||
@@ -312,6 +373,8 @@ if (!MERGE_LEVELS) {
|
||||
patchCatalogRemoveLevelsBundle(path.join(aaDir, 'catalog.json'));
|
||||
const manifestPath = path.join(aaDir, 'levels-manifest.json');
|
||||
levelPackStats = splitLevelBundles(levelPrefabsSrc, webglDir, manifestPath, tmp);
|
||||
const brStats = brotliCompressWebglBundles(webglDir);
|
||||
console.log(`>>> bundle Brotli: ${brStats.count} 个, 节省 ${formatBytes(brStats.saved)}`);
|
||||
}
|
||||
|
||||
attachLevelsDatabase(outDir);
|
||||
@@ -343,7 +406,14 @@ rmrf(standaloneDir);
|
||||
mkdirp(standaloneDir);
|
||||
copyFile(path.join(unityRef, 'index.html'), path.join(standaloneDir, 'index.html'));
|
||||
copyDir(path.join(unityRef, 'TemplateData'), path.join(standaloneDir, 'TemplateData'));
|
||||
for (const item of ['Build', 'StreamingAssets', ...['levels-database.json', 'levels-database.json.br']]) {
|
||||
for (const item of [
|
||||
'Build',
|
||||
'StreamingAssets',
|
||||
'levels-database.json',
|
||||
'levels-database.json.br',
|
||||
'levels-db-index.json',
|
||||
'levels-db-index.json.br',
|
||||
]) {
|
||||
const src = path.join(outDir, item);
|
||||
const dst = path.join(standaloneDir, item);
|
||||
if (!fs.existsSync(src)) continue;
|
||||
@@ -372,6 +442,6 @@ for (const p of requiredBundles) {
|
||||
|
||||
const preloadNote = MERGE_LEVELS
|
||||
? 'scenes ∥ assets_all 合并包 (MERGE_LEVELS=1)'
|
||||
: `scenes ∥ assets_core 首屏;关卡包进关按需 (${levelPackStats ? levelPackStats.packed : '?'} 关)`;
|
||||
: `scenes ∥ assets_core 首屏(引擎启动必需);关卡库分片 + 关卡 bundle 进关按需 (${levelPackStats ? levelPackStats.packed : '?'} 关)`;
|
||||
console.log('\n完成。运行时包 → 本地 import-to-unity.sh / OSS unitycdndir(同一目录)');
|
||||
printPackageReport(outDir, { preloadNote });
|
||||
|
||||
Reference in New Issue
Block a user