从main开始理解cocos creator 的资源加载流 - pxqwxl/myLearnPoject GitHub Wiki

window.boot = function () { var settings = window._CCSettings; window._CCSettings = undefined;

if ( !settings.debug ) {
    var uuids = settings.uuids;

    var rawAssets = settings.rawAssets;
    var assetTypes = settings.assetTypes;
    var realRawAssets = settings.rawAssets = {};
    for (var mount in rawAssets) {     //rawAssets = {asserts = {"0":["xxx.png", 1], "1":["xxx.png", 0]}, internal = {"3": ["effects/builtin-2d-spine.effect", 2]}}
        var entries = rawAssets[mount]; // entries = rawAssets["asserts"] 
        var realEntries = realRawAssets[mount] = {}; // 
        for (var id in entries) {
            var entry = entries[id];     // ["xxx.png", 1]          
            var type = entry[1];
            // retrieve minified raw asset
            if (typeof type === 'number') {
                entry[1] = assetTypes[type];   //["cc.SpriteFrame", "cc.Texture2D", "cc.EffectAsset", "cc.Material"],
            }
            // retrieve uuid
            realEntries[uuids[id] || id] = entry;  // UUID:  uuids: ["b9a00xKVZE96voyZqEmxx0", "d8HsitJHxOYqo801xBk8ev"] 
                                                    //realEntries {"b9a00xKVZE96voyZqEmxx0":["xxx.png", "cc.Texture2D"]}  UUID中的key和 assets目录下的key对应
                                                    // key值是uuid 表中第一个是图片名称 第二个是图片存储类型

        }
    }

    var scenes = settings.scenes;  // [{ url: "db://assets/New Scene.fire",uuid: 2}]
    for (var i = 0; i < scenes.length; ++i) {   // 从uuid数组中取出对应uuid 生成新的scene配置
        var scene = scenes[i];
        if (typeof scene.uuid === 'number') {
            scene.uuid = uuids[scene.uuid];
        }
    }
    // scenes =  [{url: "db://assets/New Scene.fire",uuid: d8HsitJHxOYqo801xBk8ev}] 

    var packedAssets = settings.packedAssets;//  packedAssets: { "053c900b0": [1, 2, "9bvaMerUlDyary99mJa6xp"],"0fce1ecb6": [18, 19, 0, 20]},

    for (var packId in packedAssets) {      
        var packedIds = packedAssets[packId];
        for (var j = 0; j < packedIds.length; ++j) {  
            if (typeof packedIds[j] === 'number') {
                packedIds[j] = uuids[packedIds[j]];
            }
        }
    }
    //  packedAssets = { "053c900b0":[b9a00xKVZE96voyZqEmxx0, d8HsitJHxOYqo801xBk8ev,9bvaMerUlDyary99mJa6xp]}  每个包的id是"053c900b0" 对应包中的资源是数组内的uuid
    var subpackages = settings.subpackages;   //子包同理
    for (var subId in subpackages) {
        var uuidArray = subpackages[subId].uuids;
        if (uuidArray) {
            for (var k = 0, l = uuidArray.length; k < l; k++) {
                if (typeof uuidArray[k] === 'number') {
                    uuidArray[k] = uuids[uuidArray[k]];
                }
            }
        }
    }
}

function setLoadingDisplay () {
    // Loading splash scene
    var splash = document.getElementById('splash');
    var progressBar = splash.querySelector('.progress-bar span');
    cc.loader.onProgress = function (completedCount, totalCount, item) {
        var percent = 100 * completedCount / totalCount;
        if (progressBar) {
            progressBar.style.width = percent.toFixed(2) + '%';
        }
    };
    splash.style.display = 'block';
    progressBar.style.width = '0%';

    cc.director.once(cc.Director.EVENT_AFTER_SCENE_LAUNCH, function () {
        splash.style.display = 'none';
    });
}

var onStart = function () {
    cc.loader.downloader._subpackages = settings.subpackages; //下载子包功能 赋值

    cc.view.enableRetina(true);
    cc.view.resizeWithBrowserSize(true);

    if (cc.sys.isBrowser) {
        setLoadingDisplay();
    }

    if (cc.sys.isMobile) {
        if (settings.orientation === 'landscape') {
            cc.view.setOrientation(cc.macro.ORIENTATION_LANDSCAPE);
        }
        else if (settings.orientation === 'portrait') {
            cc.view.setOrientation(cc.macro.ORIENTATION_PORTRAIT);
        }
        cc.view.enableAutoFullScreen([
            cc.sys.BROWSER_TYPE_BAIDU,
            cc.sys.BROWSER_TYPE_BAIDU_APP,
            cc.sys.BROWSER_TYPE_WECHAT,
            cc.sys.BROWSER_TYPE_MOBILE_QQ,
            cc.sys.BROWSER_TYPE_MIUI,
        ].indexOf(cc.sys.browserType) < 0);
    }

    // Limit downloading max concurrent task to 2,
    // more tasks simultaneously may cause performance draw back on some android system / browsers.
    // You can adjust the number based on your own test result, you have to set it before any loading process to take effect.
    if (cc.sys.isBrowser && cc.sys.os === cc.sys.OS_ANDROID) {
        cc.macro.DOWNLOAD_MAX_CONCURRENT = 2;
    }

    function loadScene(launchScene) {
        cc.director.loadScene(launchScene,
            function (err) {
                if (!err) {
                    if (cc.sys.isBrowser) {
                        // show canvas
                        var canvas = document.getElementById('GameCanvas');
                        canvas.style.visibility = '';
                        var div = document.getElementById('GameDiv');
                        if (div) {
                            div.style.backgroundImage = '';
                        }
                    }
                    cc.loader.onProgress = null;
                    console.log('Success to load scene: ' + launchScene);
                }
                else if (CC_BUILD) {
                    setTimeout(function () {
                        loadScene(launchScene);
                    }, 1000);
                }
            }
        );

    }

    var launchScene = settings.launchScene;

    // load scene
    loadScene(launchScene);

};

// jsList
var jsList = settings.jsList;

var bundledScript = settings.debug ? 'src/project.dev.js' : 'src/project.17bbe.js'; 
if (jsList) {
    jsList = jsList.map(function (x) {
        return 'src/' + x;
    });
    jsList.push(bundledScript);
}
else {
    jsList = [bundledScript];
}

var option = {
    id: 'GameCanvas',
    scenes: settings.scenes,
    debugMode: settings.debug ? cc.debug.DebugMode.INFO : cc.debug.DebugMode.ERROR,
    showFPS: settings.debug,
    frameRate: 60,
    jsList: jsList,
    groupList: settings.groupList,
    collisionMatrix: settings.collisionMatrix,
};

// init assets
cc.AssetLibrary.init({
    libraryPath: 'res/import',
    rawAssetsBase: 'res/raw-',
    rawAssets: settings.rawAssets,
    packedAssets: settings.packedAssets,
    md5AssetsMap: settings.md5AssetsMap,
    subpackages: settings.subpackages
});

cc.game.run(option, onStart);

};

if (window.jsb) { var isRuntime = (typeof loadRuntime === 'function'); if (isRuntime) { require('src/settings.2f9d8.js'); require('src/cocos2d-runtime.js'); if (CC_PHYSICS_BUILTIN || CC_PHYSICS_CANNON) { require('src/physics.37b5c.js'); } require('jsb-adapter/engine/index.js'); } else { require('src/settings.2f9d8.js'); require('src/cocos2d-jsb.64735.js'); if (CC_PHYSICS_BUILTIN || CC_PHYSICS_CANNON) { require('src/physics.37b5c.js'); } require('jsb-adapter/jsb-engine.js'); }

cc.macro.CLEANUP_IMAGE_CACHE = true;
window.boot();

}