2009-09-09 51 views
0

這是情況的低谷。我正在用PHP創建一個角色扮演遊戲。戰鬥系統由各種buff和debuff組成。戰鬥可能需要花費數輪(這是針對AI)。緩存數據與重新計算PHP中的數據

我是兩個主意,保證了玩家的數據的正確性(BUFF和DEBUFF到期隨着時間的推移,一個+5強度的buff可能只持續1回合)。通過這些用戶的數據和變化獲取從項目,設備,被動技能他的數據的字符序列初始化我能

1)進入,然後赤身裸體,存儲在會話中添加。如果buff存在,我就應用它。如果沒有,它就消失了。這樣,數據的正確性就可以保證性能的提高......我假設。

2)將整個字符數據存儲在會話中,並更新愛好者。當增益激活時,我添加修飾符,如果debuff/buff消失了,我必須記得'回滾'或者清理掉buff中的任何效果。我認爲這對數據庫不太重要,但是很難確保正確性,因爲可能會有這麼多不同類型的增益。

所以在

一)數據庫的開銷 二)作戰系統 三)行業慣例對這種情況下的可維護性,

請問上述兩種溶液票價方面?還有更多我不知道的事情嗎?我正在考慮使用用戶模式來實現#2,但是因爲網絡是無狀態的,似乎會增加更多開銷。

回答

2

我打算在這裏用「既不」,並告訴你我會採取的做法。

我可以假設,因爲你的問題,你明明在具有一些體面的交通規劃要確保負載下您的應用程序執行。這就是說,你應該記住這裏的會議的性質。如果您需要通過添加多個Web服務器來分散負載來集羣您的前端,那麼PHP的正常基於文件的會話處理變得相對無用,因爲您無法確保Web訪問者將訪問相同的前端服務器所有的時間(當然,你可能可以,但這將是困難的)。如果你存儲遊戲狀態,存儲到cookie可能不是最好的選擇,因爲你可能有超過4Kb的數據。

所以之後,下一步就是在您的會話使用新的處理程序,一般是你的數據庫移動到一箇中心點。您存儲到會話中的任何數據庫收益現在都有一個偏移量,因爲您仍然需要訪問數據庫。它可能並不昂貴,但並不理想。基本上,你只是將數據捆綁在一起,並以不同的形式重新寫入。

我會在這裏遵循的可擴展性模式將最接近你的#1。最初,每次重建BUFF並確保數據的正確性。使用會話來減輕某些表現,但不要大量依賴它們。當你遇到性能問題時,你會有幾個選擇。按照可能的優先順序,它們將是:

  • 安裝和使用memcached。緩存到會話,而不是緩存到會話!速度更快,性能增益更好。
  • 將數據庫和Web服務器分離到不同的服務器上。
  • 當你不斷成長,改變你的會話處理器是面向數據庫,並添加更多的Web前端
0

字符數據有多廣?簡單地將角色的所有統計數據和項目存儲在會話中是否可行?如果是這樣,你可以得到兩全其美。

+0

的統計數據是相當龐大的,至少> 30個屬性(由玩家最隱藏;只是用於內部計算)。真正的問題是如果我緩存字符數據,當buff/debuff消失時,我必須將「de-init()」應用於緩存數據。而如果我使用解決方案#1並從DB重新計算角色的屬性(基於EQ等),我不必去掉一個BUFF。 – Extrakun 2009-09-09 05:12:42

3

我拉克努特指出:「過早的優化是所有罪惡的根源。」

你不知道這個設計決定的實際性能的影響是什麼,你在開發過程中是。如果沒有實際的數據,就不可能判斷這是否會成爲未來的瓶頸,否則可能會有其他問題導致您的應用程序比應用程序慢10倍。

措施。測試。使用真實世界的數據。優化。