在我的游戏设计中,我试图让逻辑和渲染线程尽可能并行运行。鉴于此,我需要一些方法将更新从游戏逻辑推送到渲染线程,我想找到最简洁的方法来做到这一点。
首先让我道歉,因为我只是一个业余爱好者,我真的不知道任何设计模式或正确的术语,所以如果我所描述的是不同的名称,请告诉我。
假设我有一个看起来像这样的对象,它会被渲染线程不断访问:
public class Renderable {
void functionA(int foo) { ... }
void functionB(int foo, int bar) { ... }
void functionC() { ... }
}
我需要在逻辑线程中的随机点调用functionA
,functionB
和functionC
,但由于对象位于不同的线程中,因此我无法在没有并发的情况下直接触及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游戏中每秒执行反射查找几千次的性能影响。
答案 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()方法。