20100819
完成以精武館平臺為中心的跨域登錄模塊。
精武館圍棋譜頁面重新設(shè)計(jì)
20100810
一個(gè)重要的計(jì)劃正在實(shí)施!
精武館第一個(gè)生產(chǎn)版本,與2010-08-08上線
20100808
圍棋打譜加入聲音
修復(fù)圍棋幾個(gè)bug
20100807
圍棋模塊新增功能:
1. 進(jìn)入點(diǎn)目模式后,啟動Timer,2分鐘后自動完成點(diǎn)目,每30秒提醒一次
2. 完成點(diǎn)目時(shí),有30秒的時(shí)間選擇是否接受點(diǎn)目結(jié)果,30秒后自動選擇繼續(xù)走棋
3. 一個(gè)請求(求和,點(diǎn)目,悔棋),如果被拒絕,則本輪無法再發(fā)起該請求
20100802
精武館已經(jīng)通過所有重要測試:
1. 客戶端:
1). 無內(nèi)存泄露
2). 即便是IE6,也不會很卡
3). 主流瀏覽器兼容
2. 服務(wù)器端:
1). 以房間為單位的服務(wù)器集群,可容納至少10萬人同時(shí)在線
2). 在百萬級數(shù)據(jù)下所有查詢操作均在0.2秒以內(nèi)(未測試千萬數(shù)據(jù))
3). 緩存,全文檢索均工作正常,并能很好的緩解數(shù)據(jù)庫壓力
20100801
Hibernate Search大數(shù)據(jù)手動建立索引
數(shù)據(jù)庫:Mysql
64萬條數(shù)據(jù),創(chuàng)建索引結(jié)果:
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
創(chuàng)建索引的代碼:
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參數(shù):
-XX:MaxPermSize=128m
-XX:PermSize=128m

-Xmn100m
-Xms512m
-Xmx512m
由于用的筆記本,因此各項(xiàng)參數(shù)都不高,整個(gè)重建過程,jvm內(nèi)存使用率一直徘徊在250m左右
20100726
一段oracle造數(shù)據(jù)的存儲過程
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造數(shù)據(jù)的存儲過程
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. 郵件服務(wù)器搭建完成;
2. 完成3個(gè)郵件模板:
注冊后的歡迎與激活郵件
密碼重置郵件
激活碼重置郵件
3. 已測試郵箱:
126, gmail, hotmail, 2個(gè)企業(yè)內(nèi)部郵箱
20100712
加強(qiáng)事務(wù)處理
配置二級緩存
增加一些小細(xì)節(jié),比如個(gè)人信息修改,圍棋耍賴投訴等
20100615
頁面方面的性能測試,主要是測試當(dāng)房間中玩家較多的情況下,高密度的頁面dom操作對性能的影響。
房間數(shù)據(jù):房間包含50張桌子,每張桌子2個(gè)座位,房間可容納最多130個(gè)玩家。
1. 開啟150個(gè)線程,每個(gè)線程模擬一個(gè)玩家,分別每隔2秒和5秒進(jìn)行一次進(jìn)入/離開房間
2. 開啟150個(gè)線程,每個(gè)線程模擬一個(gè)玩家,分別每隔2秒和5秒進(jìn)行一次坐下/站起
測試瀏覽器:ie8, firefox3.6
ie的性能表現(xiàn)比較糟糕,F(xiàn)F還比較平穩(wěn),總體來說,在真實(shí)的環(huán)境中,即使房間人數(shù)爆滿,瀏覽器表現(xiàn)應(yīng)該會比較平穩(wěn)。
20100521
添加jquery element的remove替代方法,在child div較多的情況下,可提升性能數(shù)十倍。
20100516
解決內(nèi)存泄露問題(sIEve-0.0.8 + ie)
1. Test Case: 進(jìn)入房間,刷新頁面100次,memory usage曲線平穩(wěn),無dom leak
2. Test Case: 進(jìn)入/離開 房間100次(頁面不刷新),memory usage曲線平穩(wěn),無dom leak
3. Test Case: 坐下/站起(打開/關(guān)閉圍棋窗口) 100次(頁面不刷新),memory usage曲線平穩(wěn),無dom leak
jquery的ajax調(diào)用代碼段有內(nèi)存泄露(jquery1.4.2)

