GameLoop.Networking
1.0.0
ไลบรารีเครือข่าย UDP สำหรับเกมที่สร้างใน GameLoop! มันมีระดับนามธรรมหลายระดับ เริ่มตั้งแต่ wrapper 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