静态 - 好或坏

本文关键字:静态 | 更新日期: 2023-09-27 18:35:41

好吧,所以我已经试图弄清楚这个问题太久了。

我读过无数关于static的文章/问题,还有单例。

这就是我使用静态很长一段时间的方式:

我有一个GameManager.cs,里面有TileMap.cs和Player.cs。TileMap.cs需要访问玩家的摄像头,以更新地图的位置:

GameManager.cs:
public static TileMap map;
public static Player player;
Update code, draw, etc. below...

每个只有一个。

TileMap.cs:
Vector2 mapPosition = new Vector2(GameManager.Player.position.X, GameManager.Player.position.Y);

这是可以接受的吗?这有什么缺点?

编辑:看到这个问题太宽泛了,让我看看我是否可以更具体。

有没有比通过静态方法更好的方法来做到这一点?我在 TileMap.cs 中有多个类列表,其中一些类内部有列表(主要考虑我的粒子引擎),所以Update(Player player)会更有效率,还是真的无关紧要?

P.S,我注意到当玩家移动游戏地图时有点"抖动"(滞后一小段秒)。这可能是造成这种情况的原因吗?

谢谢
史嘟嘟

静态 - 好或坏

正如您询问缺点时:

1)使用static变量的代码是否涉及多线程? 如果是,您可以考虑锁定管理。这很容易使看似简单的代码变得复杂。

2)Playerposition和其他结构吗?如果是这样,则每次通过属性访问它们时,您都会创建实例的副本,而不是直接访问引用。考虑到代码提供了一些2D引擎,并且您正在创建一个Vector,因此可能有一些渲染管道代码,这可能会引入一些严重的性能影响。

我在专业上经常注意到类似的问题。因此,让我给你一个直接的答案,我很清楚它不适用于一般情况。将其视为我认为的"初学者最佳实践"的意见。

static通常用于使变量跨类边界可用,就好像它们是单例一样。这里的单例模式只是一个设计模式包装器(它不能解决大多数问题)。虽然这可能会使程序更易于编写,但如果要使应用程序多线程,使用 static 也会使程序更加复杂。

因此,总的来说,我认为最好避免完全使用static,而只是传递对象。

有一个例外,即:如果您需要具有可跨线程边界访问的数据。如果是这种情况,你很快就会发现自己处于一个受伤的世界,最好尽可能多地学习锁定并将其用于所有静态变量(包括它们的成员,如果它们是结构/类!

如果这还不够好,你可以继续走这条路,了解联锁和内存障碍之类的东西(但如果你不需要它,我不建议这样做)。

幸运的是,大多数应用程序都足够快,可以在单个线程中工作。我想你的应用程序也不例外(你可能可以使用标准的游戏框架来做应用程序的多线程部分——PS:如果是这样,也要小心类变量,因为它们也可能跨线程边界传递)。

至于你的滞后:我认为你应该使用一个好的分析器来查找性能热点;这可能与使用static无关。