好吧,所以我现在一直试图弄清楚这一点。
我已经在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)
会更高效,还是不重要?
谢谢,
Shyy
答案 0 :(得分:2)
当你在询问缺点时:
1)使用多个线程中涉及的static
变量的代码吗?
如果是,您可以考虑锁定管理。这很容易使代码变得容易复杂。
2)Player
,position
和其他结构?如果是这样,每次通过属性访问它们时,都会创建实例的副本,而不是直接访问引用。考虑到代码提供了一些2D
引擎,并且您正在创建Vector
,所以可能是一些渲染管道代码,这可能会带来一些严重的性能影响。
答案 1 :(得分:1)
我经常注意到类似的问题。所以,让我给你一个直接的答案,我很清楚,它不适用于一般情况。将其视为我认为“初学者最佳实践”的观点。
static
通常用于使跨越类边界的变量可用,如果它们是单例的话。这里的单例模式只是一个设计模式包装器(它不能解决大多数问题)。虽然这可能使程序更容易编写,但如果您想使应用程序成为多线程,使用static
也可以使程序更加复杂。
因此,一般来说,我认为避免全部使用static
并简单地传递对象是个好主意。
有一个例外,即:如果需要跨线程边界访问的数据。如果是这种情况,你很快就会发现自己处于一个受伤的世界,最好尽可能多地学习锁定并将其用于所有静态变量(包括它们的成员,如果它们是结构/类!) 。
如果这还不够好,你可以继续沿着这条路走下去,了解互锁和记忆障碍等事情(但如果你不需要,我不建议这样做。)
幸运的是,大多数应用程序都足够快,可以在单个线程中工作。我想你的应用程序也不例外(并且你可以使用标准的游戏框架来完成应用程序的多线程部分 - PS:如果是这样,也要小心类变量,因为它们可能会通过线程传递边界也是如此)。
关于你的滞后:我认为你应该使用一个好的剖析器来找到性能热点;它可能与使用static
无关。