Снижение загрузки процессора в программах Java

Я написал довольно простую Java 2D-игру с двумя потоками - музыкальным проигрывателем и игрой. Когда я запускал игру, я заметил, что загрузка процессора увеличивается с 20% до 70%. Большая часть обработки, которую я хочу в игре, еще даже не реализована!

  1. Это проблема? - не должна ли простая игра не перегружать процессор?

  2. Если это проблема; Каковы ОБЩИЕ практики кодирования или шаблоны проектирования, чтобы избежать огромного скачка в использовании (кроме отсутствия многопоточности)?

5 ответов

Решение

Если это проблема; Каковы ОБЩИЕ практики кодирования или шаблоны проектирования, чтобы избежать огромного скачка в использовании (кроме отсутствия многопоточности)?

Большинство игровых движков имеют функцию обновления игровой логики, которая вызывается 60 раз в секунду, и функцию рисования, которая вызывается так часто, как компьютер имеет ресурсы (но не более, чем обновления логики).

Общая практика программирования заключается в том, что вы не хотите обновлять игру больше, чем нужно. Попробуйте вставить счетчик в свой основной цикл и посмотреть, сколько раз за 10 секунд он вызывается? Если вы выполняете более 60 обновлений в секунду, такая нагрузка на процессор не требуется!

Похоже, что вы не используете игровой движок, который дает вам это, так что вы можете собрать решение: иметь свой основной while цикл поиска текущего времени (Java's DateTime дает точность в миллисекундах (что достаточно хорошо), а затем сравните ее со временем обновления в последнем цикле. Если прошло недостаточно времени, используйте Thread.sleep() снять нагрузку с центрального процессора, пока ваша игра ожидает следующей итерации!

Последний комментарий:

(кроме многопоточности)

Несмотря на то, что потоки переключения ЦП вызывают небольшие накладные расходы, я не думаю, что использование многих хорошо написанных потоков должно усложнить работу ЦП (я предполагаю, что сумма работы такая же, как и с меньшим количеством потоков). На самом деле, если ваша машина многоядерная, она позволит вашей игре работать быстрее, если есть часть, где требуется процессор (при условии, что ваши потоки параллельны, а не блокируют друг друга)!

Это проблема? - не должна ли простая игра не перегружать процессор?

Простое бездействие может занять весь ваш процессор, например, этот кусок кода

  public static void main( String[] args ) {
    while( true ){

    }
  }

показывает 100% загрузки процессора на моем ПК. Так что, хотя ваша "простая" игра может не очень много сделать, в случае плохой реализации она, безусловно, может потреблять огромное количество ресурсов процессора.

Использование инструмента профилирования (такого как JProfiler) действительно может помочь вам определить, куда направляется весь этот процессор. Не уверен, что есть также бесплатные профилировщики. Но бесплатные инструменты, такие как JConsole и VisualVM (обычно оба включаются в JDK), также могут быть полезны, чтобы быстро увидеть, какие Threads активны и занимают большую часть процессора

Лучший способ найти использование процессора и памяти... это использовать профилировщики, такие как jconsole или jvisualvm.

вы можете найти то же самое в вашем JDK

C:~/jdk/bin/jconsole или C:~/jdk/bin/jvisualvm

В тот момент, когда пик процессора поднимается до уровня соответствующего стекового кадра, вы сможете увидеть текущую исполняемую строку, в которой загружается больше процессора.

Убедитесь, что вы профилируете свое приложение и сравните количество потоков.

Ответ здесь состоит в том, чтобы измерить вашу программу и увидеть, что процессор используется так, как вы ожидаете. Скорее всего, вы найдете что-то удивительное, когда вы измеряете это. Для этого существует множество хороших профилировщиков Java. Я использую JProfiler, которым я очень доволен. Путь бедняка заключается в том, чтобы получить дампы потоков Java с помощью pstack. Возьми несколько свалок и посмотри, что там происходит. Или просто отладить его в IDE и прерывать его в разных точках.

Я хотел бы, чтобы процессор и память профилировали ваше приложение, чтобы увидеть, что оно делает для повышения его эффективности.

Другие вопросы по тегам