Прежде всего, я бы порекомендовал вам использовать именованные константы, а не использовать случайные магические числа в вашем коде, и рассмотреть возможность использования перечислений для типов ваших ячеек. Хотя ваш код не будет работать быстрее, он, безусловно, облегчит его понимание. Кроме того, «i» обычно используется в качестве счетчика, а не для возвращаемого значения. Вы, вероятно, должны назвать это cellType
или что-то подобное. Я также рекомендую вам использовать 2D-массив для вашей сценической карты, поскольку он упрощает некоторые вещи, как в материально-техническом, так и в концептуальном плане.
Тем не менее, вот несколько вещей, которые нужно попробовать:
Вытащите setColor()
из цикла и сделайте это один раз. Компилятор мог бы выполнять циклически-инвариантный подъем и, таким образом, делать это для вас (и, вероятно, будет), но концептуально, вы, вероятно, должны делать это в любом случае, так как кажется, что все ваши стены должны быть одного цвета в любом случае.
Попробуйте позвонить drawRect()
вместо fillRect()
и посмотрите, будет ли это быстрее. Я не думаю, что это будет, но это стоит попробовать, даже если это выглядит уродливее. Точно так же вы можете попробовать создать Image
и затем нарисовать его. Преимущество этого заключается в том, что вашему графическому объекту действительно легко сказать, что нужно преобразовать изображение. Кроме того, рассмотрите возможность полного устранения этой проблемы и убедитесь, что она значительно снижает производительность.
Кроме того, обычно вам не нужно запрашивать родительский объект для объекта Graphics и осуществлять рисование непосредственно на нем. Скорее, вы должны переопределить его метод paintComponent()
и просто использовать предоставленную вам графику (возможно, вызывая вспомогательные методы, как и вы). Компоненты Swing по умолчанию имеют двойную буферизацию, поэтому вам не нужно реализовывать это самостоятельно; просто позвольте объекту свинга выполнить свою работу и сообщите, когда рисовать.
Кроме того, вы перекрашиваете весь экран, что является чем-то излишним. Если вы звоните repaint(Rectangle)
, Swing может перерисовать только те разделы вашей доски, которые явно помечены как грязные. Когда вы обновляете один из ваших спрайтов, вызывайте repaint (r) только в области старого и нового местоположения спрайта. Когда вы пройдете уровень и вам понадобится новая доска, вы можете вызвать repaint () (без параметров), чтобы перерисовать всю карту.
Вам также следует обратиться к учебному пособию Sun , чтобы получить советы по повышению эффективности в Swing.