我正在制作一个基于回合制的RPG游戏,其中包含一些使用GAE的多人游戏功能。我有一个pvp大厅,玩家可以在那里查看在线的其他玩家。玩家还可以在大厅互相挑战并开始战斗。实际的战斗并没有占用那么多资源。大厅占用资源的是什么。从我的仪表板中我可以看到“数据存储读取操作”占用了大部分资源。
我很确定我这样做的方式非常愚蠢,我的意思是必须有一个更好的方法。大厅里的每个玩家每隔一秒就会对服务器进行一次ping操作。然后发生以下情况:
服务器检查注册玩家列表,看看ping玩家的名字是否与列表中玩家的名字相匹配。然后在(2)和(3)中使用该对象。
服务器更新播放器固定的时间,以便它(稍后)可以返回一个列表,其中只包含过去10秒内已经ping过服务器的播放器。
服务器检查是否有人质疑该播放器。
以下是试图找到pinging播放器的代码(即上面的(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;
}
}
当有数百名注册玩家时,每隔一秒为大厅中的每个玩家找一个特定的玩家似乎是一种真正的浪费。
问题:有没有更好的方法呢?我想也许我的调用播放器效率低下了?
答案 0 :(得分:2)
每次尝试找到一个时,你都在迭代每一个注册的玩家。由于您正在进行简单的相等性测试,因此应该对查询应用过滤器以仅返回所需的记录。 JDO查询以及如何添加过滤器都记录在here。