创建代理对象以异步方式调用目标方法(拆分逻辑/渲染线程)

时间:2012-04-11 01:29:39

标签: java reflection asynchronous

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

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

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

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并修改界面以匹配,并修改{{1}处理更改。这对我来说非常麻烦,我觉得可能有一种语言功能以某种方式处理这个问题,这样无论何时我改变Renderable接口,我都不必重写execute来处理新函数。

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

1 个答案:

答案 0 :(得分:2)

您可以使用Proxy类(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()方法。