从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();
}