try
{
var oldAbort = xhr.abort;

xhr.abort = function()
{

if ( xhr )
{
oldAbort.call( xhr );
}

onreadystatechange( "abort" );
};

} catch(e)
{ }
20100504
視頻:如何搭建本地平臺開發(fā)環(huán)境
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
打包環(huán)境已創(chuàng)建完成
20100330
開發(fā)者論壇:
https://groups.google.com/group/jingwuguan
20100316
平臺的抽象層代碼基本完成了,接下來是做一些項(xiàng)目管理的配套設(shè)施,包括清晰的模塊劃分,SVN,jira,論壇,mail等
其實(shí)這是一件非常有趣的事。
20100225
簡單的注冊登錄步驟必然能吸引更多玩家,因此精武館將允許玩家使用以下網(wǎng)站的ID登錄:
不過首次登錄還是需要填寫一些必要信息。
1. 使用google帳號
2. 使用msn帳號 -
https://live.azure.com
3. 使用yahoo帳號 -
http://developer.yahoo.com/social/updates/
4. 使用人人網(wǎng)帳號
20091230
精武館開始向開放式游戲平臺轉(zhuǎn)型,比原計(jì)劃要早,因?yàn)橐粋€(gè)人開發(fā)進(jìn)度太慢了,于是必須提前轉(zhuǎn)型。
精武館將為開發(fā)者提供以下資源:
1. 環(huán)境文檔,介紹精武館核心架構(gòu),介紹如何搭建開發(fā)環(huán)境和調(diào)試環(huán)境
2. java-api文檔,如何擴(kuò)展使用精武館提供的各種java api
3. javascript-api文檔,如何擴(kuò)展使用精武館提供的各種javascript api
4. 開放“圍棋”模塊源代碼以供開發(fā)者參考
5. 以maven依賴包的形式提供java api包
開發(fā)者可以根據(jù)以上資源自由開發(fā)游戲模塊,由精武館付費(fèi)購買其源代碼。
20091223
利用googlecodes創(chuàng)建靜態(tài)資源的cache捷徑,表情和頭像等圖片資源,可以放到googlecodes上面(不是Hosting,兩者區(qū)別很大),然后在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優(yōu)化基本完成,IE8下所有操作不超過100ms
20091221
javascript優(yōu)化:
優(yōu)化前:build游戲大廳40個(gè)座位IE花費(fèi)280ms,F(xiàn)F花費(fèi)160ms
build空圍棋棋盤IE花費(fèi)350ms,F(xiàn)F花費(fèi)200ms
優(yōu)化后:build游戲大廳60個(gè)座位IE和FF均花費(fèi)60ms左右
build空圍棋棋盤IE和FF均花費(fèi)30ms左右
目前javascript已接近產(chǎn)品響應(yīng)級別。
在VM虛擬機(jī)下跑的IE6,測試效果不佳,有待優(yōu)化。
20091217
圍棋游戲功能已經(jīng)做好了,等待測試,接下來計(jì)劃2周內(nèi)完成“觀戰(zhàn)”模式和開放服務(wù)——“打譜”。
20091210
開放式服務(wù)策略:
以精武館為例,目前可提供的開放式服務(wù)有
1. 棋類游戲打譜,客戶網(wǎng)站只需引入精武館相關(guān)棋類游戲模塊的打譜js,即可以在自己的網(wǎng)站上建立一個(gè)即時(shí)打譜的窗口。
2. 即時(shí)通信頻道,客戶網(wǎng)站只需引入精武館的及時(shí)通信js,即可以在自己的網(wǎng)站上建立一個(gè)類似在線客服的即時(shí)通訊窗口。
20091209
精武館首個(gè)即將開放的API——圍棋打譜api
它將幫助圍棋愛好者網(wǎng)站提供基于javascript/ajax的在線打譜功能,為圍棋愛好者提供更便捷的研究棋譜的方式。
例如: 某網(wǎng)站
http://www.go.com是一個(gè)棋譜搜集網(wǎng)站,它需要使用精武館的圍棋api實(shí)現(xiàn)在線打譜功能,只需要引入精武館的goapi.js,并以某棋譜的http絕對路徑為參數(shù),創(chuàng)建并啟動apijs中的打譜對象,就可以實(shí)現(xiàn)在線打譜功能。
20091124
技術(shù)上已經(jīng)可以實(shí)現(xiàn)以游戲模塊或房間為單位的分布式多機(jī)集群,基于web的游戲大廳完全可以模擬出基于客戶端的游戲大廳。
2篇Cometd的性能測試報(bào)告:
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通信做了些優(yōu)化,目前只要能較快的打開國內(nèi)各大門戶網(wǎng)站首頁,那么玩精武館就會很流暢。
2. 采用cookie來判斷登錄,不過由于后臺使用的是memcached作為用戶對象的集群緩存,目前可以提供的同步方法為:當(dāng)用戶狀態(tài)改變時(shí),及時(shí)更新緩存對象。
3. 頁面增加了一些元素,游戲結(jié)束時(shí)的計(jì)分部分(包含道具系統(tǒng))已經(jīng)差不多完工了,不過道具與積分/玩家的對象關(guān)系還需進(jìn)一步改善。
4. 暫時(shí)取消google搜索框,它對頁面的打開速度有影響。
20091120
1. 加入后臺虛擬貨幣,積分,道具的對象系統(tǒng)
2. 網(wǎng)速過慢的客戶端,會導(dǎo)致Cometd重置與服務(wù)器之間的連接,產(chǎn)生新的ClientId,導(dǎo)致Channel無效,也就是收不到來自服務(wù)器的p2p消息
3. 精武館將能嵌入開放式平臺中(例如開心網(wǎng)或是Google Wave),使得玩家可以在它們之中任何一個(gè)平臺進(jìn)入精武館游戲。
20091115
1. 優(yōu)化ack通訊
2. 加入在線人數(shù)統(tǒng)計(jì)
3. 加入google自定義搜索,它將為站內(nèi)搜索提供幫助
20091112
1. 修正了游戲窗口ID查找的bug
2. 玩家圍棋落子后,先顯示落子再提交ajax請求
3. 修正了斷開連接時(shí)多層彈出框
4. 取消了一個(gè)客戶端與服務(wù)器端的通道
20091111
圍棋:添加Pass
添加Ack擴(kuò)展,可以支持離線消息以及server端丟包重發(fā)
修正了Cometd-js中Reload時(shí)Ack的一處小BUG
20091110
當(dāng)游戲大廳的Cometd連接時(shí)才設(shè)置session過期時(shí)間,而不是登錄時(shí),這樣可以防止登錄后進(jìn)入大廳之時(shí)由于網(wǎng)速過慢而導(dǎo)致session過期,并且延長過期時(shí)間為20秒
取消了ajax request的10秒超時(shí)限制,因?yàn)樵诰W(wǎng)速較慢的情況下,它的影響似乎很惡劣。
添加了與服務(wù)器失去連接時(shí)的提示,由于客戶端是無狀態(tài)的,可以任意刷新。
圍棋模塊需要先實(shí)現(xiàn)SGF導(dǎo)入,這樣可以方便測試點(diǎn)目,精武館圍棋的點(diǎn)目效果與QQ圍棋的點(diǎn)目效果差不多。
研究圍棋的SGF讀寫功能,發(fā)現(xiàn)應(yīng)該為玩家提供這樣一個(gè)服務(wù):可以創(chuàng)建自己的棋譜庫,可以方便的管理并使用它們,而該棋譜庫又是精武館的開放資源。
20091109
由于要限制一個(gè)賬號同時(shí)只能登錄一個(gè)實(shí)例,目前使用的是session,10秒后過期。實(shí)際上也可以用cookie,用戶登錄時(shí)生成一個(gè)隨機(jī)ID,存入memcached,不過這樣就沒有辦法知道用戶何時(shí)關(guān)閉瀏覽器,不過這是一個(gè)代替session集群的最佳方案,可以考慮。
本周的開發(fā)計(jì)劃為:完成圍棋模塊的基礎(chǔ)功能,包括:SGF讀入,點(diǎn)目,PASS,認(rèn)輸。
posted on 2009-11-10 22:24
Phrancol Yang 閱讀(827)
評論(1) 編輯 收藏