在我的游戏设计中,我试图让逻辑和渲染线程尽可能并行运行。鉴于此,我需要一些方法将游戏逻辑中的更新推送到渲染线程中,并且我想找到最干净的方法来做到这一点。
首先让我道歉,因为我只是一个业余爱好者,我真的不知道任何设计模式或正确的术语,所以如果我所描述的内容有不同的名称,请告诉我。
假设我有一个看起来像这样的对象,渲染线程不断访问它:
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
并修改界面以匹配,并修改execute
以处理更改。这对我来说真的很乱,我觉得可能有一种语言功能可以以某种方式处理这个问题,这样每当我更改 Renderable 界面时,我都不必重写RenderableProxy
来处理新功能。
是否有这样一个神奇的功能可以让我实现我的目标,而无需不断尝试保持两个不同对象(对象及其代理)的接口同步?我知道 java 有一些反射特性,但我有点害怕接触它,因为我担心在 60Hz 游戏中每秒执行几千次反射查找会影响性能。