两者之间有什么区别(我的程序速度 - 执行时间)?
第一个选项:
private void particleReInit(int loop)
{
this.particle[loop].active = true;
this.particle[loop].life = 1.0f;
this.particle[loop].fade = 0.3f * (float)(this.random.Next(100)) / 1000.0f + 0.003f;
this.particle[loop].r = colors[this.col][0]; // Select Red Rainbow Color
this.particle[loop].g = colors[this.col][1]; // Select Red Rainbow Color
this.particle[loop].b = colors[this.col][2]; // Select Red Rainbow Color
this.particle[loop].x = 0.0f;
this.particle[loop].y = 0.0f;
this.particle[loop].xi = 10.0f * (this.random.Next(120) - 60.0f);
this.particle[loop].yi = (-50.0f) * (this.random.Next(60)) - (30.0f);
this.particle[loop].xg = 0.0f;
this.particle[loop].yg = 0.8f;
this.particle[loop].size = 0.2f;
this.particle[loop].center = new PointF(particleTextures[0].Width / 2, particleTextures[0].Height / 2);
}
第二个选项:
Particle p = particle[loop];
p.active = true;
p.life = 1.0f;
...
其中 Particle particle[] = new Particle[NumberOfParticles];
只是一个 Particles 数组,它具有一些属性,例如生命、位置。
我在 Visual Studio 2010 中像 WFA(Windows 窗体应用程序)一样执行此操作,并且需要提高性能(我们无法使用 OpenGL,因此对于更多粒子,我的程序往往很慢)。
最佳答案
我当然希望速度会有所不同 - 毕竟它正在做更多的工作。另一个线程可能在语句之间更改了数组的内容,这些内容可能(或可能不)在此线程中可见。如果这些是属性而不是字段,属性 setter 甚至可以在相同线程内更改数组中的值,这将可见。
速度差异是否显着是另一回事,我们无法判断。
更重要的是,我认为第二种形式比现有代码更清晰。
事实上,如果这真的意味着重新初始化整个元素,我实际上会创建一个新 Particle
,然后将其分配给元素:
particle[loop] = new Particle {
active = true,
life = 1f,
// etc
};
... 或创建一个单独的方法/构造函数来创建处于适当状态的粒子。
关于c# - 访问数组时的速度差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10820108/