Berikut ini adalah rangkuman permasalahan dalam menerapkan komponen socket berperforma tinggi, jika Anda hanya perlu berurusan dengan ribuan aplikasi bersamaan, maka Anda dapat memperhatikan penulisan kode, tetapi Anda perlu menghadapi puluhan ribu atau puluhan ribu aplikasi bersamaan. Ringkasan dari pertanyaan-pertanyaan berikut diyakini sangat membantu penulisan aplikasi ini.
SocketAsyncEventArgs
Objek ini disediakan setelah .NET 2.0 sp1 dan terutama digunakan untuk mengimplementasikan pemrosesan pengiriman dan penerimaan data soket berperforma tinggi (untuk pengenalan yang lebih rinci, Anda dapat pergi ke MSDN). Objek ini menyediakan tiga cara untuk mengatur buffer untuk mengirim dan menerima pengiriman terkait, SetBuffer(Int32, Int32), SetBuffer(Byte(), Int32, Int32, BufferList, dua yang pertama tidak dapat hidup berdampingan dengan yang terakhir ( MSDN menjelaskan alasannya). Saat Anda mengatur Buffer, apakah itu SetBuffer(Byte(), Int32, Int32) atau BufferList, coba atur hanya sekali per instans SocketAsyncEventArgs selama masa pakai program, karena pengaturan ini bisa sangat intensif sumber daya. Disarankan untuk mengatur buffer data melalui SetBuffer(Byte(), Int32, Int32) selama konstruksi SocketAsyncEventArgs, lalu gunakan SetBuffer(Int32, Int32) untuk menanganinya. Ketika Anda ingin mengatur BufferList, sebaiknya tidak mengubah <byte>sumber byte[] yang direferensikan oleh IList<ArraySegment>. Jika diubah, itu akan menyebabkan SocketAsyncEventArgs mengikat ulang buffer dan memengaruhi efisiensi.
Kumpulan SocketAsyncEventArgs
Seperti disebutkan di atas, cobalah untuk tidak mengubah buffer yang direferensikan oleh SocketAsyncEventArgs sebanyak mungkin, untuk mencapai tujuan ini. Oleh karena itu, perlu untuk membangun kumpulan aplikasi SocketAsyncEventArgs dan menginisialisasi objek SocketAsyncEventArgs sebanyak mungkin di awal program. Selain mengurangi pembuatan SocketAsyncEventArgs, membangun kumpulan juga dapat sangat menghemat memori. Alasan utamanya adalah Anda tidak dapat mengetahui seberapa besar setiap pesan, tentu saja, Anda dapat memberikan batas maksimum pesan sebelum mendesain, dan kemudian mengatur buffer yang sesuai dengan SocketAsyncEventArgs. Namun, ini membuang-buang memori yang besar, karena tidak semua pesan memiliki panjang maksimum. Alokasikan jumlah ukuran buffer yang sesuai ke SocketAsyncEventArgs, berikan panggilan melalui kumpulan, dan tulis pesan secara fleksibel ke satu atau beberapa SocketAsyncEventArgs, atau simpan beberapa pesan dalam satu SocketAsyncEventArgs untuk diproses.
antrian
Saya melihat bahwa banyak praktik adalah membuka utas secara langsung atau membuangnya ke kumpulan utas setelah menerima data, yang sangat buruk karena tidak mengontrol pekerjaan utas dengan lebih baik, termasuk menunggu utas. Dengan utas kustom + antrean, Anda dapat mengontrol berapa banyak utas yang bertanggung jawab atas pekerjaan apa yang berfungsi, dan pekerjaan yang diantrek hanya akan ada dalam antrean; Tidak akan ada sejumlah besar utas atau sejumlah besar baris yang menunggu, yang akan menyebabkan sistem operasi kehilangan sumber daya karena penjadwalan utas.
Konsolidasi data yang tertunda
Transmisi data penggabungan yang tertunda adalah sarana untuk memecahkan masalah operasi IO jaringan yang berlebihan, yang tidak digunakan dalam banyak skenario, tetapi umum di server game. Seseorang mengajukan pertanyaan kepada saya sebelumnya, jika ada 400 pengguna dalam adegan, setiap perubahan lingkungan pengguna akan memberi tahu pengguna lain. Jika data gabungan tidak digunakan, itu akan menghasilkan operasi IO jaringan yang sangat menakutkan, yang sulit dibawa oleh sistem nomor operasi IO. Oleh karena itu, perlu untuk menggabungkan dan mengirim data dalam interval penundaan yang sesuai untuk aplikasi saat ini. |