好吧,我已经想了很久了。
我在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中有多个类的列表,其中有些类的列表(主要考虑的是我的粒子引擎),所以会更高效吗,还是真的不重要?
P.S,我注意到当玩家移动游戏地图时有点“紧张”(延迟一小部分秒)。这可能是造成这种情况的原因吗?
谢谢,
谢伊
发布于 2015-01-05 13:36:17
我经常注意到类似的专业问题。所以让我给你们一个直截了当的答案,我很清楚这不适用于一般情况。把它看作是我认为的“初学者的最佳实践”的一种观点。
static经常用于使变量跨类边界可用,例如-如果它们是单变量。这里的单例模式只是一个设计模式包装器(它不能解决大部分问题)。虽然这可能会使程序更容易编写,但是如果您想让应用程序多线程,使用static也可以使程序变得更加复杂。
因此,总的来说,我认为避免同时使用static并简单地传递对象是个好主意。
有一个例外,那就是:如果您需要跨线程边界访问的数据。如果是这样的话,您很快就会发现自己陷入了一个痛苦的世界,最好尽可能多地了解锁定,并将其用于所有静态变量(如果它们是结构/类,包括它们的成员!)。
如果这还不够好的话,你可以继续沿着这条路走下去,学习诸如互锁和内存障碍之类的东西(但如果你不需要的话,我不会建议你这么做)。
幸运的是,大多数应用程序足够快地在一个线程中工作。我认为您的应用程序也不例外(您可能可以使用一个标准的游戏框架来执行应用程序的多线程部分-- PS:如果是这样的话,也要小心类变量,因为它们也可能被跨线程边界传递)。
至于您的延迟:我认为您应该使用一个好的分析器来查找性能热点;它可能与static的使用无关。
发布于 2014-12-30 03:59:43
当你问到坏处时:
1)使用static变量的代码是否涉及多线程?如果是,您可以考虑锁定管理。很容易让代码变得复杂。
( 2) Player、position和其他结构是什么?如果是这样的话,每次通过属性访问它们时,都会创建实例的副本,而不是直接访问引用。考虑到代码提供了一些2D引擎,并且您正在创建一个Vector,所以可能是一些呈现管道代码,这可能会带来一些严重的性能影响。
https://stackoverflow.com/questions/27699394
复制相似问题