Пользовательская сетевая библиотека и сериализация VS по умолчанию Сериализация и RMI - PullRequest
0 голосов
/ 26 июня 2011

У меня есть этот класс, я отправляю этот класс через RMI и через kryonet и kryo, я получаю массив из 10 объектов с обоими случаями rmi, в качестве возврата удаленного вызова метода и в случае эхо-запроса крионета с сервера наклиент с kryonet и kryo, у меня есть всего один объект 55 * 10, который 555, но с RMI 1196 байтов,

Являются ли эти результаты разумными?эти результаты похожи на это?

, почему так много различий ??

, какие накладные расходы или другие факторы задействованы за сценой,

, которые составляют столько общего вRMI и слишком большая разница и указывают мне.

И это 55 байтов для всего объекта в порядке? *.

Мне просто нужно некоторое подтверждение и экспертные взгляды, поскольку я должен представить эти результаты,

Я буду очень благодарен.

Это класс, который я использую с обоими:

public class TBall {

private float x, y; // Ball's center (x, y)
private float speedX, speedY; // Ball's speed per step in x and y
private float radius; // Ball's radius
private Color color; // Ball's color

public boolean collisionDetected = false;
public static boolean run = false;

private String name;

private float nextX, nextY;
private float nextSpeedX, nextSpeedY;

public TBall() {
    super();
}

public TBall(String name1, float x, float y, float radius, float speed,
        float angleInDegree, Color color) {
    this.x = x;
    this.y = y;
    // Convert velocity from polar to rectangular x and y.
    this.speedX = speed * (float) Math.cos(Math.toRadians(angleInDegree));
    this.speedY = speed * (float) Math.sin(Math.toRadians(angleInDegree));
    this.radius = radius;
    this.color = color;
    this.name = name1;
}

public String getName() {
    return this.name;
}

public float getSpeed() {
    return (float) Math.sqrt(speedX * speedX + speedY * speedY);
}

public float getMoveAngle() {
    return (float) Math.toDegrees(Math.atan2(speedY, speedX));
}

public float getRadius() {
    return radius;
}

public Color getColor() {
    return this.color;
}

public void setColor(Color col) {
    this.color = col;
}

public float getX() {
    return x;
}

public float getY() {
    return y;
}

public void setX(float f) {
    x = (int) f;
}

public void setY(float f) {
    y = (int) f;
}

public void move() {
    if (collisionDetected) {
        // Collision detected, use the values computed.
        x = nextX;
        y = nextY;
        speedX = nextSpeedX;
        speedY = nextSpeedY;
    } else {
        // No collision, move one step and no change in speed.
        x += speedX;
        y += speedY;
    }
    collisionDetected = false; // Clear the flag for the next step

    System.out.println("In serializedBall in move.");
}

public void collideWith() {

    float minX = 0 + radius;
    float minY = 0 + radius;
    float maxX = 0 + 640 - 1 - radius;
    float maxY = 0 + 480 - 1 - radius;

    double gravAmount = 0.9811111f;
    double gravDir = (90 / 57.2960285258);

    // Try moving one full step
    nextX = x + speedX;
    nextY = y + speedY;
    System.out.println("In serializedBall in collision.");

    // If collision detected. Reflect on the x or/and y axis
    // and place the ball at the point of impact.
    if (speedX != 0) {
        if (nextX > maxX) { // Check maximum-X bound
            collisionDetected = true;
            nextSpeedX = -speedX; // Reflect
            nextSpeedY = speedY; // Same
            nextX = maxX;
            nextY = (maxX - x) * speedY / speedX + y; // speedX non-zero
        } else if (nextX < minX) { // Check minimum-X bound
            collisionDetected = true;
            nextSpeedX = -speedX; // Reflect
            nextSpeedY = speedY; // Same
            nextX = minX;
            nextY = (minX - x) * speedY / speedX + y; // speedX non-zero
        }
    }
    // In case the ball runs over both the borders.
    if (speedY != 0) {
        if (nextY > maxY) { // Check maximum-Y bound
            collisionDetected = true;
            nextSpeedX = speedX; // Same
            nextSpeedY = -speedY; // Reflect
            nextY = maxY;
            nextX = (maxY - y) * speedX / speedY + x; // speedY non-zero
        } else if (nextY < minY) { // Check minimum-Y bound
            collisionDetected = true;
            nextSpeedX = speedX; // Same
            nextSpeedY = -speedY; // Reflect
            nextY = minY;
            nextX = (minY - y) * speedX / speedY + x; // speedY non-zero
        }
    }

    System.out.println("In serializedBall collision.");
    // speedX += Math.cos(gravDir) * gravAmount;
    // speedY += Math.sin(gravDir) * gravAmount;

    System.out.println("In serializedBall in collision.");
}

}

Спасибо.

1 Ответ

0 голосов
/ 27 июня 2011

Откуда вы взяли «55»? У вас есть:

9 операций с плавающей запятой, = 9x4 байта, всего 36 байтов 1 логическое значение, сериализованное как байт, всего 1 байт 1 строка, может быть любой длины 1 цвет, который в свою очередь содержит: 1 int, сериализованный как 4 байта 1 число с плавающей запятой, сериализованное как 4 байта 2 float [] длиной 3 каждый, сериализованные как 24 байта 1 цветовое пространство, которое в свою очередь содержит: 2 дюйма, сериализованные как 8 байтов

Общая сумма составляет не менее 77 байтов плюс все, что требуется для передачи строки.

Сериализация также отправляет информацию о классе, информацию о версиях и тег перед каждым элементом; RMI также отправляет информацию о методе. Все это может легко объяснить разницу. Я не знаю, что делают эти другие пакеты.

...