??xml version="1.0" encoding="utf-8" standalone="yes"?>
2011q?月开始开发这个塔防游戏,Cocos2D+用TexturePacker整合的无数图?Packed by TexturePacker)
2011q?1月完成开发,提交appQ经q半个月甌账号Q提交审核等q程Q首个ios游戏上线
2012q??日, 它将成ؓ一个开源项?br />This is going to be an open source project from Jan 01, 2011.
感谢TexturePacker的作者提供的免费License
关于TexturePackerQ它是一个非常好用,质量很好的的囄整合工具
它将多个囄整合成一张大图,减少囄加蝲ơ数Q减内存用,我目前的了解,它能用于ios, android, web应用的开发,它支持很多输出格?br />http://www.texturepacker.com/
iTunes查看Q?
q入游戏界面
加蝲游戏界面
游戏界面
_武馆——在U棋牌游戏^収ͼ不用下蝲客户端,打开|页p玩棋牌类休闲游戏?br />
Z么叫_武馆:在我的老家Q大安后打牌玩d的地方就叫精武馆?br />
它的架构与基于客L的游戏^台差不多Q以游戏模块或房间ؓ单位的分布式集群........Q省略)?br />
技术上使用了常见的jquery, spring,hibernate, tapestry{,客户端之间通信使用的是cometd (http://www.cometd.org)?br />
Server使用的nginx+jetty7Qcookie保持d状态,memcached同步用户数据?br />
当前版本Q开发预览版
http://dev.jingwuguan.com
已通过试兼容的浏览器QIE8, IE7, IE6, Firefox, Chrome, Maxthon, Opera
围棋游戏大厅Q?br />
围棋Q?br />
它最l将成ؓ一个开攑ּ多媒体互动^収ͼ包括SNSQ电子竞技互动Q视频互动等?br />
google全球有超q?0W台serverQ参照google的server配置Q如果我们以10台server为单位,l徏无盘工作站集,我们一台server的成本最多是他们的一?br />
目前全球可搜索到的有2家公司在做这个在U游戏^収ͼ他们已经差不多做好了Q处在内部测试阶D,q有视频Q根据他们的试l果Q只需?.5m的带宽,可以很畅的玩普通画质游戏,高清画质也只需?-5m的带宽,而未?q_国内普及光U入戗?br />
在线应用q_包含3个部分:
客户端浏览器 W一阶段试计划 原因Q?br />
Z览器的应用客户端,也是媒体接收端Q用于向服务器发送应用请求,获得媒体请求IDQ向媒体服务器发送请求,获得相应的媒体流?br />
WEB服务?/strong>
客L对应用的h转发臛_用^台服务器Q获得媒体流IDQ发送给客户端,q用session控制其声明周?br />
应用q_服务?/strong>
应用q_服务器是一个服务器,包含三个部分Q控制器组Q应用服务器组Q媒体流服务器群l,以一个游戏服务^Cؓ例子Q?br />
控制器服务器组
接收游戏实例的请求,Ҏ戏实例和媒体的生命周期q行理?br />
游戏服务器群l?/strong>
提供游戏实例
媒体服务器组
响应客户端的媒体请?/p>
以魔兽世界ؓ例,程囑֦下:
游戏服务器端试ҎQ?br />
1Q运行一个很的游戏Q将它的视频和音频写成文Ӟ保证它可以播?br />
2Q将视频和音频以的形式发送给媒体serverQ通过|页以电q形式播放
3Q在览器端加入控制功能Q最后实现通过|页玩那个小游戏
媒体服务器端试ҎQ?br />
1Q搭建媒体服务器Q创建媒体播N?br />
2Q将一个媒体文件放入指定目录,q可以播攑֮
3Q写一D|试代码,媒体文件以的形式dQƈ写入到媒体服务器中,使它能够被播?
本阶Dؓ技术测试阶D,为整个项目打开一个入口点
启动Tomcat
删除 CATALINA_HOME/work/ 目录下的Catalina目录
讉KM一个jsp文gQ将发生错误
org.apache.jasper.JasperException: org.apache.jasper.JasperException: Unable to load class for JSP
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:156)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
Tomcat对jsp的处理是׃个JspServlet来完成的Q当tomcat启动Ӟ会ؓ每一个context创徏jsp工作目录(work dir)Q存攑֜?CATALINA_HOME/work/Catalina/HOST_NAME/CONTEXT_NAMEQcontext~译jsp所需要的参数也随之初始化Q加载jsp class的base path也已l潜在初始化Q是一个File对象Q它在随后URLClassLoader加蝲jsp class时作Z个resource urlQ下面是部分代码Q?br />
org.apache.jasper.JspCompilationContext.java
初始?JspLoader
public ClassLoader getJspLoader() {
if( jspLoader == null ) {
jspLoader = new JasperLoader
(new URL[] {baseUrl},
getClassLoader(),
rctxt.getPermissionCollection(),
rctxt.getCodeSource());
}
return jspLoader;
}
其中baseUrl是这样得到的
protected void createOutputDir() {
String path = null;
if (isTagFile()) {
String tagName = tagInfo.getTagClassName();
path = tagName.replace('.', File.separatorChar);
path = path.substring(0, path.lastIndexOf(File.separatorChar));
} else {
path = getServletPackageName().replace('.',File.separatorChar);
}
// Append servlet or tag handler path to scratch dir
try {
File base = options.getScratchDir();
baseUrl = base.toURI().toURL();
outputDir = base.getAbsolutePath() + File.separator + path +
File.separator;
if (!makeOutputDir()) {
throw new IllegalStateException(Localizer.getMessage("jsp.error.outputfolder"));
}
} catch (MalformedURLException e) {
throw new IllegalStateException(Localizer.getMessage("jsp.error.outputfolder"), e);
}
}
options.getScratchDir() 是在tomcat启动时初始化的,于是Q启动tomcat后,删除work目录Q访问jspӞ管work目录被重新创建ƈ且jsp被成功编译,但是׃ClassLoader中原目录对象与当前目录对象不同,而无法加载到jsp的class
被动模式可以理解ZU模式: 开发模式, 部v模式Q云模式?br />
一. 开发模?br />
实际上在我们的代码开发中Q就一直在使用q种开发模式,例如
interface InterfaceA {
}
class ClassB { InterfaceA ref = createInterfaceA(); }
使用createҎQ而不是直接new。也是说告诉了ClassBQ在createҎ中获得InterfaceA.
q是一个很单的例子Q受它直接媄响的Q是pȝ的扩展性。在一个可扩展Q~)的系l中Q例如在Eclipse产品E序Q或是基于可插拔模块的应用程序开发中Q则是随处可见的被动应用模式Q这LpȝQ对于现有组成部分在开发过E中很容易解冻I但是对于未知l成部分Q扩展性)Q只能通过被动模式解决Q例如ExtwindQ在Zosgi的web应用E序中,Dynamic IoC和Extension-Point所做的事?br />
? 部v模式
目前web应用E序的部|Ԍ可以ȝ样一句话Q需要部|的时候就来找我,别忘了把东西带上Q?br />
q与现在的服务理念完全相悖,快递公叔R有上门取货这Ҏ务?br />
如果以开发模式来看,q就属于 Deploy deploy = new FixedDeploy() Q而不是getDeploy()?br />
q是一U陈旧的部v模式Q毫无扩展性和伸羃性,它让很多原本单的事情变得很复杂,虽然q是一U部|模式,但是它将影响到后来的架构模式?br />
Extwind的部|模式:需要部|的时候,l我个电话,告诉我东西在哪,我去取?br />
q个“电话”是一个部|描q符QDeploy DescriptionQ,它描qC部v方式Q应用程序或模块的存攑֜QRepositoryQ等l节QExtwind通过q个描述W从指定的Repository中获取应用程序ƈ部v?br />
如果以面向对象来看它Q可以将q个描述W理解ؓ一个interfaceQ它媄响到部v模式的扩展性和伸羃性?br />
Extwind中的repository与maven中的repository很像Q对于它的定义,主要?个方面:
1. lg库,q可以通过maven来帮助完?br />
2. 部v库,由应用程序生成的受支持的部v库,部vӞ只需要将描述W指向该库或库中的某些组件?br />
? 云模?/strong>
用一个例子来理解云模式:
新增一?86Q可以ؓ云增?%的计能力;
新增一个集环境,可以Z增加20%的计能力;
q里的计能力就是一U资源,可以理解为服务能力。之前提到过Q对于未知资源,只能通过被动模式来获取,Extwind会通过云模式来提供可~的服务环境?br />
Extwind要做的事情只有一Ӟ让原本简单的事情Q不要太复杂?br />
1. ExtensionPoint与Extension
q个概念来自于Eclipse的插件技术,它在Web应用中如何体玎ͼ举一个简单的例子Q?br />
在ؓTomcat-OSGi开发的osgi console中,使用的是Tapestry-OSGiQ页面中会有一个Menu的组Ӟ它就是一个ExtensionPoint
其他lg只需要注册一个ExtensionQ即可在q个Menu中显C出来,q一切将是在q行时实现的Q?br />
2. Service
q个概念有点像OSGi中的Service RegistryQTapestrylg可以提供Service也可以获得ServiceQ它在web应用汇d何体玎ͼ举个例子
Tapestry-OSGi的示例控制台中,关于权限控制Q有3个模型组Q用LQ权限组Q资源组
现在资源l假讑֏有一个页面:bundles控制面Q当clienth讉Kbundles控制面Ӟq个面查扑֦果有LoginService存在q且没有dQ将跌{到LoginService提供的页面,当client提交d表单后,LoginService又会查询是否有RoleService存在 ......
q些Service会有一个Manager面LӞdisable/enableQ?br />
q个例子中如果再加入ExtensionPoint与Extension的概念,它将变得非常有意思?br />
Tapestry-OSGi的OSGi Console在完成Service Managment后开始发布?br />
tomcat-users.xml 定义了控制台权限Q如?/p>
二、将OSGi 应用E序导出为bundle
下载的projects.rar解压~,q在eclipse中作为plug-in导入它们Qorg.extwind.osgi.demo.jpetstoreosgi.launcher需要作Z个普通project导入Q这些projects包含了源代码Q方便你q行调试?br />
Tomcat-OSGi已经准备好了q些bundleQ?a target="_blank">点击q里下蝲bundles
通过eclipse的导出功能,他们导Zؓbundle jar包,需要注意的是,org.apache.jasper, jettyQjavax.servlet.*和org.eclipse.osgi是不需要导出的。(在org.extwind.osgi.demo.jpetstoreosgi.launcher中有一个导本Exporter.xmlQ可以运行它q行导出Q?br />
三、在Tomcat-OSGi中部|bundle
在tomcat-home/webapps中新Z个目录JPetStoreOSGiQ在JPetStoreOSGi目录中新Z个空文gosgi.iniQƈ导出的bundles拯到该目录下?br />
执行spring-framework-2.5.6/samples/jpetstore/db/hsqldb/server.bat 启动数据?br />
现在Q准备工作已l完成了Q在览器中输入 http://localhost:8080/console q入OSGi控制収ͼ你会发现所有bundle都已l安装好了,所有的bundle都启动了Q(先启动org.springframework.osgi.web.extenderQ?br />
现在是时候来看看JPetStoreOSGi部v到Tomcat-OSGi中后的效果了Q在览器中讉K下面q个地址
http://localhost:8080/JPetStoreOSGi/shop/index.do
目前osgi.ini中支持properties属?osgi.consoleQ启动osgi控制台?br />
在Tomcat-OSGi alpha2版本中,支持Equinox-JspServlet的注册,q兼容其URI patternQ也是_在eclipse的开发环境中开发出来的应用E序可以直接部v到Tomcat-OSGi中,而无需M代码U别的修攏V?br />
有一点点区别是Q在Tomcat-OSGi中已lexport了javax.servlet(2.4)Qjavax.servlet.jsp(2.1)和org.apache.jasperQ因此在Tomcat-OSGi中这些bundle是不需要加入的?br />
勿在app中用org.apache.jasperQ会D其他应用E序的jsp出现错误?/span>
相关资源
Extwind的Google GroupQ?http://groups.google.com/group/extwind
Extwind的Google ProjectQ? http://code.google.com/p/extwind
Tomcat-OSGi-alpha-2 all-in-one 下蝲地址
http://extwind.googlecode.com/svn/trunk/dist/Tomcat-OSGi/Tomcat-OSGi-all-in-one.rar
Extwind SVNQ?http://extwind.googlecode.com/svn/trunk/
jpetstore-osgi-demo的bundles下蝲地址
http://extwind.googlecode.com/svn/trunk/demo/jpetstore-osgi-demo/Bundles.rar
jpetstore-osgi-demo的projects下蝲地址
http://extwind.googlecode.com/svn/trunk/demo/jpetstore-osgi-demo/Projects.rar
构徏jpetstore-osgi-demo的演CE:
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1 - 昄首页
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 2 - 使用Spring-OSGI
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 3 - 扑ֈ我的Bean
构徏新版jpetstore-osgi-demo的相关问题:
Tomcat-OSGi Demo: JPetStoreOSGi(Spring-osgi 1.2.0)