对于游戏,我目前正在研究粒子系统。粒子是仅具有位置数据的对象。这些粒子具有通过使用嵌入到其中的矢量场来更新其位置的方法。粒子在数组内部
要在一个物理步骤中更新所有粒子,我目前使用了foreach:
foreach (particle p in ParList) p.update;
其中update方法仅对原始位置进行两次移位和两次加法。现在,我想知道我的系统可以处理多少个粒子,是否可以对其进行优化以增加该数量。
[查看foreach的工作原理,我发现它只是一个基本的for循环,它进行了比较和对索引号的添加。
我想做一个for循环而无需检查索引号是否> = 0且不将索引号减1。
这两个操作通常并不多,但是在我的情况下,它们大约占操作数的1/3。所以我想知道我是否可以这样:
switch (Parlist.Length)
{
case 1024:
ParList[1023].update;
goto case 1023;
case 1023:
ParList[1022].update;
goto case 1022;
//and so on until
case 1:
ParList[0].update;
break;
}
虽然它看起来很可怕,但我知道这不是应该做的,但首先进行的测试似乎使我在这里实际上可以大大提高性能。我想将其放到一个类中,并以更通用的方式访问它,例如将foreach语法转换为for循环。我希望这样结束:
eachcase (particle p in ParList)
{
//instructions using p
}
这被翻译为:
switch (Parlist.Length)
{
case 1024:
//reference to instructions using Parlist[1023]
goto case 1023;
//and so on until
case 1:
//reference to instructions using Parlist[0]
break;
}
我如何建立这样的自定义结构?在C#中可以吗?
如果我能够执行此操作,那么我也想实现这样的自定义中断条件:
eachcase (particle p in ParList, p.x == 0 && p.z == 0)
{
//instructions using p
}
这被翻译为:
switch (Parlist.Length)
{
case 1024:
if (/*break condition*/) break;
//reference to instructions using Parlist[1023]
goto case 1023;
//and so on until
case 1:
if (/*break condition*/) break;
//reference to instructions using Parlist[0]
break;
}
我阅读了有关Lambda表达式的信息,在这里可以帮到我,但我不确定如何将其连接到通常的对象数组。
为什么不在这里尝试递归示例代码看起来像
function UpdateParList(int length){
ParList[length - 1].Update;
// add break condition here if required
UpdateParList(length-1);
}
它认为您需要这样的东西
for (int i = Parlist.Length - 1; i >= 0; i--)
{
ParList[i].update;
}
或
int i = Parlist.Length - 1;
while (i) {
ParList[i--].update;
}