2011-11-28 123 views
0

我使用GAE製作了一些基於回合的RPG遊戲,並提供了一些使用GAE的多人遊戲功能。我有一個PVP大廳,玩家可以查看其他在線玩家。玩家還可以在大廳裏互相挑戰並開始戰鬥。實際的戰鬥並沒有佔用那麼多的資源。大廳是什麼佔用了資源。在我的儀表板中,我可以看到「數據存儲讀取操作」是什麼佔用了大部分資源。優化GAE數據存儲區讀取

我相當肯定,我這樣做的方式非常愚蠢,我的意思是隻有一種更好的方式。每個位於大廳的玩家都會每隔一秒鐘對服務器進行一次ping。然後會發生以下情況:

  1. 服務器檢查通過的註冊球員名單,看看是否爆震球員的名字列表中的玩家的名稱相匹配。該對象然後在(2)和(3)中使用。

  2. 服務器更新玩家拼寫的時間,以便它(稍後)可以返回僅包含在最近10秒內ping過服務器的玩家的列表。

  3. 服務器檢查是否有人挑戰該玩家。

下面是試圖找到爆震播放器的代碼(即,上述(1)):

javax.jdo.Query query = pm.newQuery("SELECT FROM " + Player.class.getName()); 

     List<Player> players = new ArrayList<Player>(); 
     players = (List<Player>) query.execute(); 

     for(int i = 0; i < players.size(); i ++) 
     { 
      if(players.get(i).getName().equals(playerName)) 
      { 
       //Found correct player! 
       break; 
      } 
     } 

當有成百上千的註冊球員,找到一個特定的玩家每過第二對於大廳中的每個玩家來說都是一種真正的浪費。

問:有沒有更好的方法來做到這一點?我在想也許我是在低效地提取主播球員?

回答

2

您正在遍歷每一個註冊的玩家,每次你嘗試找到一個。既然你正在做一個簡單的平等測試,你應該在你的查詢中應用一個過濾器來返回所需的記錄。 JDO查詢,以及如何添加過濾器,記錄在here

+0

也許值得注意的是,這聽起來像是暫時的數據,可能會更好地服務於生存在memcache中,而不是堅持在數據存儲中。 – Martin