Я только начал программировать игру во флаттере, но у меня проблема в том, что метод используется очень медленно, около 6 секунд с 4 игроками. Я хочу улучшить это.
Что я сделал до сих пор:
- Сделайте все асинхронным и дождитесь его в конце, но я не знаю почему, это не улучшает скорость. По крайней мере, не настолько, чтобы вы могли это почувствовать.
Хорошо было бы, если этот метод работает менее чем за секунду. Но у меня нет идей, как улучшить скорость.
Вот код:
Future nextRound(
ChatMessageRound chatMessageRound, String gamePlayId, Chat chat) async {
if (chatMessageRound.getWinner().length <= 0)
throw NoWinnerMarkedException();
var futures = List<Future>();
var gamePlay =
await _chatRepository.getGamePlayRepository(chat.id).get(gamePlayId);
var winnerIds = ListBuilder<String>(
gamePlay.winnerIds.toList(growable: true)
..addAll(chatMessageRound.getWinner()));
var chatMessageGameRoundIds = ListBuilder<String>(
gamePlay.chatMessageGameRoundIds.toList(growable: true)
..add(chatMessageRound.id));
gamePlay = gamePlay.rebuild((builder) {
builder.winnerIds = winnerIds;
builder.chatMessageGameRoundIds = chatMessageGameRoundIds;
});
var newChatMessageRound =
chatMessageRound.rebuild((builder) => builder.disabled = true);
futures.add(_chatRepository
.getChatMessagesRepository(chat.id)
.update(newChatMessageRound));
if (gamePlay.chatMessageGameRoundIds.length >=
_remoteConfigRepository.gamesToPlayCount()) {
var player = getPlayer(chat, gamePlay.playerIds);
var scoreMembers = player.map((member) {
return ChatMessageScoreUserInfo((builder) {
builder.name = member.name;
builder.profilePictureUrl = member.profilePictureDownloadUrl;
builder.userId = member.userId;
builder.score = gamePlay.winnerIds
.where((winnerId) => winnerId == member.userId)
.length;
});
});
for (var player in scoreMembers) {
futures.add(Future<dynamic>(() async {
var user = await getUser(player.userId);
user = user.rebuild((builder) {
builder.points = builder.points + player.score;
});
await updateUser(user);
}));
}
var chatMessageScore = ChatMessageScore((builder) {
builder.scorePossible = _remoteConfigRepository.gamesToPlayCount();
builder.members = ListBuilder(scoreMembers);
});
futures.add(_chatRepository
.getChatMessagesRepository(chat.id)
.add(chatMessageScore));
} else {
futures.add(
startRound(chat, gamePlay.playerIds, previousGamePlay: gamePlay));
}
futures
.add(_chatRepository.getGamePlayRepository(chat.id).update(gamePlay));
await Future.wait<dynamic>(futures);
}
Моя база данных пожарная. Если вам нужны подробности, напишите комментарий.