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 閱讀(825)
評論(1) 編輯 收藏