GameLoop.Networking
1.0.0
مكتبة شبكات UDP للألعاب المصنوعة في GameLoop! وهو يوفر مستويات تجريد متعددة، بدءًا من غلاف UDP البسيط ذي المستوى المنخفض وحتى المستويات الأعلى.
// Spin up a socket listener. It listens for datagrams from any network address, on the specified port.
var peer = new NetworkSocket ( memoryPool ) ;
peer . Bind ( new IPEndPoint ( IPAddress . Any , port ) ) ;
// Send data. It sends data to the specified network address and port.
peer . SendTo ( new IPEndPoint ( IPAddress . Loopback , port ) ) ;
// Polling for data. It fetches a message from the receiving queue, if any. If nothing has been received, it just returns "false".
while ( peer . Poll ( out NetworkArrivedData message ) )
{
var addressFrom = message . EndPoint ;
var receivedData = message . Data
// Execute your logic on received data.
}
لا تقوم المكتبة بتخصيص الذاكرة مباشرة. بدلاً من ذلك فإنه يفوض هذه المسؤولية إلى واجهتين: IMemoryPool وIMemoryAllocator. ومن خلال تنفيذ هذه الواجهات، يمكنك التحكم في كيفية تخصيص الذاكرة وإدارتها في تطبيقك. تحتوي المكتبة على مُخصص تافه ومجموعة تافهة يمكنك استخدامها لإنشاء النموذج الأولي بسرعة.
var memoryAllocator = new SimpleManagedAllocator ( ) ;
var memoryPool = new SimpleMemoryPool ( memoryAllocator ) ;
تتضمن المكتبة بعض الهياكل الملائمة للعمل مع المخازن المؤقتة، لمساعدة المستخدم على الكتابة/القراءة منها/و منها.
// Reading from a buffer.
byte [ ] buffer = message . Data ;
var reader = default ( NetworkReader ) ;
reader . Initialize ( ref buffer ) ;
int myInt = reader . ReadInt ( ) ;
long myLong = reader . ReadLong ( ) ;
float myFloat = reader . ReadFloat ( ) ;
string myString = reader . ReadString ( ) ;
// etc
// Writing to a buffer.
var writer = default ( NetworkWriter ) ;
// 1) You can manually manage the buffer:
/* 1) */ byte [ ] buffer = memoryPool . Rent ( size ) ;
/* 1) */ writer . Initialize ( ref buffer ) ;
// NOTE: in this way the writer will NOT expand the buffer if a Write call requires more space.
// OR
// 2) You can let the writer to manage internally the buffer:
/* 2) */ writer . Initialize ( memoryPool , initialSize ) ;
// NOTE: this will automatically expand the buffer if a Write call requires more space.
// OR
// 3) You can pass a buffer to copy its initial state, but let the writer to manage its own buffer internally:
/* 3) */ byte [ ] initialState = memoryPool . Rent ( size ) ;
/* 3) */ writer . Initialize ( memoryPool , ref initialState ) ;
// NOTE: this will automatically expand the buffer if a Write call requires more space.
writer . Write ( 12 ) ;
writer . Write ( 24f ) ;
writer . Write ( "36" ) ;
// etc