2012-03-19 16 views
9

पहले थोड़ा सा संदर्भ: मैं स्कैला (प्रथम व्यक्ति शूटर-जैसी) में क्लाइंट/सर्वर गेम लिख रहा हूं, जहां क्लाइंट को सर्वर पर आंदोलन के इरादे भेजने की आवश्यकता है प्रति सेकंड कुछ दर्जन बार और सर्वर वास्तविक समय में, इकाई राज्यों को वापस भेजता है। दोनों क्लाइंट (ग्राफिकल तरलता के लिए) और सर्वर पक्ष पर जेबलेट का उपयोग करके इन इकाइयों का भौतिक सिमुलेशन है। जब भी कोई ग्राहक सर्वर से अद्यतन प्राप्त करता है, तो यह सर्वर के भेजे गए लोगों के साथ अपने स्थानीय राज्यों को प्रतिस्थापित करता है। निश्चित रूप से एक ही पल में एक ही सर्वर पर कई ग्राहक हो सकते हैं। संक्षेप में, इस एप्लिकेशन में अक्सर छोटे पैकेट के साथ संचार होता है।नेटवर्क पर अक्का के साथ स्कैला केस क्लासेस बनाम प्रोटोकॉल बफर

फिलहाल, मैं अक्का के कलाकारों का उपयोग सर्वर पर और पीछे नेटवर्क पर स्काला केस कक्षाओं को भेजने के लिए कर रहा हूं।

sealed trait PlayerMessage 
case class PlayerMove(dir: Vector3, run: Boolean) extends PlayerMessage 
// more case classes... 
तो ग्राहक पर

:

server ! PlayerMove(dir, run) 

सर्वर पर: यहाँ एक उदाहरण है

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 
} 

कहाँ ent.state एक 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... 

यह सब बहुत अच्छी तरह से काम कर रहा है लेकिन जैसा कि आप देख सकते हैं वहां कई केस क्लास हैं, कभी-कभी अन्य केस क्लास होते हैं, और क्लाइंट और सर्वर दोनों पर केस टेस्ट का एक समूह होता है।

  • मैं सीरियलाइजेशन, deserialization और मिलान से पैकेट आकार और ओवरहेड दोनों कैसे कम कर सकते हैं?
  • केस कक्षाओं के बजाय प्रोटोबफ का उपयोग करना मेरे आवेदन के पैकेट से वसा को काट देगा?
  • क्या मैं इस नेटवर्क प्रोटोकॉल के सुधार के लिए गलत जगह देख रहा हूं?

उत्तर

7

अक्का डिफ़ॉल्ट रूप से जावा क्रमबद्धता या Google प्रोटोबफ्स का उपयोग करता है (here और here देखें)। यदि आप सोचते हैं कि आप किसी ऐसे कोड को कोड कर सकते हैं जो आपके एप्लिकेशन के लिए अधिक अनुकूल है, तो आप अपने स्वयं के धारावाहिकों को परिभाषित कर सकते हैं।

यदि आप अपने नेटवर्क प्रोटोकॉल को अनुकूलित करना चाहते हैं, तो आपको वास्तव में आगे और आगे क्या भेजा जा रहा है यह जानने के लिए your favorite network sniffer को तोड़ना होगा। फिर आप बेहतर निर्णय ले सकते हैं कि क्या करना है।

सामान्य रूप से, हालांकि, आप शायद हाथ से बेहतर अनुकूलित नेटवर्क प्रोटोकॉल बना सकते हैं, लेकिन जब आपको परिवर्तन करने की आवश्यकता होती है तो यह भंगुर होने और ब्रेक होने की अधिक संभावना होती है (जब तक आपको नेटवर्क प्रोटोकॉल लिखने में बहुत अधिक अनुभव नहीं मिलता है) ।

+0

मैंने पहले से ही इन्हें पढ़ लिया था, लेकिन मुझे अभी भी अस्पष्ट नहीं है अगर एक केस क्लास को Google प्रोटोबफ के रूप में क्रमबद्ध किया गया है या नहीं; मुझे नहीं लगता। इसलिए मैं यह जानना चाहता हूं कि मैं अपने केस क्लास को प्रोटोबफ्स में बदलने से क्या प्राप्त कर सकता हूं, अगर यह बिल्कुल मूल्यवान है। उनके चारों ओर ओवरहेड किसी भी वास्तविक लाभ को हटा सकता है; Wireshark बाद में मदद कर सकते हैं। – gsimard

+0

यदि आपके पास 'proto =" akka.serialization.ProtobufSerializer "आपकी कॉन्फ़िगरेशन में है, तो Protobuf serialization के लिए उपयोग किया जाता है। – leedm777

+4

दस्तावेज़ों के प्रासंगिक खंड को पढ़ें: http://doc.akka.io/docs/akka/2.0/scala/serialization.html –