Самый эффективный способ запланировать 24 различных таймера

В настоящее время я использую Bukkit для разработки плагинов, и у меня есть 12 предпочтений, которые настроены в файле (12 способов, которыми человек может заплатить за полет).

Для каждой конфигурации (12) необходимо 2 таймера. Один таймер «снятия» и один таймер «проверки на лету». Каждый таймер будет настроен на разные интервалы, поэтому я не мог их совместить.

Затем, когда у игрока есть разрешение на одну из 12 конфигураций, он/она помещается в массив, и таймер, назначенный этой конфигурации, выполняет итерацию по массиву, запуская методы для проверки того, что необходимо.

Тем не менее, я считаю, что есть лучший способ сделать это, помимо срабатывания 24 таймеров при запуске сервера. Это только кажется, что это слишком много, и это будет серьезным ударом по производительности. Таймеры также должны быть SyncDelayedTask, поскольку они обращаются к Bukkit API.

Поэтому мне было интересно, есть ли более эффективный способ решить эту проблему?


person Colby    schedule 16.02.2014    source источник
comment
Звучит как преждевременная оптимизация, идите так, как вы описали, и если вы столкнетесь с каким-либо узким местом, подумайте об оптимизации.   -  person qqilihq    schedule 16.02.2014
comment
@qqilihq На самом деле, это совершенно необходимая оптимизация. Без него было бы огромное отставание.   -  person Jojodmo    schedule 23.02.2014


Ответы (1)


Есть способ сделать это, не устанавливая 24 отдельных таймера. Вы можете создать его с временным интервалом 1. Затем вы можете добавлять единицу к числу каждый раз, когда запускается таймер. Как это:

int loops;

this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable(){

          public void run() {
              loops++;//add one to the loops
          }
        },1, 1);

Затем для каждого временного интервала вы можете настроить проверку, чтобы увидеть, делится ли loops на интервал... Например, предположим, что вы хотели бы иметь fly check каждые 5 тактов, а ваш таймер withdraw каждые 7 тактов. Вы можете сделать это:

int loops;

this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable(){

          public void run() {
              loops++;//add one to the loops

                      if(loops %  5 == 0){//if loops is divisible by 5
                          //fly check code
                      }
                      if(loops % 7 == 0){//if loops is divisible by 7
                          //withdraw code
                      }
          }
        },1, 1); //make the timer repeat every 1 tick

Просто убедитесь, что вы используете только операторы if, а не else if. Если вы используете else if выше, а число циклов равно 35, что делится на 5 и 7, будет выполнен первый оператор, но не второй, потому что вы говорите ему запускать этот оператор только в том случае, если приведенные выше ложны. Поэтому, если вы используете только операторы if, он сможет проверить каждый из них, и можно будет вызвать несколько.

person Jojodmo    schedule 17.02.2014