1

在我的游戏设计中,我试图让逻辑和渲染线程尽可能并行运行。鉴于此,我需要一些方法将游戏逻辑中的更新推送到渲染线程中,并且我想找到最干净的方法来做到这一点。

首先让我道歉,因为我只是一个业余爱好者,我真的不知道任何设计模式或正确的术语,所以如果我所描述的内容有不同的名称,请告诉我。

假设我有一个看起来像这样的对象,渲染线程不断访问它:

public class Renderable {
   void functionA(int foo)          { ... }
   void functionB(int foo, int bar) { ... }
   void functionC()                 { ... }
}

在我的逻辑线程中,我需要在随机点调用functionAfunctionBfunctionC,但由于对象位于不同的线程中,我无法在没有并发问题的情况下直接触摸 Renderable 。我真正想做的只是创建一个RenderableProxy与 具有相同接口的代理对象Renderable,它将存储对它的所有调用,然后Renderable在我对齐线程时在同步窗口期间将调用转发到。

该对象将如下所示:

public class RenderableProxy {
    Renderable target;

    void functionA(int foo)            { ? }
    void functionB(int foo, int bar)   { ? }
    void functionC()                   { ? }

    void execute()   {
        foreach( called_function )
           target.???      
    }             
}

现在我相信我可以实现这个,如果我创建了一些结构,它包含表示函数的枚举之类的信息,并存储参数,然后只保留所有这些直到我调用execute.

但真正让我恼火的是,每次我对Renderable界面进行更新时,我都必须返回RenderableProxy并修改界面以匹配,并修改execute以处理更改。这对我来说真的很乱,我觉得可能有一种语言功能可以以某种方式处理这个问题,这样每当我更改 Renderable 界面时,我都不必重写RenderableProxy来处理新功能。

是否有这样一个神奇的功能可以让我实现我的目标,而无需不断尝试保持两个不同对象(对象及其代理)的接口同步?我知道 java 有一些反射特性,但我有点害怕接触它,因为我担心在 60Hz 游戏中每秒执行几千次反射查找会影响性能。

4

1 回答 1

2

您可以使用代理类 ( http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Proxy.html ) 来实现这一点。
在此处查看如何使用它的好教程http://www.ibm.com/developerworks/java/library/j-jtp08305/index.html

基本上你需要 RenderableProxy 来实现 InvocationHandler。
- 在 RenderableProxy 的 invoke() 方法中,将要调用的方法存储在内存中
- 向 RenderableProxy 添加一个新的 executeAll() 方法,该方法执行所有存储的方法调用
- 随意调用 executeAll() 方法。

于 2012-04-11T05:13:28.590 回答