设置基于分辨率的长度的最佳时间是什么时候?



这个问题将使用处理 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类在我的太空侵略者游戏中生成一颗子弹。在SpaceInvaders.pde中,我将创建一个表示我的飞船的Player类。此Player player具有player.xplayer.y组件。因此,当我在SpaceInvaders.pde调用player.shoot()时,我将在ArrayList<Bullet> bulletList中创建一个新Bullet

我想知道设置某些变量以确保我的计算机尽可能少地进行计算的最佳时间。

现在我可以想到三种设置方法:

就像上面的代码一样。

或:

// 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.yclass Bullet,它是计算一次,还是每次制作新的子弹类时计算?

我的理解是,每次实例化新Bullet时,Bullet类的构造函数中的代码Bullet()都会运行。但这是否意味着它不是每次都确定我的int y, w, h,而且只是在程序启动时一次吗?还是每次创建Bullet类的新实例时也会秘密调用它?

在您发布的代码中,这些行只运行一次:

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构造函数中可能会更具可读性。没有一个"最佳"位置来放置代码。