检查实例是否为空VS调用空函数(C#)

时间:2017-07-11 02:08:40

标签: c# game-engine

简介

所以我正在制作游戏,思考如何构建和更新我的所有游戏对象。我( 案例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 中的一些孩子,比如说GameObjMovingWall会有某种更新。对于 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 ):
Excel chart




编辑 - 发布版本。我想这回答了我的问题 release version excel chart



问题
Q1。使用什么方法提高效率?
Q2。在什么情况下?
Q3。是否有关于此的官方文件?
问题4。有没有其他人对此进行测试,可能更为密集? Q5。有没有更好的方法来测试这个(我的代码有错误)? Q6。是否有更好的解决方法需要快速有效地更新大型实例列表的问题,如每一帧? 编辑Q7。为什么静态方法需要花费更长的时间才能在发布版本中执行?

1 个答案:

答案 0 :(得分:0)

正如@ grek40建议的那样,我做了另一个测试,在开始测试之前我调用myClass.staticEmptyFunction(); 100次,以便它可以兑现。我也将testTimesCount设置为10 000和oneTestDuration设置为1 000 000.结果如下:enter image description here

现在,它似乎更加稳定。即使是你可以发现的小差异我也怪我的谷歌Chrome,excel和洪水在后台运行。我问的问题是因为我认为会有更大的差异,但我认为优化比我预期的要好得多。我也猜测没有人做过这个测试,因为他们可能知道它背后有C,并且人们在优化方面做了很多工作。