【发布时间】:2010-10-17 14:30:21
【问题描述】:
我陷入了一种情况,我需要以多用户方式移动球,我正在使用 RMI 在移动 BALLS 的分布式动画中。
我的目标是以某种方式移动多个球,以便多个客户端观察球的相同运动/位置,我使用的是远程对象的球对象。
我的问题是: 我正在调用 move 函数,它是远程的,增加客户端数量会导致更频繁地调用该函数,并且由于增加 no 会导致球速越来越多来自不同客户端的对该方法的调用。
有人可以推荐我如何解决这个问题,当球已经在一个客户端上移动时,另一个球不会调用该函数而只是利用它。
这里是代码:
public void start() {
Play = true;
Thread t = new Thread(this);
t.start();
}
public void run() {
while (Play == true) {
runball();
pit.repaint();
try {
Thread.sleep(50);
} catch (InterruptedException ie) {
stop();
}
}
}
public void runball() {
try {
aBall.setBounds(pit.getWidth(), pit.getHeight());
aBall.move();
}
catch (Exception e) {
e.printStackTrace();
}
}
还有我的远程移动方法:
public void move() throws RemoteException {
// ... Move the ball at the give velocity.
m_x += m_velocityX;
m_y += m_velocityY;
if (m_x < 0) { // If at or beyond left side
m_x = 0; // Place against edge and
m_velocityX = -m_velocityX;
} else if (m_x > m_rightBound) { // If at or beyond right side
m_x = m_rightBound; // Place against right edge.
m_velocityX = -m_velocityX;
}
if (m_y < 0) { // if we're at top
m_y = 1;
m_velocityY = -m_velocityY;
} else if (m_y > m_bottomBound) { // if we're at bottom
m_y = m_bottomBound;
m_velocityY = -m_velocityY;
}
}
有人可以指导我吗,这个设计有一些问题,我以错误的方式使用 RMI?或者向我推荐一些可以实现我的目标的设计。
非常感谢,
吉比
【问题讨论】:
-
您是说如果球已经在移动,那么在球停止移动之前应该忽略其他请求?
-
“你是说如果球已经在移动,那么额外的请求应该被忽略”是的,“直到球停止移动”这还不是问题。
-
@static void main - 这可能是一个问题 - 请阅读下面 Stephen C 的帖子。如果客户端逐步将球移动到其目的地,则服务器没有机制知道客户端何时完成整个移动并完成。如果必须这样做,您将需要向服务器添加“锁定”和“解锁”功能。然后,客户端将能够拥有服务器,直到移动完成。请注意,如果客户端没有发出 unlock(),但您可能会遇到问题。
-
每个客户移动自己的球还是共享一个球?很抱歉很密集,但是 start()、run() 和 runBall() 方法是客户端的一部分还是服务器的一部分?
-
我以为你在谈论实现同步,这不是这里的问题。我只是想停止执行移动,因为没有更多的调用提高速度。比如 1 秒 = 1 调用,对于两个客户端1 秒 = 2 次通话,它会导致速度增加,所以我想忽略第二次通话。
标签: java implementation rmi distributed-computing