解决Flash端游戏解析json数据很“卡”的问题

问题: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;
		}
	}
}


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值