gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:49:41 25 4
gpt4 key购买 nike

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

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

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

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

我需要调用functionA , functionB ,和functionC在我的逻辑线程期间的随机点,但由于对象位于不同的线程中,我无法直接触摸 Renderable 而不会出现并发问题。我真正想做的只是创建一个代理对象 RenderableProxyRenderable 具有相同的界面,它将存储对其的所有调用,然后将调用转发到 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并修改接口(interface)进行匹配,并修改execute来处理变化。这对我来说真的很困惑,我觉得可能有一种语言功能可以以某种方式处理这个问题,这样每当我更改可渲染接口(interface)时,我就不必重写 RenderableProxy处理新功能。

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

最佳答案

您可以使用 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 来实现 InitationHandler。
- RenderableProxy的invoke()方法中将要调用的方法存储在内存中
- 将新的executeAll()方法添加到RenderableProxy,该方法执行所有存储的方法调用
- 随意调用executeAll()方法。

关于java - 创建代理对象以异步调用目标方法(拆分逻辑/渲染线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10098727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com