2012-03-19 15 views
9

Một chút ngữ cảnh trước tiên: Tôi đang viết một trò chơi máy khách/máy chủ trong Scala (người đầu tiên giống như game bắn súng), nơi khách hàng cần gửi ý định di chuyển đến máy chủ một vài chục lần mỗi giây và máy chủ gửi trạng thái thực thể trở lại, trong thời gian thực. Có mô phỏng vật lý của các thực thể này bằng cách sử dụng JBullet trên cả máy khách (đối với tính lưu động đồ họa) và phía máy chủ. Bất cứ khi nào một khách hàng nhận được các bản cập nhật từ máy chủ, nó sẽ thay thế các trạng thái cục bộ của nó bằng các máy chủ được gửi đi. Có thể có nhiều khách hàng trên cùng một máy chủ tại một thời điểm nhất định, tất nhiên. Trong ngắn hạn, trong giao tiếp ứng dụng này xảy ra thường xuyên, với các gói nhỏ.Scala Case Classes so với Protocol Buffers với Akka qua mạng

Hiện tại, tôi đang sử dụng các diễn viên của Akka để gửi các lớp học Scala một cách ngây thơ qua mạng đến máy chủ và ngược lại. Dưới đây là một ví dụ:

sealed trait PlayerMessage 
case class PlayerMove(dir: Vector3, run: Boolean) extends PlayerMessage 
// more case classes... 

Sau đó trên máy khách:

server ! PlayerMove(dir, run) 

Trên máy chủ:

def receive = { 
    case pm: PlayerMessage => pm match { 
    case p @ PlayerMove(dir, run) => 
     // Move the player 
     world.playerMove(dir,run) 

     // More case tests.. 
    } 

    // Send back entity states (this in fact occurs elsewhere, asynchronously) 
    world.entities.foreach(ent => client ! ent.state())) 

    // More message testing ... 
    case _ => // ignore 
} 

đâu ent.state trả về một EntityState:

case class BulletState(pos: Vector3, quat: Vector4, lin: Vector3, ang: Vector3) 

sealed trait EntityState 
case class EntityStatePlayer(id: Int, bullet: BulletState) extends EntityState 
// more case classes... 

Đây là tất cả hoạt động khá tốt nhưng bạn có thể thấy có rất nhiều trường hợp lớp, đôi khi có chứa các trường hợp các lớp khác, và một loạt các trường hợp kiểm tra trên cả máy khách và máy chủ.

  • Làm cách nào để có thể giảm kích thước gói và chi phí từ việc tuần tự hóa, deserialization và khớp?
  • Việc sử dụng Protobuf thay vì các trường hợp có làm giảm chất béo trong các gói ứng dụng của tôi không?
  • Tôi có đang tìm địa chỉ sai để cải thiện giao thức mạng này không?

Trả lời

7

Akka sử dụng Java serialization hoặc Google Protobufs theo mặc định (xem herehere). Bạn có thể xác định serializers của riêng bạn, nếu bạn nghĩ rằng bạn có thể mã lên một cái gì đó được tối ưu hóa hơn cho ứng dụng của bạn.

Nếu bạn muốn tối ưu hóa giao thức mạng, bạn sẽ phải thoát ra khỏi your favorite network sniffer để tìm hiểu những gì thực sự được gửi qua lại. Sau đó, bạn có thể quyết định tốt hơn để làm gì. Tuy nhiên, nói chung, bạn có thể tạo giao thức mạng được tối ưu hóa tốt hơn bằng tay, nhưng nó dễ bị vỡ và vỡ khi bạn cần thay đổi (trừ khi bạn có nhiều kinh nghiệm viết các giao thức mạng). .

+0

Tôi đã đọc những điều này, nhưng tôi vẫn chưa rõ liệu một trường hợp có được sắp xếp theo thứ tự là Google Protobuf hay không; Tôi đoán là không. Vì vậy, tôi muốn tìm hiểu những gì tôi có thể nhận được từ việc chuyển đổi các trường hợp của tôi thành Protobufs, nếu nó đáng giá. Overhead xung quanh họ có thể loại bỏ bất kỳ lợi ích thực sự; Wireshark có thể giúp đỡ sau này. – gsimard

+0

Nếu bạn có 'proto =" akka.serialization.ProtobufSerializer "' trong cấu hình của bạn, Protobuf được sử dụng cho tuần tự hóa. – leedm777

+4

Đọc phần có liên quan của tài liệu: http://doc.akka.io/docs/akka/2.0/scala/serialization.html –