随笔 - 1  文章 - 37  trackbacks - 0
<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

留言簿(16)

随笔分类

随笔档案

文章分类

文章档案

test

搜索

  •  

最新评论

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&amp;useServerPrepStmts=true&amp;useUnicode=true&amp;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',32into buid from dual;
select dbms_random.string('X',32into huid from dual;

For   i   In   1..1000   Loop

INSERT INTO big_test 
    (gID,
    bUID, 
    hDATE, 
    hUID, 
    )
    
VALUES
    ((
select dbms_random.string('X',32from 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(100DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    
DECLARE return_str VARCHAR(255DEFAULT '';
    
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(32DEFAULT 'a4028ebb812999ae220b';
  
DECLARE gameId VARCHAR(32DEFAULT '';
  
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 

Google Groups
Subscribe to 精武馆开发者论坛
Email:
Visit this group


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 阅读(818) 评论(1)  编辑  收藏

FeedBack:
# re: 精武馆开发日志 2010-04-07 15:41 周磊
GOOD  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: