问题:Flash游戏客户端用到的很多配置数据和任务数据都是以Json格式储存的,在程序运行过程中使用第三方Json类库进行解析。当Json文件数据量过大是会存在运行瓶颈,比如当Json文件达到 5M以上?
思路:
(1)将Json文本通过JsFl脚本编译成SWF文件
(2)从SWF中读取对应的JSON信息
附录一:JSFL脚本
var nameList = [];
var document = fl.createDocument();
FLfile.write(getPath(fl.scriptURI)+ "gameData.as",ergodicFolder(getPath(fl.scriptURI)+"res/"));
fl.saveDocument("gameData");
document.docClass = "gameData";
fl.saveDocument(document, getPath(fl.scriptURI) + "gameData.fla");
document.exportSWF(getPath(fl.scriptURI) + "gameData.swf");
FLfile.remove(getPath(fl.scriptURI) + "gameData.as");
document.close(false);
FLfile.remove(getPath(fl.scriptURI) + "gameData.fla")
/**
* 遍历文件夹
* @path 文件夹路径,以"/"或者"\\"结尾
* @packageName 包名,, 若无包名,则无需填写;如果有,则以"."结尾
*/
function ergodicFolder(path)
{
var files = FLfile.listFolder(path, "files");
if(files != null)
{
return "package\n{\nimport flash.display.MovieClip;\npublic class gameData extends MovieClip\n{\n"+structureClass(files,path)+"\n public static const nameList:Array = ["+nameList+"];\npublic function gameData()\n{\n}}\n}";
}
return "";
}
/**
* 获取文件名
*/
function getTextName(textName)
{
return textName.substring(0,textName.length-4);
}
/**
* 解析文本内容
*/
function structureClass(files,path)
{
var str ="";
for(var i = 0; i < files.length; i++)
{
nameList.push('"' + getTextName(files[i]) + '"');
str = str+ "public static const "+getTextName(files[i])+":Object= "+FLfile.read(path+files[i])+";";
}
return str;
}
/**
* 获取去掉文件名的路径
*/
function getPath(path)
{
var index = Math.max(path.lastIndexOf("\\"), path.lastIndexOf("/"));
return path.substring(0, index + 1);
}
附录二:读取方式
package
{
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
import flash.utils.Dictionary;
/**
* 解析SWF中的Json文件
* @author pengyangjin
*
*/
public class Test extends Sprite
{
private var _loader:Loader=null;
private var _dict:Dictionary=new Dictionary();
public function Test()
{
//加载资源
_loader=new Loader();
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderResCpltHandler);
_loader.load(new URLRequest("assets/gameData.swf"));
}
private function loaderResCpltHandler(evt:Event):void
{
//解析资源
var contentLoaderInfo:LoaderInfo=evt.currentTarget as LoaderInfo
var c:Class=contentLoaderInfo.applicationDomain.getDefinition("gameData") as Class;
var names:Array=c["nameList"] as Array;
for each (var name:String in names)
{
_dict[name]=c[name];
}
//清理资源
_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loaderResCpltHandler);
_loader.unload();
_loader=null;
}
}
}