Anda memiliki dua hal yang sangat berbeda untuk dikelola:
Server harus mengelola seluruh dunia, secara otoritatif. Untuk itu, komunikasi dengan klien N (di mana N "besar") diperlukan.
Klien bisa , pada prinsipnya, tahu tentang seluruh dunia, tapi perlu tidak . Untuk klien, cukup mengetahui tentang apa yang ada di dekat pemain. Dengan asumsi misalnya partisi yang mirip grid yang agak kasar, perlu mengetahui hanya sel pemain dan 26 sel di sekitar pemain (atau 8 sel jika Anda memiliki grid 2D). Grid yang agak lebih baik lebih baik, tetapi Anda mendapatkan idenya.
Sekarang banyak pickup, apa itu "banyak"? Anda menggali mungkin 5 hal per detik, itu mungkin dua lusin angka yang perlu diperbarui di server, dan server mungkin harus mengirimkannya ke pemain lain yang bidang minatnya tumpang tindih sel Anda. Untuk komputer, ini adalah jumlah data yang cukup konyol, dan jumlah komputasi yang dapat diabaikan. Ini bisa menjadi tantangan ketika ada ratusan / ribu pemain di sel yang sama (maka paritioning Anda terlalu kasar).
Server tidak perlu tahu, atau peduli tentang rotasi pickup atau detail semacam itu. Kenapa harus begitu?
Klien sebenarnya juga tidak peduli, karena ini hanya permen mata yang bisa diganti oleh klien dengan cepat.
Apa yang diperlukan dari sudut pandang server adalah mengetahui bahwa Anda sedang menggali (30, 40, 50) di simpul tempat Anda berada, dan memutuskan bahwa ini memunculkan misalnya tiga objek tipe 5, atau satu objek tipe 7 dengan hitungan 3. Hanya itu yang peduli, dan hanya itu yang memberitahu Anda. Ini juga akan mencakup informasi dalam data yang dikirimkan kepada seseorang yang memindahkan bidang minatnya ke sel jaringan nanti (dengan asumsi itu masih ada saat itu).
Klien diberitahu tiga objek yang muncul di sana, bla bla. Sekarang, apakah klien menampilkan peta ASCII-art di mana sekarang ada 'D' atau apakah itu menunjukkan tumpukan tanah yang berputar, itu semua sama. Apakah tumpukan memiliki rotasi yang berbeda atau apakah hanya yang dekat dengan pemutar Anda juga tetap sama. Hanya saja hal-hal yang ditampilkan pada monitor Anda, tidak mempengaruhi orang lain.
Jadi, dalam kasus beton yang ingin Anda putar hanya tumpukan tanah di dekatnya, Anda bisa melakukan pemeriksaan jangkauan pada semua objek yang Anda ketahui. Karena kumpulan data tidak besar, bahkan kekuatan kasar pada semuanya akan bekerja.
Anda dapat (dan harus) bergantung pada ukuran partisi Anda, memangkas sel-sel grid yang terlalu jauh.
Anda dapat, tentu saja, lebih jauh membuat sub-partisi sel Anda dan menggunakan sesuatu yang super pintar. Gunakan kd-Tree jika Anda mau, tetapi jangan berharap keuntungan besar. Anda dapat memangkas barang dengan Manhattan distace, atau Anda dapat mengurutkan barang-barang Anda di kotak kecil Anda sendiri ... tetapi mengapa?
Pemeriksaan jarak (benar-benar jarak kuadrat, tetapi sama dengan Anda) adalah hanya dua perkalian dan tambahan (dioptimalkan untuk MUL, MADD, jadi benar-benar hanya dua operasi), diikuti oleh cabang atau gerakan kondisional. Itu hampir sama cepatnya dengan operasi lain yang tidak memangkas seluruh sel kotak sekaligus. Bahkan, ini adalah sesuatu yang bahkan dapat Anda lakukan pada GPU ...
Melihat bagaimana Anda akan memiliki beberapa ratus, atau paling banyak beberapa ribu pemeriksaan jarak terhadap posisi yang sama (jarak kuadrat berfungsi dengan baik), Anda benar-benar tidak mengalami banyak kesulitan hanya melakukan perhitungan itu, bahkan lebih karena itu agak cache- iterasi ramah atas memori yang berdekatan, dan dengan gerakan bersyarat, itu murah. Sesuatu seperti (kodesemu)rot = r[i] + 1; r[i] = ((dx*dx+dy*dy) < DIST_SQ) ? rot : r[i];
. Itu satu iterasi pada array beberapa ratus nilai per frame. Komputer tidak peduli tentang melakukan itu, itu adalah banyak dan toko yang berdekatan, ALU sederhana, tidak ada cabang, dan hanya beberapa ribu iterasi.
Ini (banyak-ke-satu) bukan kelas masalah yang sama (banyak-ke-banyak) seperti pada server. Sungguh, klien bukanlah masalahnya.
minecraft:dirt
) dan hitungan (30), sehingga ketika pemain cukup dekat untuk mengambilnya, itu hanya menambahkan sebanyak mungkin hitungan ke inventaris pemain. Jika pemain hanya memiliki ruang untuk 6 item dan setumpuk 30 berada di tanah, pemain akan mengambil 6, dan tumpukan pada hitungan tanah dikurangi menjadi 24.