简介
所以我正在制作游戏,思考如何构建和更新我的所有游戏对象。我( 案例1 )创建一个简单的GameObj
作为父类,并在virtual Update
方法中放置一些物理,在{{ 1}}等等,让其他所有对象(墙,敌人,玩家......)成为孩子, OR 做我( 案例2 )使用this article中描述的组件。简而言之,作者解释说我们可以为用户输入,物理更新和绘制创建接口(让我们停在那3个)并用这些接口的预编程实例描述我们的virtual Draw
。
现在,在这两种情况下,我都会得到GameObj
类的循环。
在 case 1 中,它可能看起来像这样
GameObj
在案例2 中,就像这样
// in Update function of the level class
for(int i = 0; i < gameObjList.Count; i++)
{
gameObjList[i].Update();
}
依此类推(在案例2 中)其他界面,例如// in UpdatePhysics function of the level class
for(int i = 0; i < gameObjList.Count; i++)
{
gameObjList[i].PhysicComponent.Update();
}
和InputComponent.Update
(或DrawComponent.Draw
,我不知道)。
列出的理由是在一个关注我们所有游戏对象的关卡类中
考虑的原因CollisionComponent.Check(gameObj[x])
在这两种情况下,我们都可能需要调用if ( x != null )
。在 case 1 中,我们可能不希望一直删除并添加到if ( x != null )
,但是回收实例,因此我们将它们设置为gameObjList
而不执行任何操作null
的行。在 case 2 中,我们可能希望无法设置某些组件,因此我们必须要求gameObjList.Remove(x)
能够调用if (gameObjList[i].someComponent != null)
。
考虑调用空函数的原因
同样在这两种情况下,我们都可以调用一个空函数(例如gameObjList[i].someComponent.Update()
)。让我们考虑自解释public void myFunction(){}
类。它存在就在那里。 Id不会更新,但它与其他Wall
确实存在某种关系。此外, case 1 中的一些孩子,比如说GameObj
或MovingWall
会有某种更新。对于 case 2 ,我们总是可以声明一个Platform
的默认空类,其someComponent
函数将为空,因此该类的实例将设置为我们的Update
组件,如果在构造函数中没有设置。也许是这样的
GameObj
研究
现在,我没有找到我们在这里建立的游戏引擎中最有效的方法。以下是我刚刚测试的一些示例( note 其中一些仅供参考):
1。空循环
2。空功能
3。 public GameObj(IPhysicsComponent physicsComponent, ...){
if(physicsComponent == null)
physicsComponent = PhysicsComponent.Default;
this.physicsComponent = physicsComponent;
}
x始终为空
4。 if(x != null) x.empyFunction();
x始终为空
5。 x?.emptyFunction();
x不为空
6。 if(x != null) x.empyFunction();
x不为空
7。 x?.emptyFunction();
这7点测试10万次,10 000次。下面的代码是我测试过的代码。您可以在本地运行,更改一些静态变量,结果将显示在运行程序的文件夹中的“result.txt”中。这是代码:
myClass.staticEmptyFunction();
当我将所有数据放入excel并制作图表时,它看起来像这样( DEBUG ):
问题
Q1。使用什么方法提高效率?
Q2。在什么情况下?
Q3。是否有关于此的官方文件?
问题4。有没有其他人对此进行测试,可能更为密集?
Q5。有没有更好的方法来测试这个(我的代码有错误)?
Q6。是否有更好的解决方法需要快速有效地更新大型实例列表的问题,如每一帧?
编辑Q7。为什么静态方法需要花费更长的时间才能在发布版本中执行?