获取对象数据的最佳方法?

问题描述:

我需要在屏幕上显示一些关于各种游戏对象的统计,数字和图表。获取对象数据的最佳方法?

(实例:摄像机位置,视场,每秒帧数,饱满率,扑杀对象的数目,等等)

目前其希望被绘制或显示的任何对象沿着这些实现一个接口行:

public interface IGraphable 
{ 
    float GraphableValue { get; set; } 
} 

然后,该对象可以发送到图形组件显示。这具有一些明显的缺点,例如不能够绘制属于同一类的两个不同的数据片段。

我想要的是一种将指针传递到数据所在的位置的方法,或者指向知道如何返回数据而不是将对象传递给显示组件的函数的指针。

我相信这就是代表的用途,但我不明白如何在这种情况下使用它们(实际上我根本不理解它们)。另外,是否有另一种(更聪明/更好)的方式来做到这一点?

谢谢!

我已经决定执行以下操作:

public class GraphComponent 
{ 
    private Func<flaot> _function; 

    public GraphComponent(Func<flaot> function, ...) 
    { ... } 
} 

这让我指定写这样的事情检索数据的方式:

FPSComponent fpsc = new FPSComponent();  
GraphComponent fpsg = new GraphComponent(delegate() { return fpsc.ApproximateFPS; }, ...); 

取决于你如何做事情,你可能会使用Reflection(访问器上的属性),尽管最初也可能相当混乱。但它是你的武器库中非常有用的工具,因此值得花时间。下面是关于如何使用他们一个伟大的教程:

http://www.brainbell.com/tutors/C_Sharp/Attributes.htm

但随后,与会代表学习也是非常有用的,这听起来像是一个很好的解决方案。我还没有深深的看了进去,但本教程在同一地点可能是有用的:

http://www.brainbell.com/tutors/C_Sharp/Delegates_and_Event_Handlers.htm

+0

感谢您的链接!我会仔细看看的。但是,我听说反映很慢。这是真的? (据我所知,慢是一个相对的术语) – zfedoran 2009-10-12 00:54:15

+0

是的,我不确定反射的速度。我的猜测是,它不像调用方法那么快(因为代表会让你这么做)。如果它被称为每秒一百万次,你可能不想使用反射。但我可能是错的;-)我不花一大堆时间来使用它们。 – Smashery 2009-10-12 01:01:14

为什么不反转这样的控制:

public interface IGraphable 
{ 
    void BuildGraphable(IGraph g); 
} 

interface IGraph { 
    void AddValue(double value); 
} 

这是一个较好的选择无论如何,因为它隐藏了IGraphable实现的细节。此外,您现在可以扩展IGraph以增加功能,而不会破坏兼容性。

+0

我以前就是这样过的。我改变了它,因为每个图形组件可以有自己的更新频率(可以说每秒7次)。如果图组件由IGraphable类更新,我将无法为图组件创建独立的更新频率。 (例如,相机可能每秒更新60次,但显示视场的图表(在制图“视野”时为lol)可能不需要经常更新......) – zfedoran 2009-10-12 01:07:18

+0

您可以每秒调用60次方法,或要求每秒60次的财产,没有区别。一个给你可能收集几个数据,而另一个返回一个。 – 2009-10-12 01:53:19

+0

有差别,它通过添加或更新值来浪费计算。 – zfedoran 2009-10-12 01:58:00

我要的是一个方法将指针传递到数据所在的位置,或指向知道如何返回数据而不是将对象传递给显示组件的函数的指针。

如果你不希望你的对象添加到您的图形组件,因为

这有一些明显的缺点如不能够绘制2不同的数据块属于同一类。

也许一个列表将解决您的问题?

public interface IGraphable 
{ 
    List<float> GraphableValues { get; } 
}