大闹天宫,获取排行榜速度优化

back_recharge
duhui 2021-03-05 10:11:35 +08:00
parent 25aa13bfd5
commit 9cc1fd8fc9
3 changed files with 128 additions and 67 deletions

View File

@ -322,6 +322,9 @@ public class ExpeditionLogic {
double minFoce = sExpeditionSetting.getMatchForce()[leve-1][0]/base;
double maxFoce = sExpeditionSetting.getMatchForce()[leve-1][1]/base;
List<List<Integer>> rankTeam = RankLogic.getInstance().getRandomUserByRank(user, nodeSets.size());
int count = 0;
//存储并设置英雄快照
for (ExpeditionNodeInfo nodeInfo : nodeSets) {
try {
@ -340,7 +343,7 @@ public class ExpeditionLogic {
robotLevel += (Math.ceil(sExpeditionSetting.getPowerfulForce()[2][1]/base*robotLevel));
}
// 随机出来的队伍信息
List<Integer> randomFaceRankTeam = getRandomFaceRankTeam(user);
List<Integer> randomFaceRankTeam = rankTeam.get(count);
int robotLevel2 = getRobotLevelByUser(user, robotLevel);
// 节点英雄快照
@ -354,6 +357,7 @@ public class ExpeditionLogic {
e.printStackTrace();
}
user.getExpeditionManager().putExpeditionNodeInfos(nodeInfo.getSortId(), nodeInfo);
count++;
}
}
@ -401,68 +405,6 @@ public class ExpeditionLogic {
return level>1?level:1;
}
/**
*
* @param user
* @return
* @throws Exception
*/
private List<Integer> getRandomFaceRankTeam(User user) throws Exception {
// 战力排行榜
AbstractRank rank = RankContext.getRankEnum(RankEnum.FORCE_CURR_RANK.getType());
// 获取排行信息
PlayerInfoProto.RankResponse rankResponse = null;
try {
rankResponse = rank.getRank(user.getId(), "", 1, 50);
} catch (Exception e) {
throw new ErrorCodeException(ErrorCode.SYS_ERROR_CODE,"获取战力排行榜数据错误");
}
List<TeamPosHeroInfo> heroInfos = new ArrayList<>();
ArrayList<Integer> integers = new ArrayList<>();
// -1方便后面取值操作防止下标越界异常
int rankSize = rankResponse.getRanksCount()-1;
if (rankSize < 0){
throw new ErrorCodeException(ErrorCode.SYS_ERROR_CODE,"战力排行榜找不到人");
}
// 计数器
int count = 0;
do {
// 从0开始的随机
int random = MathUtils.randomInt(50);
// 随机排名
int anInt = random > rankSize?rankSize:random;
CommonProto.UserRank ranks = rankResponse.getRanks(anInt);
User other = UserManager.getUser(ranks.getUid());
// 获取随机玩家的主线队伍阵容
heroInfos = other.getTeamPosManager().getTeamPosForHero().get(GlobalsDef.FORMATION_NORMAL);
if (heroInfos.size() < 6){
count++;
}else {
heroInfos.forEach(v->{
// 获取英雄模板id
Hero hero = other.getHeroManager().getHero(v.getHeroId());
integers.add(hero.getTemplateId());
});
return integers;
}
}while (count < 5);
// 走到这里说明五次循环全部不足6个英雄直接取第一名的队伍
CommonProto.UserRank ranks = rankResponse.getRanks(0);
User other = UserManager.getUser(ranks.getUid());
// 获取随机玩家的主线队伍阵容
heroInfos = other.getTeamPosManager().getTeamPosForHero().get(GlobalsDef.FORMATION_NORMAL);
heroInfos.forEach(v->{
// 获取英雄模板id
Hero hero = other.getHeroManager().getHero(v.getHeroId());
integers.add(hero.getTemplateId());
});
return integers;
}
/**
* type id state
*/
@ -1247,7 +1189,7 @@ public class ExpeditionLogic {
* @param type
* @return
*/
public Map<Integer, Integer> getType2holy2weightRemoveHas(User user, int type) {
private Map<Integer, Integer> getType2holy2weightRemoveHas(User user, int type) {
// 策划表的圣物,因为会有删除操作,所以需要重新赋值,而不是直接引用
Map<Integer, Integer> weight = STableManager.getFigureConfig(CommonStaticConfig.class).getType2holy2weight(type);
Map<Integer, Integer> valueMap = new HashMap<>(weight);

View File

@ -4334,10 +4334,8 @@ public class HeroLogic{
Collection<Hero> values = heroManager.getHeroMap().values();
List<Hero> heroes = new ArrayList<>(values);
// 玩家英雄背包按等级排序
long start = System.currentTimeMillis();
// 玩家英雄背包按等级排
Collections.sort(heroes);
LOGGER.info("英雄背包排序耗时:{}ms",System.currentTimeMillis()-start);
// 等级相加
int count = 0;
for (int i = 0; i < num; i++) {

View File

@ -6,6 +6,7 @@ import com.ljsd.jieling.exception.ErrorCodeException;
import com.ljsd.jieling.globals.BIReason;
import com.ljsd.jieling.ktbeans.ReportEventEnum;
import com.ljsd.jieling.ktbeans.ReportUtil;
import com.ljsd.jieling.logic.dao.Hero;
import com.ljsd.jieling.logic.dao.PlayerManager;
import com.ljsd.jieling.logic.dao.TeamPosHeroInfo;
import com.ljsd.jieling.logic.dao.UserManager;
@ -24,9 +25,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rpc.world.WorldProto;
import util.MathUtils;
import util.TimeUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author lvxinran
@ -39,6 +42,13 @@ public class RankLogic {
}
/**
* 2
* 0
* 1
*/
private static List<Object> force_curr_rank = new ArrayList<>(2);
/**
*
*
@ -83,6 +93,117 @@ public class RankLogic {
MessageUtil.sendMessage(session,1,messageType.getNumber(),rankResponse,true);
}
/**
*
* @param user
* @param start
* @param end
* @return
* @throws Exception
*/
private PlayerInfoProto.RankResponse getRankInfo(User user,int start,int end) throws Exception{
// 上次存储时间+一小时
if (force_curr_rank.size() <= 0){
force_curr_rank.add(0L);
force_curr_rank.add(1L);
}
long old = (long)force_curr_rank.get(0) + TimeUtils.HOUR;
// 当前时间
long now = TimeUtils.now();
if (now > old){
// 距离上次存储超过一小时,重新获取
AbstractRank rank = RankContext.getRankEnum(RankEnum.FORCE_CURR_RANK.getType());
PlayerInfoProto.RankResponse rankResponse = null;
try {
rankResponse = rank.getRank(user.getId(), "", start, end);
} catch (Exception e) {
throw new ErrorCodeException(ErrorCode.SYS_ERROR_CODE,"获取战力排行榜数据错误");
}
force_curr_rank.set(0,now);
force_curr_rank.set(1,rankResponse);
}
return (PlayerInfoProto.RankResponse)force_curr_rank.get(1);
}
/**
* id
* @param user
* @return
* @throws Exception
*/
public List<List<Integer>> getRandomUserByRank(User user,int counts) throws Exception {
// 获取排行榜得数量
int rankEndLine = 50;
if (counts > rankEndLine){
throw new ErrorCodeException(ErrorCode.SYS_ERROR_CODE,"逻辑错误,传值有问题");
}
// 获取排行信息
PlayerInfoProto.RankResponse rankResponse = getRankInfo(user,1,rankEndLine);
long start = System.currentTimeMillis();
List<List<Integer>> result = new ArrayList<>();
// -1方便后面取值操作防止下标越界异常
int rankSize = rankResponse.getRanksCount()-1;
if (rankSize < 0){
throw new ErrorCodeException(ErrorCode.SYS_ERROR_CODE,"战力排行榜找不到人");
}
// 计数器
int count = 0;
do {
// 从0开始的随机
int random = MathUtils.randomInt(rankEndLine);
// 随机排名
int anInt = random > rankSize?rankSize:random;
// 获取随机玩家的主线队伍阵容
User other1 = getRankUid(rankResponse, anInt);
List<Integer> heroInfos = getTeamByUid(other1);
if (heroInfos.size() < 6){
// 队伍长度不足六人
if (count == 5){
// 最多循环五次五次之后直接取第一名得id
User other2 = getRankUid(rankResponse, 0);
result.add(getTeamByUid(other2));
}
count++;
}else {
result.add(heroInfos);
}
}while (result.size() < counts);
LOGGER.info("获取随机排名的队伍耗时:{}",System.currentTimeMillis()-start);
return result;
}
/**
* id
* @param user
* @return
* @throws Exception
*/
private List<Integer> getTeamByUid(User user){
ArrayList<Integer> integers = new ArrayList<>();
List<TeamPosHeroInfo> heroInfos = user.getTeamPosManager().getTeamPosForHero().get(GlobalsDef.FORMATION_NORMAL);
heroInfos.forEach(v->{
// 获取英雄模板id
Hero hero = user.getHeroManager().getHero(v.getHeroId());
integers.add(hero.getTemplateId());
});
return integers;
}
/**
* id
* @param rankResponse
* @param ranking
* @return
* @throws Exception
*/
private User getRankUid(PlayerInfoProto.RankResponse rankResponse, int ranking) throws Exception {
CommonProto.UserRank ranks = rankResponse.getRanks(ranking);
return UserManager.getUser(ranks.getUid());
}
/**
*
* @param session