游戏中在线加载一张图片(比如玩家头像),想保存在本地,并为这张图片生成一个唯一ID或MD5,下次启动的时候,就可以从本地读取数据生成对应的精灵。
目前只想到用cc.sys.localStorage实现,但是它只能存取字符串,这就涉及到图片跟字符串的互转难题。
不知道各位大神有没有可行的办法:
3赞
图片可以用 base64 字符串来存储,但是非常不建议用 localStorage 存储这种数据,因为它的设计不适合这么做。
建议不要在本地保存任何大尺寸数据,存储在服务器上更适合。
2赞
存储在本地主要是为了节省带宽,以及提高加载速度,增强游戏体验。
除了localStorage ,有没有别的方式存储在本地
浏览器本身是有缓存的,只要 url 保持不变,其实并不会每次加载都下载所有内容,个人觉得过于极端的优化意义不大
如果是浏览器端的话,的确问题不大,然而原生平台上,我记得应该是没有缓存的吧。
想这么极端的优化,一方面是因为项目功能需要,支持玩家间聊天互传图片,而且项目会发布到原生平台;
另一方面是个人的强迫症,能做的更好的就会尽力去实现……
本地存储完全没问题
loadNative = function(url, callback){
var dirpath = jsb.fileUtils.getWritablePath() + 'img/';
var filepath = dirpath + MD5(url) + '.png';
function loadEnd(){
cc.loader.load(filepath, function(err, tex){
if( err ){
cc.error(err);
}else{
var spriteFrame = new cc.SpriteFrame(tex);
if( spriteFrame ){
spriteFrame.retain();
callback(spriteFrame);
}
}
});
}
if( jsb.fileUtils.isFileExist(filepath) ){
cc.log('Remote is find' + filepath);
loadEnd();
return;
}
var saveFile = function(data){
if( typeof data !== 'undefined' ){
if( !jsb.fileUtils.isDirectoryExist(dirpath) ){
jsb.fileUtils.createDirectory(dirpath);
}
if( jsb.fileUtils.writeDataToFile( new Uint8Array(data) , filepath) ){
cc.log('Remote write file succeed.');
loadEnd();
}else{
cc.log('Remote write file failed.');
}
}else{
cc.log('Remote download file failed.');
}
};
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
cc.log("xhr.readyState " +xhr.readyState);
cc.log("xhr.status " +xhr.status);
if (xhr.readyState === 4 ) {
if(xhr.status === 200){
xhr.responseType = 'arraybuffer';
saveFile(xhr.response);
}else{
saveFile(null);
}
}
}.bind(this);
xhr.open("GET", url, true);
xhr.send();
};
22赞
真心赞!
请你吃
您解决了吗?我现在也遇到这个问题。要把远程的图片保存到本地文件,方便下次读取
你好,我用你这个方法,提示失败Remote write file failed,是怎么个情况呢。
看了这段注释,有点明白了。
/**
- ATTENTION: USE jsb.fileUtils INSTEAD OF jsb.FileUtils.
- jsb.fileUtils is the native file utils’ singleton object,
- please refer to Cocos2d-x’s API to know how to use it.
- Only available in JSB
- @class
- @name jsb.fileUtils
-
@extend cc._Class
/
jsb.fileUtils = /* @lends jsb.fileUtils# */{
确保你下载的文件是正确的,当然也可能和某些机型有关。
为什么我的提示 Uncaught ReferenceError: jsb is not defined
你可能用浏览器运行的,Web环境下没有jsb
非常感谢!方案可行,解决了大问题!
非常感谢,方案可行,解决了大问题
jsb能做web上用?
能设置想要的图的分辨率么 保存到本地的图的分辨率不高 有什么办法解决么
用本地存储做图片存储确实不明智,其实使用云服务的图床效果也不差,也不贵,还带鉴黄功能