Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建代理对象以异步调用目标的方法(拆分逻辑/渲染线程)_Java_Reflection_Asynchronous - Fatal编程技术网

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

Java 创建代理对象以异步调用目标的方法(拆分逻辑/渲染线程),java,reflection,asynchronous,Java,Reflection,Asynchronous,在我的游戏设计中,我试图让逻辑和渲染线程尽可能并行运行。考虑到这一点,我需要一些方法将更新从游戏逻辑推送到渲染线程中,我希望找到最干净的方法来实现这一点 首先让我道歉,我只是一个爱好者,我真的不知道任何设计模式或正确的术语,所以如果我描述的是一个不同的名字,请让我知道 假设我有一个看起来像这样的对象,它不断地被渲染线程访问: public class Renderable { void functionA(int foo) { ... } void function

在我的游戏设计中,我试图让逻辑和渲染线程尽可能并行运行。考虑到这一点,我需要一些方法将更新从游戏逻辑推送到渲染线程中,我希望找到最干净的方法来实现这一点

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

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

public class Renderable {
   void functionA(int foo)          { ... }
   void functionB(int foo, int bar) { ... }
   void functionC()                 { ... }
}
在我的逻辑线程中,我需要在随机点调用
function
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的游戏中每秒执行几千次反射查找的性能影响。

您可以使用代理类()来实现这一点。
请在此处查看有关如何使用它的良好教程。

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

-随意调用executeAll()方法。

如果调用setA(1);刚毛(2);这是否仅等同于setA(2)?如果是这样,您不需要保存对setA的所有调用,然后运行foreach。如果不是,则setA是一个误导性的名称,称之为addA或smth。@AlexeiKaigorodov其目的是在同步期间,在代理上调用的每个函数也在实际对象上被调用。我还没有完全充实这个接口,但它也可能有一些不是严格意义上的setter函数,比如“incrementA”。规则可以归结为:代理截取函数调用,并在稍后对目标调用完全相同的函数。编辑示例以消除一些歧义。谢谢,这看起来确实很有趣,就像我正在寻找的一样。我有点担心每秒执行数百次/数千次反射的性能影响(我正在为移动设备编程),但如果这是最好的选择,可能值得一试。