20100819
完成以精武馆平台为中心的跨域登录模块。
精武馆围棋谱页面重新设计
20100810
一个重要的计划正在实施!
精武馆第一个生产版本,与2010-08-08上线
20100808
围棋打谱加入声音
修复围棋几个bug
20100807
围棋模块新增功能:
1. 进入点目模式后,启动Timer,2分钟后自动完成点目,每30秒提醒一次
2. 完成点目时,有30秒的时间选择是否接受点目结果,30秒后自动选择继续走棋
3. 一个请求(求和,点目,悔棋),如果被拒绝,则本轮无法再发起该请求
20100802
精武馆已经通过所有重要测试:
1. 客户端:
1). 无内存泄露
2). 即便是IE6,也不会很卡
3). 主流浏览器兼容
2. 服务器端:
1). 以房间为单位的服务器集群,可容纳至少10万人同时在线
2). 在百万级数据下所有查询操作均在0.2秒以内(未测试千万数据)
3). 缓存,全文检索均工作正常,并能很好的缓解数据库压力
20100801
Hibernate Search大数据手动建立索引
数据库:Mysql
64万条数据,创建索引结果:
2010-08-01 17:33:48,522 INFO org.hibernate.search.impl.SimpleIndexingProgressMonitor:74 - 643600 documents indexed in 340634 ms
2010-08-01 17:33:48,522 INFO org.hibernate.search.impl.SimpleIndexingProgressMonitor:77 - Indexing speed: 1889.418 documents/second; progress: 99.99922%
2010-08-01 17:34:10,149 INFO org.hibernate.impl.SessionFactoryImpl:935 - closing
创建索引的代码:
FullTextSession fullTextSession = Search.getFullTextSession(getSession());
fullTextSession.createIndexer().
batchSizeToLoadObjects(40).
threadsForSubsequentFetching(2).
threadsToLoadObjects(2).
cacheMode(CacheMode.IGNORE)
.startAndWait();
配置:
<property name="hibernateProperties">
<props>
<!-- MySQL -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.jdbc.fetch_size">30</prop>
<prop key="hibernate.jdbc.batch_size">1000</prop>
<!-- The second level cache -->
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>
<!-- Fulltext search -->
<prop key="hibernate.search.default.directory_provider">org.hibernate.search.store.FSDirectoryProvider</prop>
<prop key="hibernate.search.default.indexBase">/var/lucene/indexes</prop>
<prop key="hibernate.search.default.indexwriter.batch.max_buffered_docs">5000</prop>
<prop key="hibernate.search.default.indexwriter.batch.max_merge_docs">5000</prop>
<prop key="hibernate.search.default.indexwriter.transaction.ram_buffer_size">5000</prop>
</props>
</property>
<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="driverUrl"
value="jdbc:mysql://192.168.1.100:3306/dev_weiqipu_com?useCursorFetch=true&useServerPrepStmts=true&useUnicode=true&characterEncoding=UTF8" />
jvm参数:
-XX:MaxPermSize=128m
-XX:PermSize=128m
-Xmn100m
-Xms512m
-Xmx512m
由于用的笔记本,因此各项参数都不高,整个重建过程,jvm内存使用率一直徘徊在250m左右
20100726
一段oracle造数据的存储过程
create or replace
PROCEDURE "data_gen" IS
buid varchar2(32);
huid varchar2(32);
BEGIN
For m In 1..100 Loop
select dbms_random.string('X',32) into buid from dual;
select dbms_random.string('X',32) into huid from dual;
For i In 1..1000 Loop
INSERT INTO big_test
(gID,
bUID,
hDATE,
hUID,
)
VALUES
((select dbms_random.string('X',32) from dual),
buid,
sysdate,
huid,
);
End Loop;
commit;
End Loop;
END "data_gen";
20100725
配置好“精武馆客服”(support # jingwuguan.com)邮箱
一段mysql造数据的存储过程
SET GLOBAL log_bin_trust_function_creators = 1;
DROP FUNCTION IF EXISTS rand_string;
DELIMITER $$
CREATE FUNCTION rand_string(n INT)
RETURNS VARCHAR(255)
BEGIN
DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str = CONCAT(return_str,SUBSTRING(chars_str , FLOOR(1 + RAND()*62 ),1));
SET i = i +1;
END WHILE;
RETURN return_str;
END $$
DELIMITER $$
DELIMITER $$
DROP PROCEDURE IF EXISTS `VACCOUNT_PARAMETER_PROC` $$
CREATE PROCEDURE `VACCOUNT_PARAMETER_PROC`()
BEGIN
DECLARE iloop SMALLINT DEFAULT 0;
DECLARE iNum MEDIUMINT DEFAULT 0;
DECLARE gid VARCHAR(32) DEFAULT 'a4028ebb812999ae220b';
DECLARE gameId VARCHAR(32) DEFAULT '';
DECLARE Cur_account CURSOR FOR SELECT member_id FROM account;
WHILE iNum<=10 DO
START TRANSACTION;
WHILE iloop<=10 DO
SET gameId = CONCAT(gid,rand_string(12));
INSERT INTO dev_weiqi_jingwuguan_com.jwg_game_instances
(id, )
VALUES
(gameId, )
SET iloop=iloop+1;
END WHILE;
COMMIT;
SET iloop=0;
SET iNum=iNum+1;
END WHILE;
END $$
DELIMITER ;
CALL `VACCOUNT_PARAMETER_PROC`();
20100724
1. 邮件服务器搭建完成;
2. 完成3个邮件模板:
注册后的欢迎与激活邮件
密码重置邮件
激活码重置邮件
3. 已测试邮箱:
126, gmail, hotmail, 2个企业内部邮箱
20100712
加强事务处理
配置二级缓存
增加一些小细节,比如个人信息修改,围棋耍赖投诉等
20100615
页面方面的性能测试,主要是测试当房间中玩家较多的情况下,高密度的页面dom操作对性能的影响。
房间数据:房间包含50张桌子,每张桌子2个座位,房间可容纳最多130个玩家。
1. 开启150个线程,每个线程模拟一个玩家,分别每隔2秒和5秒进行一次进入/离开房间
2. 开启150个线程,每个线程模拟一个玩家,分别每隔2秒和5秒进行一次坐下/站起
测试浏览器:ie8, firefox3.6
ie的性能表现比较糟糕,FF还比较平稳,总体来说,在真实的环境中,即使房间人数爆满,浏览器表现应该会比较平稳。
20100521
添加jquery element的remove替代方法,在child div较多的情况下,可提升性能数十倍。
20100516
解决内存泄露问题(sIEve-0.0.8 + ie)
1. Test Case: 进入房间,刷新页面100次,memory usage曲线平稳,无dom leak
2. Test Case: 进入/离开 房间100次(页面不刷新),memory usage曲线平稳,无dom leak
3. Test Case: 坐下/站起(打开/关闭围棋窗口) 100次(页面不刷新),memory usage曲线平稳,无dom leak
jquery的ajax调用代码段有内存泄露(jquery1.4.2)
try {
var oldAbort = xhr.abort;
xhr.abort = function() {
if ( xhr ) {
oldAbort.call( xhr );
}
onreadystatechange( "abort" );
};
} catch(e) { }
20100504
视频:如何搭建本地平台开发环境
http://video.jingwuguan.com/public/builddevplatform/builddevplatform.html
20100503
介绍精武馆的视频制作完成
part1:
http://video.jingwuguan.com/public/intro/part1web/part1web.html
part2:
http://video.jingwuguan.com/public/intro/part2web/part2web.html
20100418
打包环境已创建完成
20100330
开发者论坛:
https://groups.google.com/group/jingwuguan
20100316
平台的抽象层代码基本完成了,接下来是做一些项目管理的配套设施,包括清晰的模块划分,SVN,jira,论坛,mail等
其实这是一件非常有趣的事。
20100225
简单的注册登录步骤必然能吸引更多玩家,因此精武馆将允许玩家使用以下网站的ID登录:
不过首次登录还是需要填写一些必要信息。
1. 使用google帐号
2. 使用msn帐号 -
https://live.azure.com
3. 使用yahoo帐号 -
http://developer.yahoo.com/social/updates/
4. 使用人人网帐号
20091230
精武馆开始向开放式游戏平台转型,比原计划要早,因为一个人开发进度太慢了,于是必须提前转型。
精武馆将为开发者提供以下资源:
1. 环境文档,介绍精武馆核心架构,介绍如何搭建开发环境和调试环境
2. java-api文档,如何扩展使用精武馆提供的各种java api
3. javascript-api文档,如何扩展使用精武馆提供的各种javascript api
4. 开放“围棋”模块源代码以供开发者参考
5. 以maven依赖包的形式提供java api包
开发者可以根据以上资源自由开发游戏模块,由精武馆付费购买其源代码。
20091223
利用googlecodes创建静态资源的cache捷径,表情和头像等图片资源,可以放到googlecodes上面(不是Hosting,两者区别很大),然后在nginx中做代理和缓存配置,如下:
proxy_cache_path /var/www/cache levels=1:2 keys_zone=img-expression-cache:8m max_size=32m inactive=30d;
proxy_temp_path /var/www/cache/tmp;
server {
listen 80;
server_name static.mydomain.com;
expires 30d;
access_log off;
location / {
proxy_pass http://yours.googlecode.com/svn/static/;
proxy_cache img-expression-cache;
proxy_cache_valid 200 302 304 30d;
proxy_cache_valid 404 1m;
}
}
20091222
javascript优化基本完成,IE8下所有操作不超过100ms
20091221
javascript优化:
优化前:build游戏大厅40个座位IE花费280ms,FF花费160ms
build空围棋棋盘IE花费350ms,FF花费200ms
优化后:build游戏大厅60个座位IE和FF均花费60ms左右
build空围棋棋盘IE和FF均花费30ms左右
目前javascript已接近产品响应级别。
在VM虚拟机下跑的IE6,测试效果不佳,有待优化。
20091217
围棋游戏功能已经做好了,等待测试,接下来计划2周内完成“观战”模式和开放服务——“打谱”。
20091210
开放式服务策略:
以精武馆为例,目前可提供的开放式服务有
1. 棋类游戏打谱,客户网站只需引入精武馆相关棋类游戏模块的打谱js,即可以在自己的网站上建立一个即时打谱的窗口。
2. 即时通信频道,客户网站只需引入精武馆的及时通信js,即可以在自己的网站上建立一个类似在线客服的即时通讯窗口。
20091209
精武馆首个即将开放的API——围棋打谱api
它将帮助围棋爱好者网站提供基于javascript/ajax的在线打谱功能,为围棋爱好者提供更便捷的研究棋谱的方式。
例如: 某网站
http://www.go.com是一个棋谱搜集网站,它需要使用精武馆的围棋api实现在线打谱功能,只需要引入精武馆的goapi.js,并以某棋谱的http绝对路径为参数,创建并启动apijs中的打谱对象,就可以实现在线打谱功能。
20091124
技术上已经可以实现以游戏模块或房间为单位的分布式多机集群,基于web的游戏大厅完全可以模拟出基于客户端的游戏大厅。
2篇Cometd的性能测试报告:
http://wiki.exoplatform.com/xwiki/bin/view/WS/Cometd+Cluster+Bench
http://cometdaily.com/2008/01/07/20000-reasons-that-comet-scales/
20091122
1. C-S通信做了些优化,目前只要能较快的打开国内各大门户网站首页,那么玩精武馆就会很流畅。
2. 采用cookie来判断登录,不过由于后台使用的是memcached作为用户对象的集群缓存,目前可以提供的同步方法为:当用户状态改变时,及时更新缓存对象。
3. 页面增加了一些元素,游戏结束时的计分部分(包含道具系统)已经差不多完工了,不过道具与积分/玩家的对象关系还需进一步改善。
4. 暂时取消google搜索框,它对页面的打开速度有影响。
20091120
1. 加入后台虚拟货币,积分,道具的对象系统
2. 网速过慢的客户端,会导致Cometd重置与服务器之间的连接,产生新的ClientId,导致Channel无效,也就是收不到来自服务器的p2p消息
3. 精武馆将能嵌入开放式平台中(例如开心网或是Google Wave),使得玩家可以在它们之中任何一个平台进入精武馆游戏。
20091115
1. 优化ack通讯
2. 加入在线人数统计
3. 加入google自定义搜索,它将为站内搜索提供帮助
20091112
1. 修正了游戏窗口ID查找的bug
2. 玩家围棋落子后,先显示落子再提交ajax请求
3. 修正了断开连接时多层弹出框
4. 取消了一个客户端与服务器端的通道
20091111
围棋:添加Pass
添加Ack扩展,可以支持离线消息以及server端丢包重发
修正了Cometd-js中Reload时Ack的一处小BUG
20091110
当游戏大厅的Cometd连接时才设置session过期时间,而不是登录时,这样可以防止登录后进入大厅之时由于网速过慢而导致session过期,并且延长过期时间为20秒
取消了ajax request的10秒超时限制,因为在网速较慢的情况下,它的影响似乎很恶劣。
添加了与服务器失去连接时的提示,由于客户端是无状态的,可以任意刷新。
围棋模块需要先实现SGF导入,这样可以方便测试点目,精武馆围棋的点目效果与QQ围棋的点目效果差不多。
研究围棋的SGF读写功能,发现应该为玩家提供这样一个服务:可以创建自己的棋谱库,可以方便的管理并使用它们,而该棋谱库又是精武馆的开放资源。
20091109
由于要限制一个账号同时只能登录一个实例,目前使用的是session,10秒后过期。实际上也可以用cookie,用户登录时生成一个随机ID,存入memcached,不过这样就没有办法知道用户何时关闭浏览器,不过这是一个代替session集群的最佳方案,可以考虑。
本周的开发计划为:完成围棋模块的基础功能,包括:SGF读入,点目,PASS,认输。
posted on 2009-11-10 22:24
Phrancol Yang 阅读(815)
评论(1) 编辑 收藏