Какое лучшее время для установки длины на основе разрешения? - PullRequest
0 голосов
/ 15 октября 2019

В этом вопросе будет использоваться синтаксис кода «Обработка 3+».

Скажем, у меня есть класс Bullet, который появляется в позиции игрока x на заданной высоте.

class Bullet
{
    int x;
    int y = player.y;
    int w = SIZE_X / 150;
    int h = SIZE_Y / 50;

    Bullet()
    {
        x = player.x;
    }

    void display()
    {
        rect(x, y, w, h);
    }
}

Скажите, яЯ использую этот класс Bullet для создания пули в моей игре Space Invaders. В SpaceInvaders.pde я создам Player класс, который представляет мой корабль. Этот Player player имеет компонент player.x и player.y. Поэтому, когда в SpaceInvaders.pde я позвоню player.shoot(), я создам новый Bullet в ArrayList<Bullet> bulletList.

. Мне интересно, как лучше установить определенные переменные, чтобы убедиться, что мой компьютервыполняет как можно меньше вычислений.

Прямо сейчас я могу придумать три способа настройки этого:

Как в коде выше.

Или:

// In SpaceInvaders.pde:
int BulletYPos = player.y;
int bulletWidth = SIZE_X / somenumber; 
int bulletHeight = SIZE_Y / somenumber;
// where SIZE_X / SIZE_Y represent the size of the sketch

// in Class Player:
class Player
{
    // <snip ... >

    void shoot()
    {
        new Bullet(x, BulletYPos, bulletWidth, bulletHeight);
    }
}
`
// in class Bullet:
class Bullet
{
    int x, y, w, h;

    Bullet(int _x, int _y, int _w, int _h)
    {
        x = _x;
        y = _y;
        w = _w;
        h = _h;
    }

    void display()
    {
        rect(x, y, w, h);
    }
}

Это, безусловно, означает, что SIZE_X / somenumber будет рассчитываться только один раз. Но я также мог видеть, что это намного медленнее из-за увеличения циклов, в которых компьютер присваивает значения.

В основном мой вопрос вроде сводится к:

Если я говорю int y = player.y в class Bullet вычисляется ли он ОДИН РАЗ или каждый раз, когда создается новый класс Bullet?

Насколько я понимаю, код в конструкторе класса Bullet Bullet() запускается каждый раз, когда создается новый Bullet. Но значит ли это, что он не определяет мой int y, w, h каждый раз, и это только один раз при запуске программы? Или это также тайно вызывается каждый раз, когда я создаю новый экземпляр класса Bullet? 1042 *

1 Ответ

1 голос
/ 15 октября 2019

В опубликованном вами коде эти строки запускаются только один раз:

int bulletWidth = SIZE_X / somenumber; 
int bulletHeight = SIZE_Y / somenumber;

Эти строки будут запускаться каждый раз, когда вы создаете новый экземпляр класса Bullet:

Bullet(int _x, int _y, int _w, int _h)
{
    x = _x;
    y = _y;
    w = _w;
    h = _h;
}

Эти строки также будут запускаться каждый раз, когда вы создаете новый экземпляр класса Bullet:

class Bullet
{
    int x;
    int y = player.y;
    int w = SIZE_X / 150;
    int h = SIZE_Y / 50;

Значения не пересчитываются при каждом их использовании.

Обратите внимание, что выможете проверить это самостоятельно, используя функции. Попробуйте что-то вроде этого:

int sketchX = getSketchX();

void setup() {
  size(100, 100);

  for(int i = 0; i < 10; i++) {
    Bullet b = new Bullet();
  }
}

int getSketchX() {
  println("getSketchX");
  return 42;
}

class Bullet {
  int classX = getClassX();

  public Bullet() {
    int constructorX = getConstructorX();
  }

  int getClassX() {
    println("getClassX");
    return 42;
  }

  int getConstructorX(){
    println("getConstructorX");
    return 42;
  }
}

Сделав шаг назад, я бы сказал, что вы, вероятно, слишком беспокоитесь о производительности. Если вы еще не сделали какой-либо тест, вы не должны упускать из виду, чтобы ваш компьютер выполнял как можно меньше вычислений. Выполнение некоторой базовой математики для каждой пули не вызовет никаких проблем. (Сравните это с тем, сколько ваш компьютер должен сделать, чтобы нарисовать экран, и вы поймете, что я имею в виду.)

Есть известная цитата: «Преждевременная оптимизация - корень всего зла. « Это означает, что вам не нужно слишком беспокоиться об оптимизации кода, если вы еще не измерили код.

Если вы измеряете код и обнаруживаете, что конструктор Bulletна самом деле это займет слишком много времени, тогда вы можете пойти дальше и беспокоиться об этом. Но вы обнаружите, что ваша программа тратит гораздо больше времени на рисование, чем деление двух чисел.

Чтобы ответить на ваш вопрос: лучшее время для установки длины на основе разрешения - везде, где наиболее читаемо.

Наиболее читаемое место зависит от того, как различные части вашего кода сочетаются в вашем мозгу. И, как и многие другие вещи в кодировании, это компромисс: размещение инициализации в верхней части эскиза может иметь смысл, если у вас много констант, которые не изменятся, но размещение инициализации внутри конструктора Bullet может быть более читабельным, еслиВы можете изменить размер каждой пули в будущем. Нет единственного «лучшего» места для размещения вашего кода.

...