2011-11-28 5 views
0

GAE를 사용하는 멀티 플레이어 기능이있는 턴 기반 RPG 게임을 만들고 있습니다. 나는 플레이어가 온라인에있는 다른 플레이어를 볼 수있는 pvp 로비를 가지고있다. 플레이어는 또한 로비에서 서로 도전하고 싸움을 시작할 수 있습니다. 실제 싸우는 것은 많은 자원을 차지하지 않습니다. 뭐가 리소스를 차지하는가 로비입니다. 대시 보드에서 "데이터 저장소 읽기 작업"이 대부분의 리소스를 차지하는 것을 볼 수 있습니다.GAE 데이터 스토어 최적화 읽기

나는이 일을하는 방식이 매우 어리 석다는 것을 확신한다. 나는 더 좋은 방법이되어야한다는 것을 의미한다. 로비에있는 모든 플레이어는 매초마다 서버에 핑합니다. 그런 다음이 발생합니다

  1. 서버 점검 등록 된 플레이어의 목록을 통해 핑 플레이어의 이름이 목록에있는 플레이어의 이름과 일치하는지 확인. 그 객체는 (2)와 (3)에서 사용됩니다.

  2. 서버는 플레이어가 핑 (ping) 한 시간을 업데이트하여 지난 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

관련 문제