Ini adalah plug-in asli yang membagi data tertentu ( System.IntPtr atau array) ke dalam ukuran tertentu dan memulihkannya terlepas dari urutan inputnya. Ini ditujukan untuk kasus penggunaan seperti pengiriman data berukuran besar melalui UDP.
https://github.com/hecomi/uPacketDivision.git#upm ke Manajer Paket.https://registry.npmjs.comcom.hecomiSaat ini, ini hanya dibuat untuk Windows.
Buat Divider dan panggil Divide<T>(T[]) dengan array sebagai input (atau Divide(System.IntPtr, int size) ). Ini akan membagi paket secara internal.
Divider divider = new Divider ( ) ;
void Divide ( )
{
Texture2D image ;
var pixels = image . GetPixels32 ( ) ;
divider . maxPacketSize = packetSize ;
divider . Divide ( pixels ) ;
}Kemudian, kirimkan data yang dipisahkan ke remote dengan cara tertentu. Fungsi-fungsi berikut tersedia.
GetChunkCount() .GetChunk()byte[] dari data terpisahGetChunkSize(int index) .GetChunkData(int index) . uOSC . uOscClient client ;
void Send ( int width , int height )
{
client . Send ( "/Size" , width , height ) ;
for ( uint i = 0 ; i < divider . GetChunkCount ( ) ; ++ i )
{
client . Send ( "/Data" , divider . GetChunk ( i ) ) ;
}
} Jika Anda ingin menggunakan penunjuk dan ukuran secara langsung, gunakan GetChunkSize() dan GetChunkData() sebagai gantinya.
Gunakan Assembler untuk mengumpulkan data yang dikirimkan kepada Anda. Berikut adalah contoh bagian penerima yang menggunakan uOSC.
Assembler assembler = new Assembler ( ) ;
Texture2D texture ;
public void OnDataReceived ( uOSC . Message message )
{
if ( message . address == "/Size" )
{
var w = ( int ) message . values [ 0 ] ;
var h = ( int ) message . values [ 1 ] ;
OnSize ( w , h ) ;
}
else if ( message . address == "/Data" )
{
var data = ( byte [ ] ) message . values [ 0 ] ;
OnData ( data ) ;
CheckEvent ( ) ;
}
}
void OnSize ( int w , int h )
{
texture = new Texture2D ( w , h ) ;
}
void OnData ( byte [ ] data )
{
assembler . timeout = timeout ;
assembler . Add ( data ) ;
}Setiap kali Anda menambahkan data, periksa kelengkapan atau kehilangannya sebagai berikut.
void CheckEvent ( )
{
switch ( assembler . GetEventType ( ) )
{
case EventType . FrameCompleted :
{
OnDataAssembled ( assembler . GetAssembledData < Color32 > ( ) ) ;
break ;
}
case EventType . PacketLoss :
{
var type = assembler . GetLossType ( ) ;
Debug . LogWarning ( "Loss: " + type ) ;
break ;
}
default :
{
break ;
}
}
}Jika Anda ingin mendapatkan pointer dan ukurannya alih-alih array, tersedia API berikut.
var index = assembler . GetAssembledFrameIndex ( ) ;
var data = assembler . GetFrameData ( index ) ;
var size = assembler . GetFrameSize ( index ) ;
OnDataAssembled ( data , ( int ) size ) ;
assembler . RemoveFrame ( index ) ;Kemudian akan dilakukan rekonstruksi data sebagai berikut.
void OnDataAssembled ( Color32 [ ] pixels )
{
texture . SetPixels32 ( pixels ) ;
texture . Apply ( ) ;
GetComponent < Renderer > ( ) . material . mainTexture = texture ;
}