cocos-creator / cocos-tutorial-hot-update Goto Github PK
View Code? Open in Web Editor NEWTutorial project for Cocos Creator hot update
License: Other
Tutorial project for Cocos Creator hot update
License: Other
const crypto = require('crypto')
const fs = require('fs')
const execSync = require('child_process').execSync
const filePath = process.argv[2]
const md5ByBinary = crypto.createHash('md5').update(fs.readFileSync(filePath, 'binary'))
.digest('hex');
const md5ByBuffer = crypto.createHash('md5').update(fs.readFileSync(filePath))
.digest('hex');
const cliMd5 = process.platform==='darwin' ?'md5':'md5sum'
console.log({filePath,md5ByBinary, md5ByBuffer})
console.log('\ncli:')
console.log(execSync(`${cliMd5} ${filePath}`).toString())
// in macos
node md5veify.js HelloWorld.png
{ filePath: 'HelloWorld.png',
md5ByBinary: 'a69a0b857f7462f4dd0d00bb5231a721',
md5ByBuffer: '55ea4e952bf080f300379ec26723598b' }
cli:
MD5 (HelloWorld.png) = 55ea4e952bf080f300379ec26723598b
Demo里:
checkCb方法有一行:this._checkListener = null;
请问有什么用呢
'SDKManager.h' file not found
你好,
不好意思,我還是Cocos Creator的新手
我嘗試要測試 Asset Manager 的工具
但使用Build 打包 Windows 版本後
native/package/ 這個路徑還是沒有檔案
但看到Version Generator 來生成 Manifest 檔案的指令會用到這個路徑的檔案
node version_generator.js -v 1.0.0 -u http://your-server-address/tutorial-hot-update/remote-assets/ -s native/package/ -d assets/
不知道是不是有什麼操作我不懂所以漏掉了?
然後看到要寫到 main.js 附加上搜尋路徑設定的邏輯和更新中斷修復程式碼 也改到 hot-update 插件中了
不是很清楚要怎麼操作才能產生用來Patch 的 Asset 的檔案
希望有簡易的SOP操作順序能方便照著做
再麻煩有空能更新一下教學了
感謝~
2.0.10版本不能正常公告,能修护一下?
Mac平台
here file main.js
`(function () {
function boot () {
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) {
var entries = rawAssets[mount];
var realEntries = realRawAssets[mount] = {};
for (var id in entries) {
var entry = entries[id];
var type = entry[1];
// retrieve minified raw asset
if (typeof type === 'number') {
entry[1] = assetTypes[type];
}
// retrieve uuid
realEntries[uuids[id] || id] = entry;
}
}
var scenes = settings.scenes;
for (var i = 0; i < scenes.length; ++i) {
var scene = scenes[i];
console.log('scene.url',scene.url)
if (typeof scene.uuid === 'number') {
scene.uuid = uuids[scene.uuid];
}
}
var packedAssets = settings.packedAssets;
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]];
}
}
}
}
// init engine
var canvas;
if (cc.sys.isBrowser) {
canvas = document.getElementById('GameCanvas');
}
if (false) {
var ORIENTATIONS = {
'portrait': 1,
'landscape left': 2,
'landscape right': 3
};
BK.Director.screenMode = ORIENTATIONS[settings.orientation];
initAdapter();
}
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.view.resizeWithBrowserSize(true);
if (!false && !false) {
// UC browser on many android devices have performance issue with retina display
if (cc.sys.os !== cc.sys.OS_ANDROID || cc.sys.browserType !== cc.sys.BROWSER_TYPE_UC) {
cc.view.enableRetina(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_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 / brwosers.
// 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;
}
}
// init assets
cc.AssetLibrary.init({
libraryPath: 'res/import',
rawAssetsBase: 'res/raw-',
rawAssets: settings.rawAssets,
packedAssets: settings.packedAssets,
md5AssetsMap: settings.md5AssetsMap
});
if (false) {
cc.Pipeline.Downloader.PackDownloader._doPreload("WECHAT_SUBDOMAIN", settings.WECHAT_SUBDOMAIN_DATA);
}
var launchScene = settings.launchScene;
// load scene
cc.director.loadScene(launchScene, null,
function () {
if (cc.sys.isBrowser) {
// show canvas
canvas.style.visibility = '';
var div = document.getElementById('GameDiv');
if (div) {
div.style.backgroundImage = '';
}
}
cc.loader.onProgress = null;
console.log('Success to load scene: ' + launchScene);
}
);
};
// jsList
var jsList = settings.jsList;
if (false) {
BK.Script.loadlib();
}
else
{
var bundledScript = settings.debug ? 'src/project.dev.js' : 'src/project.js';
if (jsList) {
jsList = jsList.map(function (x) {
return 'src/' + x;
});
jsList.push(bundledScript);
}
else {
jsList = [bundledScript];
}
}
// anysdk scripts
if (cc.sys.isNative && cc.sys.isMobile) {
// jsList = jsList.concat(['src/anysdk/jsb_anysdk.js', 'src/anysdk/jsb_anysdk_constants.js']);
}
var option = {
//width: width,
//height: height,
id: 'GameCanvas',
scenes: settings.scenes,
debugMode: settings.debug ? cc.DebugMode.INFO : cc.DebugMode.ERROR,
showFPS: (!false && !false) && settings.debug,
frameRate: 60,
jsList: jsList,
groupList: settings.groupList,
collisionMatrix: settings.collisionMatrix,
renderMode: 0
}
cc.game.run(option, onStart);
}
if (false) {
BK.Script.loadlib('GameRes://libs/qqplay-adapter.js');
BK.Script.loadlib('GameRes://src/settings.js');
BK.Script.loadlib();
BK.Script.loadlib('GameRes://libs/qqplay-downloader.js');
qqPlayDownloader.REMOTE_SERVER_ROOT = "";
var prevPipe = cc.loader.md5Pipe || cc.loader.assetLoader;
cc.loader.insertPipeAfter(prevPipe, qqPlayDownloader);
// <plugin script code>
boot();
return;
}
if (false) {
require(window._CCSettings.debug ? 'cocos2d-js.js' : 'cocos2d-js-min.js');
var prevPipe = cc.loader.md5Pipe || cc.loader.assetLoader;
cc.loader.insertPipeAfter(prevPipe, wxDownloader);
boot();
return;
}
if (window.cc && cc.sys.isNative) {
var hotUpdateSearchPaths = cc.sys.localStorage.getItem('HotUpdateSearchPaths');
console.log('hotUpdateSearchPaths',hotUpdateSearchPaths)
if (hotUpdateSearchPaths) {
jsb.fileUtils.setSearchPaths(JSON.parse(hotUpdateSearchPaths));
}
}
if (window.jsb) {
require('src/settings.js');
require('src/jsb_polyfill.js');
boot();
return;
}
if (window.document) {
var splash = document.getElementById('splash');
splash.style.display = 'block';
var cocos2d = document.createElement('script');
cocos2d.async = true;
cocos2d.src = window._CCSettings.debug ? 'cocos2d-js.js' : 'cocos2d-js-min.js';
var engineLoaded = function () {
document.body.removeChild(cocos2d);
cocos2d.removeEventListener('load', engineLoaded, false);
window.eruda && eruda.init() && eruda.get('console').config.set('displayUnenumerable', false);
boot();
};
cocos2d.addEventListener('load', engineLoaded, false);
document.body.appendChild(cocos2d);
}
})();
`
STACK:
[0]_onPreDestroy@src/jsb_polyfill.js:14188
[1]_onPreDestroy@src/jsb_polyfill.js:1751
[2]98.u._destroyImmediate@src/jsb_polyfill.js:11995
[3]_onPreDestroy@src/jsb_polyfill.js:14186
[4]_onPreDestroy@src/jsb_polyfill.js:1751
[5]98.u._destroyImmediate@src/jsb_polyfill.js:11995
[6]_onPreDestroy@src/jsb_polyfill.js:14186
[7]_onPreDestroy@src/jsb_polyfill.js:1751
[8]98.u._destroyImmediate@src/jsb_polyfill.js:11995
[9]_onPreDestroy@src/jsb_polyfill.js:14186
[10]_onPreDestroy@src/jsb_polyfill.js:1751
[11]98.u._destroyImmediate@src/jsb_polyfill.js:11995
[12]_onPreDestroy@src/jsb_polyfill.js:14186
[13]_onPreDestroy@src/jsb_polyfill.js:1751
[14]98.u._destroyImmediate@src/jsb_polyfill.js:11995
[15]s@src/jsb_polyfill.js:11892
[16]callback@src/jsb_polyfill.js:18235
E/jswrapper (519): [ERROR] (..\jswrapper\v8\Object.cpp, 519): Invoking function (09829418) failed!
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
D/jswrapper (125): JS: [ERROR]: Error 5000, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#5000 to see details.
E/jswrapper (267): ERROR: Uncaught TypeError: Cannot read property '_destroyImmediate' of null, location: src/jsb_polyfill.js:0:0
2017-10-27T09:22:29.555Z - normal: Initializing project /Users/XXXXX/creator/tutorial-hot-update
2017-10-27T09:22:29.559Z - normal: Loading packages
2017-10-27T09:22:29.574Z - normal: [Lua Support] version 1.1.6
2017-10-27T09:22:29.576Z - success: creator-lua-support loaded
2017-10-27T09:22:29.579Z - success: hot-update loaded
2017-10-27T09:22:29.579Z - normal: Watching packages
2017-10-27T09:22:29.628Z - normal: Run Application
2017-10-27T09:22:33.938Z - failed: [db-task][init] Failed to post import asset /Users/XXXXX/creator/tutorial-hot-update/assets/font/stake_number.fnt, message: TypeError: Cannot read property 'uuid' of undefined
at BitmapFontMeta.postImport (/Applications/CocosCreator.app/Contents/Resources/app.asar/editor/share/assets/meta/bitmap-font.js:1:1139)
at Async.series.e (/Applications/CocosCreator.app/Contents/Resources/app.asar/asset-db/lib/tasks.js:1:5804)
at /Applications/CocosCreator.app/Contents/Resources/app.asar/node_modules/async/lib/async.js:718:13
at iterate (/Applications/CocosCreator.app/Contents/Resources/app.asar/node_modules/async/lib/async.js:262:13)
at async.forEachOfSeries.async.eachOfSeries (/Applications/CocosCreator.app/Contents/Resources/app.asar/node_modules/async/lib/async.js:281:9)
at _parallel (/Applications/CocosCreator.app/Contents/Resources/app.asar/node_modules/async/lib/async.js:717:9)
at Object.async.series (/Applications/CocosCreator.app/Contents/Resources/app.asar/node_modules/async/lib/async.js:739:9)
at _postImportAsset (/Applications/CocosCreator.app/Contents/Resources/app.asar/asset-db/lib/tasks.js:1:5734)
at Async.eachLimit.Async.ensureAsync (/Applications/CocosCreator.app/Contents/Resources/app.asar/asset-db/lib/tasks.js:1:7544)
at /Applications/CocosCreator.app/Contents/Resources/app.asar/node_modules/async/lib/async.js:1213:16
2017-10-27T09:22:34.467Z - success: preview server running at http://localhost:7456
2017-10-27T09:22:39.903Z - normal: 1.6.2
请问这个稳定吗?
scene 下面只有一个 menu 场景, 游戏中 有table场景 相关的逻辑代码, 也有 图片资源,但是scene 下面没有 table.fire
版本1.8,1.9去除了cc.eventManager,请问check和update发出的事件名称是什么?
我用Nginx配置了一个文件下载服务器,manifest文件是可以下载下来的,但是下载热更资源的时候,就会报错,有的时候是 couldn't connect to server ,有的时候是,couldn't resolve host name,但是我manifest文件都下载下来了啊,都没有问题的,这个是为什么呢?
不是把文件都替换了吗,为啥还要设置搜索路径,不就是一份脚本文件吗,目录结构没变
热更新所有文件能正常下载,Update finished. 之后就黑屏出错。
我的引擎版本是2.1.1,但是在真机上一直显示this.manifestUrl.nativeUrl(在HotUpdate.js中)为undifined,请问这个值我该如何配置比较好,谢谢~
在有大量更新文件的情况下安卓设备会卡死,手动重启游戏就好了。这个问题一直存在
更新完成重新启动,点击检查更新按钮,发现还是可以找到更新版本。
再三确认提示更新完成,而不是更新失败。
查看设备内数据,发现storagePath目录下面没有任何东西。
var storagePath = ((jsb.fileUtils ? jsb.fileUtils.getWritablePath() : '/') + 'blackjack-remote-asset');
console.log('Storage path for remote asset : ' + storagePath);
但是在storagePath_temp目录下面有一个version文件。
logcat日志
http://url.cn/45RIvYP
creator版本1.4
开发环境windows
安卓机型 小米
升级到2.2.0版本后,在jsb.EventAssetsManager.UPDATE_PROGRESSION事件内获取event.getDownloadedBytes() 和 event.getTotalBytes() 接口都是错误的.
creator 2.1.2构建window项目,编译后运行界面黑的,并且 有错误提示
ERROR: Uncaught TypeError: Cannot read property 'length' of null, location: src/cocos2d-jsb.js:0:0
[ERROR] (d:\cocoscreator_2.1.2\resources\cocos2d-x\cocos\scripting\js-bindings\jswrapper\v8\object.cpp, 534): Invoking function (0D8D0740) failed!
怎么去自定义热更新的路径
如果遇到大版本更新,比如apk重新更新,如何重置缓存更新目录? 可以用 cc.sys.osVersion 和 cc.sys.osMainVersion 来控制吧?那是不是必须得在main.js里面添加控制逻辑
[Assets] Command failed: node version_generator.js ..
下一行有很多乱码
请问上面的写法是正确的吗?
详细的报错请看这里:
http://www.cocoachina.com/bbs/read.php?tid=1793137&page=1&toread=1#tpc
麻烦帮忙看一下,谢谢。
因为下载错误,我现在已经用downFile2Local的形式,已经能下载到文件了,但是我不知道怎么把缓存文件夹里面的文件覆盖到程序的文件夹啊。(我是在电脑上自带模拟器测试的,缓存地址是模拟器主程序目录下面的一个_temp文件夹,但是明显跟项目的路径差很远的,我不知道手机上会是是什么样子)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.