- Баллы
- 96
- Имя в Minecraft
- Xezard
Всех приветствую в данной теме.
Ниже - "многа букав".
Я постарался обьяснить всё максимально понятно. Если всё же не понятно - покиньте тред.
Теперь к сути:
Имею класс EPlayer, новый экземпляр которого создаётся каждый раз при входе нового игрока.
Сам класс имеет около 15 полей, типа int и double.
При инициализации класса EPlayer, создаётся также 2 новых экземпляра классов CharacterGUI и Task.
CharacterGUI создаёт Inventory, с нужными ItemStack внутри, на которых отображаются поля класса EPlayer. Тоесть, под каждого EPlayer, свой, уникальный CharacterGUI.
Task - implements Runnable.
В методе run() я запускаю 2 асинхронных BukkitRunnable(),
один из которых постоянно прибавляет некоторое значение к одному из полей EPlayer каждую секунду - 20 тиков.
Второй отправляет обычному Player актионбар, в котором также выводятся некоторые данные полей EPlayer.
И так, на одного активного плеера на сервере мы имеем:
1 экземпляр класса EPlayer.
1 экземпляр класса CharacterGUI.
1 экземпляр класса Task.
2 асинхронных BukkitTask'а.
Теперь вопрос, какой может быть нагрузка при 100 игроках? 200? 500???
1000 асинхронных BukkitTask'ов - на 500 игроков, до таких масштабов, до этого, я, увы, ещё не доходил.
Вобщем, вопрос, господа:
Возможно ли хоть как-то оптимизировать весь этот код? Если да, то каким образом всё это можно оптимизировать по максимуму?
Часть кода прикладываю:
Task.class
EPlayer.class
Решено.
Шедулер с ActionBar запускаю один, на всех онлайн игроков. Получаю онлайн игроков из своего же HashSet<EPlayer>, куда игроки попадают при входе и удаляются при выходе.
CharacterGUI был переделан, теперь содержит лишь статические методы, которые собирают инвентарь "на ходу".
Ниже - "многа букав".
Я постарался обьяснить всё максимально понятно. Если всё же не понятно - покиньте тред.
Теперь к сути:
Имею класс EPlayer, новый экземпляр которого создаётся каждый раз при входе нового игрока.
Сам класс имеет около 15 полей, типа int и double.
При инициализации класса EPlayer, создаётся также 2 новых экземпляра классов CharacterGUI и Task.
CharacterGUI создаёт Inventory, с нужными ItemStack внутри, на которых отображаются поля класса EPlayer. Тоесть, под каждого EPlayer, свой, уникальный CharacterGUI.
Task - implements Runnable.
В методе run() я запускаю 2 асинхронных BukkitRunnable(),
один из которых постоянно прибавляет некоторое значение к одному из полей EPlayer каждую секунду - 20 тиков.
Второй отправляет обычному Player актионбар, в котором также выводятся некоторые данные полей EPlayer.
И так, на одного активного плеера на сервере мы имеем:
1 экземпляр класса EPlayer.
1 экземпляр класса CharacterGUI.
1 экземпляр класса Task.
2 асинхронных BukkitTask'а.
Теперь вопрос, какой может быть нагрузка при 100 игроках? 200? 500???
1000 асинхронных BukkitTask'ов - на 500 игроков, до таких масштабов, до этого, я, увы, ещё не доходил.
Вобщем, вопрос, господа:
Возможно ли хоть как-то оптимизировать весь этот код? Если да, то каким образом всё это можно оптимизировать по максимуму?
Часть кода прикладываю:
Task.class
Java:
public class Task
implements Runnable
{
private BukkitTask action_bar_task;
private BukkitTask mana_regen_task;
private EPlayer eplayer;
public Task(EPlayer eplayer)
{
this.eplayer = eplayer;
TaskManager.getTasks().add(this);
}
public void stopAllTasks()
{
this.action_bar_task.cancel();
this.mana_regen_task.cancel();
}
public void stopManaRegenTask()
{
this.mana_regen_task.cancel();
}
public BukkitTask getManaRegenTask()
{
return this.mana_regen_task;
}
public void stopActionBarTask()
{
this.action_bar_task.cancel();
}
public BukkitTask getActionBarTask()
{
return this.action_bar_task;
}
public EPlayer getEPlayer()
{
return this.eplayer;
}
@Override
public void run()
{
this.mana_regen_task = new BukkitRunnable()
{
public void run()
{
if (eplayer.getPlayer() != null)
{
if (eplayer.getMana() < eplayer.getMaxMana())
{
eplayer.addMana(eplayer.getManaRegen());
}
}
}
}.runTaskTimerAsynchronously(Core.getCore(), 0, Constants.MANA_REGEN_TIME * 20);
this.action_bar_task = new BukkitRunnable()
{
public void run()
{
if (eplayer.getPlayer() != null)
{
TitleUtils.sendActionBar(eplayer.getPlayer(),
ChatColor.translateAlternateColorCodes('&', StringUtils.replaceActionBarMessage(Constants.ACTION_BAR_MESSAGE, (Double) Math.floor(eplayer.getPlayer().getHealth() * 100) / 100.0, eplayer.getPlayer().getMaxHealth(),
(Double) Math.floor(eplayer.getMana() * 100) / 100.0, eplayer.getMaxMana())));
}
}
}.runTaskTimerAsynchronously(Core.getCore(), 0, 13);
}
}
Java:
public class EPlayer
{
private String name;
private Inventory inventory;
//private doubles and ints
public EPlayer(Player player)
{
this.name = player.getName();
this.inventory = new CharacterGUI(this);
new Task(this).run();
}
//Getters, setters, some other void methods
}
Решено.
Шедулер с ActionBar запускаю один, на всех онлайн игроков. Получаю онлайн игроков из своего же HashSet<EPlayer>, куда игроки попадают при входе и удаляются при выходе.
CharacterGUI был переделан, теперь содержит лишь статические методы, которые собирают инвентарь "на ходу".
Последнее редактирование:
