Terima kasih kepada Vincent Quarles untuk membantu rakan -rakan mengkaji artikel ini.
Dalam tutorial ini, kami akan menyelesaikan pelaksanaan fungsi Simpan dan Beban dalam permainan kami. Dalam tutorial sebelumnya mengenai penjimatan dan memuatkan data permainan pemain dalam perpaduan, kami berjaya menyelamatkan dan memuatkan data yang berkaitan dengan pemain seperti statistik dan inventori, tetapi sekarang kami akan menangani bahagian yang paling sukar-objek dunia. Sistem akhir harus mengingatkan permainan Elder Scrolls - setiap objek yang disimpan tepat di mana ia berada, untuk jumlah masa yang tidak terbatas.
Jika anda memerlukan projek untuk berlatih, inilah versi projek yang kami selesaikan dalam tutorial terakhir. Ia telah dinaik taraf dengan sepasang objek interaksasi dalam permainan yang menanam barang-satu ramuan dan satu pedang. Mereka boleh dilahirkan dan
dipilih (
desported ), dan kita perlu menyimpan dan memuatkan keadaan mereka dengan betul. Versi siap projek (dengan sistem simpan sepenuhnya dilaksanakan) boleh didapati di bahagian bawah artikel ini.
Projek GitHub Page
Projek Zip Muat turun
Takeaways Key
- Gunakan sistem peristiwa perwakilan untuk memberitahu objek apabila menyelamatkan keadaan mereka, meningkatkan modulariti dan fleksibiliti sistem simpan/beban anda.
- Melaksanakan objek induk tahap untuk menguruskan pemijahan dan penggabungan objek, memastikan objek dunia mengekalkan keadaan mereka di seluruh sesi permainan.
- Gunakan kelas berseri untuk menyimpan sifat objek seperti kedudukan, yang boleh diperluas atau diubahsuai dengan mudah untuk pelbagai jenis objek.
- Pastikan langganan dan langganan yang betul untuk menyimpan peristiwa dalam skrip objek untuk mengelakkan kesilapan dan menguruskan keadaan permainan dengan berkesan.
- Membangunkan sistem yang mantap untuk menjimatkan dan memuatkan menggunakan pemformatan binari untuk mengendalikan struktur data yang kompleks dan memastikan integriti data.
- Uji dan memperluaskan sistem untuk memasukkan jenis objek dan fungsi baru, menunjukkan kebolehsuaian dan skalabiliti sistem untuk keperluan pembangunan permainan yang berbeza.
kita perlu memecahkan sistem penjimatan dan memuatkan objek sebelum kita melaksanakannya. Pertama dan terpenting, kita memerlukan beberapa jenis
Objek Tahap objek yang akan bertelur dan menghina objek. Ia perlu menanam objek yang disimpan di peringkat (jika kita memuatkan tahap dan tidak memulakan lagi), Despawn mengambil objek, memberitahu objek yang mereka perlukan untuk menyelamatkan diri, dan menguruskan senarai objek. Bunyi seperti banyak, jadi mari kita masukkan ke dalam carta aliran:
Pada dasarnya, keseluruhan logik menyimpan senarai objek ke cakera keras - yang, pada masa akan datang tahap dimuatkan, akan dilalui, dan semua objek daripadanya menghasilkan ketika kita mula bermain. Kedengarannya mudah, tetapi syaitan berada dalam butiran: bagaimana kita tahu objek mana yang hendak disimpan dan bagaimana kita menanamnya kembali?
Delegasi dan peristiwa
Dalam artikel sebelumnya, saya nyatakan kami akan menggunakan sistem perwakilan-peristiwa untuk memberitahu objek yang mereka perlukan untuk menyelamatkan diri. Mari kita terlebih dahulu jelaskan apa perwakilan dan peristiwa.
Anda boleh membaca dokumentasi perwakilan rasmi dan dokumentasi acara rasmi. Tetapi jangan risau: walaupun saya tidak faham banyak Technobabble dalam dokumentasi rasmi, jadi saya akan meletakkannya dalam bahasa Inggeris biasa:
Delegate
Anda boleh memikirkan perwakilan sebagai pelan fungsi fungsi. Ia menerangkan apa fungsi yang sepatutnya kelihatan: apakah jenis pulangannya dan apa argumen yang diterima. Contohnya:
public delegate void SaveDelegate(object sender, EventArgs args);Delegasi ini menerangkan fungsi yang mengembalikan apa -apa (tidak sah) dan menerima dua argumen standard untuk rangka kerja .NET/MONO: Objek generik yang mewakili pengirim acara, dan argumen akhirnya yang boleh anda gunakan untuk lulus pelbagai data. Anda tidak perlu bimbang tentang ini, kita hanya boleh lulus (null, null) sebagai hujah, tetapi mereka perlu berada di sana.
Jadi bagaimana ikatan ini dengan peristiwa?
peristiwa
Anda boleh memikirkan peristiwa sebagai kotak fungsi
. Ia hanya menerima fungsi yang sepadan dengan perwakilan (cetak biru), dan anda boleh meletakkan dan mengeluarkan fungsi daripadanya semasa runtime namun anda mahu.
public event SaveDelegate SaveEvent;Syntax ini berkata: Mengisytiharkan acara awam (sesiapa sahaja boleh melanggannya - kami akan sampai pada masa itu), yang menerima fungsi seperti yang diterangkan oleh Savedelegate Delegate (lihat di atas), dan ia dipanggil SaveEvent.
melanggan dan berhenti berlangganan
Melanggan peristiwa pada dasarnya bermaksud 'meletakkan fungsi dalam kotak'. Sintaks agak mudah. Mari kita anggap acara kami diisytiharkan dalam kelas GlobalObject yang terkenal dan kami mempunyai beberapa kelas objek ramuan bernama
Potondroppable yang perlu melanggan peristiwa:
//In PotionDroppable's Start or Awake function: GlobalObject.Instance.SaveEvent += SaveFunction; //In PotionDroppable's OnDestroy() function: GlobalObject.Instance.SaveEvent -= SaveFunction; //[...] public void SaveFunction (object sender, EventArgs args) { //Here is code that saves this instance of an object. }mari kita jelaskan sintaks di sini. Kita perlu mempunyai fungsi yang mematuhi piawaian perwakilan yang diterangkan. Dalam skrip objek, terdapat fungsi sedemikian bernama SaveFunction. Kami akan menulis sendiri kemudian, tetapi buat masa ini mari kita anggap bahawa ia adalah fungsi kerja untuk menyimpan objek ke cakera keras supaya ia dapat dimuatkan kemudian.
Apabila kita memilikinya, kita hanya meletakkan fungsi itu di dalam kotak pada permulaan atau terjaga skrip dan mengeluarkannya apabila ia dimusnahkan. (Berhenti melanggan adalah sangat penting: jika anda cuba memanggil fungsi objek yang dimusnahkan, anda akan mendapat pengecualian rujukan null pada masa runtime). Kami melakukan ini dengan mengakses objek acara yang diisytiharkan, dan menggunakan pengendali tambahan diikuti dengan nama fungsi.
Nota: Kami tidak memanggil fungsi menggunakan kurungan atau argumen; Kami hanya menggunakan nama fungsi, tidak ada yang lain.
jadi mari kita jelaskan apa yang akhirnya dilakukan dalam beberapa contoh aliran permainan.
aliran logik
Mari kita anggap bahawa, melalui aliran permainan, tindakan pemain telah menghasilkan dua pedang dan dua ramuan di dunia (contohnya, pemain membuka dada dengan rampasan).
Empat objek ini mendaftarkan fungsi mereka dalam acara SAVE:
Sekarang mari kita anggap pemain mengambil satu pedang dan satu ramuan dari dunia. Memandangkan objek 'diambil', mereka berkesan mencetuskan perubahan dalam inventori pemain dan kemudian memusnahkan diri mereka (jenis runtuhan sihir, saya tahu):
Dan kemudian, anggap pemain memutuskan untuk menyelamatkan permainan - mungkin mereka benar -benar perlu menjawab telefon yang berbunyi tiga kali sekarang (hei, anda membuat permainan yang hebat):
kod
mari kita mula -mula pergi ke projek sedia ada dan membiasakan diri dengan apa yang ada di dalamnya.
Seperti yang anda lihat, kami mempunyai kotak -kotak yang direka dengan indah yang bertindak sebagai spawners untuk kedua -dua objek yang telah kami sebutkan. Terdapat pasangan dalam setiap dua adegan. Anda boleh melihat masalahnya dengan segera: Jika anda beralih ke tempat kejadian atau gunakan
F5/F9 untuk menyimpan/memuatkan, objek yang ditanam akan hilang.
Kotak spawners dan objek yang dilahirkan sendiri menggunakan mekanik antara muka yang mudah diinterakkan yang memberikan kita keupayaan untuk mengenali raycast kepada objek tersebut, menulis teks pada skrin, dan berinteraksi dengan mereka menggunakan kekunci [e].
tidak banyak lagi yang ada. Tugas kami di sini adalah:
- Buat senarai objek ramuan
- Buat senarai objek pedang
- Melaksanakan acara Simpan Global
- melanggan acara menggunakan fungsi penjimatan
- melaksanakan objek induk tahap
- Buat tahap induk bertelur semua objek yang disimpan jika kita memuatkan permainan.
seperti yang anda lihat, ini tidak betul -betul seperti yang remeh kerana seseorang mungkin berharap fungsi asas seperti itu. Malah, tiada enjin permainan yang ada di luar sana (CryEngine, UDK, Unreal Engine 4, yang lain) benar -benar mempunyai pelaksanaan fungsi Simpan/Beban yang mudah untuk pergi. Ini kerana, seperti yang anda bayangkan, simpan mekanik benar -benar spesifik untuk setiap permainan. Terdapat lebih banyak lagi kelas objek yang biasanya memerlukan penjimatan; Ia adalah negara -negara dunia seperti pencarian yang lengkap/aktif, keramahan/permusuhan puak, walaupun keadaan cuaca semasa dalam beberapa permainan. Ia menjadi agak rumit, tetapi dengan asas yang tepat dari mekanik penjimatan, ia mudah untuk hanya menaik tarafnya dengan lebih banyak fungsi.
Senarai Kelas Objek
mari kita mulakan dengan perkara mudah terlebih dahulu - senarai objek. Data pemain kami disimpan dan dimuatkan melalui perwakilan mudah data dalam kelas Serializable.
untuk menyusun kod kami dengan baik, kami akan bermula dengan kelas mudah pada akhir serializable kami:
public delegate void SaveDelegate(object sender, EventArgs args);Anda mungkin tertanya -tanya mengapa kami tidak hanya menggunakan kelas asas. Jawapannya ialah kita boleh, tetapi anda tidak pernah tahu bila anda perlu menambah atau menukar sifat item tertentu yang memerlukan penjimatan. Dan selain itu, ini jauh lebih mudah untuk kebolehbacaan kod.
Sekarang, anda mungkin perasan saya menggunakan istilah
droppable banyak. Ini kerana kita perlu membezakan antara objek droppable (boleh ditanam), dan objek yang boleh diletakkan, yang mengikuti peraturan penjimatan dan pemijahan yang berlainan. Kami akan sampai ke sana kemudian.
public delegate void SaveDelegate(object sender, EventArgs args);
Tempat terbaik untuk membuat contoh senarai ini akan menjadi kelas GlobalControl kami:
public event SaveDelegate SaveEvent;
senarai kami cukup baik untuk pergi sekarang: kami akan mengaksesnya dari objek levelmaster kemudian apabila kami perlu menanam barang, dan menyimpan/beban dari cakera keras dari dalam GlobalControl, seperti yang telah kami lakukan dengan data pemain .
Delegasi dan Acara
ah, akhirnya. Mari kita melaksanakan perkara acara yang terkenal.
dalam GlobalControl:
//In PotionDroppable's Start or Awake function: GlobalObject.Instance.SaveEvent += SaveFunction; //In PotionDroppable's OnDestroy() function: GlobalObject.Instance.SaveEvent -= SaveFunction; //[...] public void SaveFunction (object sender, EventArgs args) { //Here is code that saves this instance of an object. }
seperti yang anda lihat, kami membuat acara rujukan statik, jadi lebih logik dan lebih mudah untuk bekerja dengan kemudian.
Satu nota akhir mengenai pelaksanaan acara: Hanya kelas yang mengandungi perisytiharan peristiwa boleh membakar peristiwa. Sesiapa sahaja boleh melanggannya dengan mengakses GlobalControl.SaveEvent = ..., tetapi hanya kelas GlobalControl yang boleh membakarnya menggunakan SaveEvent (null, null);. Cuba menggunakan GlobalControl.SaveEvent (null, null); Dari tempat lain akan mengakibatkan ralat pengkompil!
Dan itu sahaja untuk pelaksanaan acara! Mari kita langgan beberapa perkara untuk itu!
Langganan Acara
Sekarang bahawa kita mempunyai acara kita, objek kita perlu melanggannya, atau, dengan kata lain, mula mendengar
ke acara dan bertindak balas apabila ia api.
kita memerlukan fungsi yang akan dijalankan apabila kebakaran peristiwa - untuk setiap objek. Mari kita pergi ke skrip Potondropplable dalam folder pickups
. Nota: Pedang tidak mempunyai skripnya lagi; Kami akan membuatnya seketika!
di potondropplable, tambahkan ini:
[Serializable] public class SavedDroppablePotion { public float PositionX, PositionY, PositionZ; } [Serializable] public class SavedDroppableSword { public float PositionX, PositionY, PositionZ; }Kami betul -betul melanggan dan berhenti melanggan acara. Sekarang persoalannya tetap, bagaimana untuk menyelamatkan objek ini dalam senarai, betul -betul? Kami perlu pastikan kami mempunyai senarai objek yang diasaskan untuk adegan semasa. Dalam GlobalControl.CS:
[Serializable] public class SavedDroppableList { public int SceneID; public List<saveddroppablepotion> SavedPotions; public List<saveddroppablesword> SavedSword; public SavedDroppableList(int newSceneID) { this.SceneID = newSceneID; this.SavedPotions = new List<saveddroppablepotion>(); this.SavedSword = new List<saveddroppablesword>(); } }</saveddroppablesword></saveddroppablepotion></saveddroppablesword></saveddroppablepotion>Fungsi ini perlu dipecat sekali setiap peringkat. Masalahnya, GlobalControl kami membawa melalui tahap dan fungsi permulaan dan terjaga hanya api sekali. Kami akan mendapatkannya dengan hanya memanggil fungsi ini dari objek induk tahap kami yang akan kami buat dalam seketika. Kami akan memerlukan fungsi pembantu kecil untuk mengembalikan senarai adegan aktif semasa juga. Dalam GlobalControl.CS:
public List<saveddroppablelist> SavedLists = new List<saveddroppablelist>(); </saveddroppablelist></saveddroppablelist>Sekarang kami pasti kami sentiasa mempunyai senarai untuk menyimpan item kami. Mari kembali ke skrip ramuan kami:
public delegate void SaveDelegate(object sender, EventArgs args); public static event SaveDelegate SaveEvent;
Ini adalah di mana semua salutan gula sintaksis kami benar -benar bersinar. Ini sangat mudah dibaca, mudah difahami dan mudah diubah untuk keperluan anda sendiri apabila anda memerlukannya! Singkatnya, kami membuat perwakilan 'ramuan' baru, dan menyimpannya dalam senarai sebenar.
Membuat objek induk tahap
Pertama, sedikit penyediaan. Di dalam projek kami yang sedia ada, kami mempunyai pemboleh ubah global yang memberitahu kami jika tempat kejadian dimuatkan. Tetapi kita tidak mempunyai pemboleh ubah sedemikian untuk memberitahu kita jika adegan sedang peralihan dengan menggunakan pintu. Kami mengharapkan semua objek yang jatuh untuk masih berada di sana ketika kami kembali ke bilik sebelumnya, walaupun kami tidak menyimpan/memuatkan permainan kami di mana saja di antara.
untuk berbuat demikian, kita perlu membuat perubahan kecil kepada kawalan global:
public delegate void SaveDelegate(object sender, EventArgs args);
dalam TransitionScript:
public event SaveDelegate SaveEvent;
Kami bersedia untuk membuat objek levelmaster yang akan berfungsi secara normal.
Sekarang kita hanya perlu membaca senarai dan menanam objek dari mereka apabila kita memuatkan permainan. Inilah yang akan dilakukan oleh Objek Tahap Tahap. Mari buat skrip baru dan panggilnya levelmaster
:
//In PotionDroppable's Start or Awake function: GlobalObject.Instance.SaveEvent += SaveFunction; //In PotionDroppable's OnDestroy() function: GlobalObject.Instance.SaveEvent -= SaveFunction; //[...] public void SaveFunction (object sender, EventArgs args) { //Here is code that saves this instance of an object. }
itu banyak kod, jadi mari kita pecahkan.
Kod berjalan hanya pada permulaan, yang kami gunakan untuk memulakan senarai yang disimpan dalam GlobalControl jika diperlukan. Kemudian, kami meminta GlobalControl jika kami memuatkan atau memindahkan adegan. Sekiranya kita memulakan adegan baru (seperti permainan baru atau sebagainya), tidak penting - kita tidak menelan objek.
Jika kita memuatkan adegan, kita perlu mengambil salinan tempatan kita senarai objek yang disimpan (hanya untuk menjimatkan sedikit prestasi pada mengakses GlobalControl yang berulang, dan untuk menjadikan sintaks lebih mudah dibaca).
Seterusnya, kami hanya melintasi senarai dan menanam semua objek ramuan di dalamnya. Sintaks yang tepat untuk pemijahan pada dasarnya adalah salah satu daripada kaedah instantiate yang berlebihan. Kita mesti membuang hasil kaedah instantiate ke dalam GameObject
(atas sebab tertentu, jenis pulangan lalai adalah objek mudah) supaya kita dapat mengakses transformasi, dan mengubah kedudukannya.
kita perlu meletakkan tuan tahap kami di setiap tempat kejadian dan menetapkan prefabs yang sah kepadanya:
Sekarang kita hanya kehilangan satu sekeping penting: kita perlu benar -benar membakar acara itu, bersiri senarai ke cakera keras dan membaca dari mereka. Kami hanya akan melakukannya dalam fungsi simpanan dan beban sedia ada kami dalam GlobalControl:
Ini juga kelihatan banyak kod, tetapi majoriti itu sudah ada. (Jika anda mengikuti tutorial terdahulu saya, anda akan mengenali perintah siriisasi binari; satu -satunya perkara baru di sini ialah fungsi FireSaveEvent, dan satu fail tambahan yang menjimatkan senarai kami.
[Serializable] public class SavedDroppablePotion { public float PositionX, PositionY, PositionZ; } [Serializable] public class SavedDroppableSword { public float PositionX, PositionY, PositionZ; }Ujian awal
Jika anda menjalankan projek sekarang, objek ramuan akan disimpan dengan betul dan dimuatkan setiap kali anda memukul
f5
danf9 , atau berjalan melalui pintu (dan sebarang kombinasi seperti). Walau bagaimanapun, ada satu lagi masalah untuk diselesaikan: kami tidak menyelamatkan pedang.
ini hanya untuk menunjukkan cara menambah objek baru
yang boleh diselamatkan ke projek anda sebaik sahaja anda mempunyai asas yang sama dibina.memperluaskan sistem
jadi katakan anda sudah mempunyai sistem objek-objek baru di tempat-seperti yang sudah kita lakukan dengan objek pedang. Mereka kini tidak berinteraksi dengan banyak (di luar fizik asas), jadi kita perlu menulis skrip yang serupa dengan ramuan yang membolehkan kita 'mengambil' pedang dan menjadikannya menyimpan dengan betul.
Prefab of the Sword yang kini ditanam boleh didapati dalam folder Aset> Prefabs.
mari kita lakukan. Pergi ke Aset> Skrip> Pickups dan di sana anda akan melihat
PoTiondRoppable
public delegate void SaveDelegate(object sender, EventArgs args);
Jangan lupa pelaksanaan antara muka 'Interactable'. Ia sangat penting: tanpa pedang anda tidak akan diiktiraf oleh kamera Raycast dan akan tetap tidak dapat ditarik. Juga, semak semula bahawa prefab pedang tergolong dalam lapisan item. Jika tidak, ia akan sekali lagi diabaikan oleh Raycast. Sekarang tambahkan skrip ini kepada anak pertama Prefab Pedang (yang sebenarnya mempunyai penerima mesh dan komponen lain):
Sekarang, kita perlu menanamnya. Di peringkat tuan, di bawah kami untuk gelung yang memancarkan ramuan:
public event SaveDelegate SaveEvent;
... dan itu sahaja. Bila -bila masa anda memerlukan jenis item baru yang disimpan:
- tambah kelas serializables
- Buat skrip untuk item yang melanggan acara
- Tambahkan logik instantiate dalam tuan tahap.
Kesimpulan
Buat masa ini, sistem ini agak kasar: terdapat banyak fail simpan pada cakera keras, putaran objek tidak disimpan (pedang, pemain, dll), dan logik untuk meletakkan pemain semasa peralihan tempat kejadian (tetapi tidak Memuatkan) agak unik.
Ini adalah masalah kecil sekarang untuk diselesaikan sebaik sahaja sistem pepejal disediakan, dan saya menjemput anda untuk cuba mengikat dengan tutorial ini dan projek selesai untuk melihat sama ada anda dapat memperbaiki sistem.
Tetapi walaupun begitu, ia sudah menjadi kaedah yang boleh dipercayai dan kukuh untuk melakukan mekanik menyimpan/memuatkan dalam permainan anda - namun banyak yang mungkin berbeza dari contoh
projek.
Seperti yang dijanjikan, inilah projek siap, sekiranya anda memerlukannya untuk rujukan, atau kerana anda terjebak di suatu tempat. Sistem simpan dilaksanakan mengikut arahan tutorial ini dan dengan skim penamaan yang sama.
Muat turun projek siap:
Projek GitHub PageSoalan Lazim (Soalan Lazim) Mengenai Menguasai Fungsi Simpan Dan Beban Dalam Perpaduan 5
Apakah cara terbaik untuk melaksanakan sistem simpan dalam Perpaduan 5? PlayerPrefs adalah cara mudah untuk menyimpan dan mengambil data antara sesi permainan. Ia membolehkan anda menyimpan dan memuatkan data dalam bentuk bilangan bulat, terapung, dan rentetan. Walau bagaimanapun, penting untuk diperhatikan bahawa PlayerPrefs tidak selamat dan tidak boleh digunakan untuk data sensitif. Untuk data yang lebih kompleks atau selamat, anda mungkin ingin mempertimbangkan menggunakan formatter binari atau serializer JSON.
Bagaimana saya boleh menyimpan keadaan permainan dan tetapan dalam Perpaduan 5? Dalam Perpaduan 5 boleh dicapai menggunakan pemain PlayerPrefs, Serialization JSON, atau pemformatan binari. PlayerPrefs adalah kaedah yang paling mudah, membolehkan anda menyimpan dan memuatkan bilangan bulat, terapung, dan rentetan. Serialization JSON sedikit lebih kompleks tetapi membolehkan lebih banyak fleksibiliti dan keselamatan. Pemformatan binari adalah kaedah yang paling selamat tetapi juga yang paling kompleks. skrip mana yang dijalankan. Ini boleh memberi kesan yang signifikan kepada fungsi simpanan dan beban. Sebagai contoh, jika skrip yang memuatkan data dilaksanakan sebelum skrip yang menjimatkan data, permainan mungkin memuatkan data ketinggalan zaman. Oleh itu, adalah penting untuk memastikan skrip yang berkaitan dengan penjimatan dan pemuatan data diperintahkan dengan betul dalam perintah pelaksanaan. 5 boleh dicapai dengan menggunakan pemformatan atau penyulitan binari. Pemformatan binari menukar data anda ke dalam format binari yang tidak mudah dibaca. Penyulitan menambah lapisan tambahan keselamatan dengan mengekodkan data anda dengan cara yang hanya boleh dimulakan dengan kunci tertentu. 🎜> Walaupun PlayerPrefs adalah cara yang mudah dan mudah untuk melaksanakan fungsi menyimpan dan memuatkan dalam Perpaduan 5, ia mempunyai beberapa batasan. Pertama, ia hanya menyokong bilangan bulat, terapung, dan rentetan. Kedua, ia tidak selamat dan mudah dimanipulasi. Akhir sekali, PlayerPrefs mempunyai had saiz, yang boleh menjadi masalah untuk permainan dengan sejumlah besar data.
Bagaimana saya boleh menyimpan dan memuatkan struktur data kompleks dalam perpaduan 5? Struktur data kompleks dalam Perpaduan 5 dapat dicapai menggunakan siri JSON atau pemformatan binari. Serialization JSON membolehkan anda menukar struktur data kompleks ke dalam format rentetan yang boleh disimpan dan dimuatkan dengan mudah. Pemformatan binari adalah kaedah yang lebih selamat yang mengubah data anda menjadi format binari.
Bolehkah saya menyimpan dan memuatkan data merentasi platform yang berbeza dalam Perpaduan 5? keserasian silang platform. Sebagai contoh, PlayerPrefs adalah serasi dengan platform, tetapi pemformatan binari mungkin tidak serasi di semua platform. Simpan dan memuatkan fungsi dalam Perpaduan 5 boleh dilakukan dengan memeriksa urutan pelaksanaan skrip anda, memastikan data anda betul bersiri atau diformat, dan menguji anda Permainan di platform yang anda ingin melepaskannya.
Bagaimana saya boleh mengoptimumkan fungsi menyimpan dan memuatkan dalam Perpaduan 5 untuk prestasi yang lebih baik? dicapai dengan meminimumkan jumlah data yang anda simpan dan memuatkan, menggunakan struktur data yang cekap, dan memastikan skrip anda dioptimumkan dengan baik. 5?
Atas ialah kandungan terperinci Menguasai Fungsi Simpan dan Beban dalam Perpaduan 5. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kebangkitan kuasa teknologi wanita Cina dalam bidang AI: kisah di sebalik kerjasama Honor dengan sumbangan wanita DeepSeek ke bidang teknologi menjadi semakin penting. Data dari Kementerian Sains dan Teknologi China menunjukkan bahawa bilangan pekerja sains wanita dan teknologi sangat besar dan menunjukkan kepekaan nilai sosial yang unik dalam pembangunan algoritma AI. Artikel ini akan memberi tumpuan kepada telefon bimbit menghormati dan meneroka kekuatan pasukan wanita di belakangnya menjadi yang pertama untuk menyambung ke model besar DeepSeek, menunjukkan bagaimana mereka dapat mempromosikan kemajuan teknologi dan membentuk semula sistem koordinat nilai pembangunan teknologi. Pada 8 Februari 2024, Honor secara rasmi melancarkan model besar versi penuh darah DeepSeek-R1, menjadi pengeluar pertama di kem Android untuk menyambung ke Deepseek, membangkitkan sambutan bersemangat dari pengguna. Di sebalik kejayaan ini, ahli pasukan wanita membuat keputusan produk, penemuan teknikal dan pengguna

DeepSeek mengeluarkan artikel teknikal mengenai Zhihu, memperkenalkan sistem inferensi DeepSeek-V3/R1 secara terperinci, dan mendedahkan data kewangan utama untuk kali pertama, yang menarik perhatian industri. Artikel ini menunjukkan bahawa margin keuntungan kos harian sistem adalah setinggi 545%, menetapkan keuntungan model AI besar global yang tinggi. Strategi kos rendah DeepSeek memberikan kelebihan dalam persaingan pasaran. Kos latihan modelnya hanya 1% -5% daripada produk yang serupa, dan kos latihan model V3 hanya AS $ 5.576 juta, jauh lebih rendah daripada pesaingnya. Sementara itu, harga API R1 hanya 1/7 hingga 1/2 OpenAIO3-Mini. Data -data ini membuktikan kelayakan komersil laluan teknologi DeepSeek dan juga mewujudkan keuntungan yang cekap model AI.

Midea tidak lama lagi akan melepaskan penghawa dingin pertama yang dilengkapi dengan model besar DeepSeek - Midea Fresh and Clean Air Machine T6. Penghawa dingin ini dilengkapi dengan sistem memandu pintar udara maju, yang boleh menyesuaikan parameter dengan bijak seperti suhu, kelembapan dan kelajuan angin mengikut alam sekitar. Lebih penting lagi, ia mengintegrasikan model besar DeepSeek dan menyokong lebih daripada 400,000 arahan suara AI. Langkah Midea telah menyebabkan perbincangan yang hangat dalam industri, dan sangat prihatin terhadap kepentingan menggabungkan barangan putih dan model besar. Tidak seperti tetapan suhu mudah penghawa dingin tradisional, mesin udara segar dan bersih T6 dapat memahami arahan yang lebih kompleks dan samar -samar dan secara bijak menyesuaikan kelembapan mengikut persekitaran rumah, dengan ketara meningkatkan pengalaman pengguna.

Pembinaan laman web hanyalah langkah pertama: kepentingan SEO dan backlinks Membina laman web hanyalah langkah pertama untuk mengubahnya menjadi aset pemasaran yang berharga. Anda perlu melakukan pengoptimuman SEO untuk meningkatkan keterlihatan laman web anda di enjin carian dan menarik pelanggan yang berpotensi. Backlinks adalah kunci untuk meningkatkan kedudukan laman web anda, dan ia menunjukkan Google dan enjin carian lain kuasa dan kredibiliti laman web anda. Tidak semua pautan balik bermanfaat: mengenal pasti dan mengelakkan pautan yang berbahaya Tidak semua pautan balik bermanfaat. Pautan yang berbahaya boleh membahayakan kedudukan anda. Pemeriksaan backlink percuma yang sangat baik memantau sumber pautan ke laman web anda dan mengingatkan anda tentang pautan yang berbahaya. Di samping itu, anda juga boleh menganalisis strategi pautan pesaing anda dan belajar dari mereka. Alat Pemeriksaan Backlink Percuma: Pegawai Perisikan SEO anda

DeepSeek-R1 memberi kuasa kepada Perpustakaan Baidu dan Netdisk: Integrasi Perfaikan dan Tindakan yang sempurna telah diintegrasikan dengan cepat ke dalam banyak platform dalam masa satu bulan sahaja. Dengan susun atur strategik yang berani, Baidu mengintegrasikan Deepseek sebagai rakan model pihak ketiga dan mengintegrasikannya ke dalam ekosistemnya, yang menandakan kemajuan besar dalam strategi ekologi "carian model besar". Platform Pintar Pintar Wenxin dan Wenxin adalah yang pertama menyambung ke fungsi carian Deep dari model besar DeepSeek dan Wenxin, yang menyediakan pengguna dengan pengalaman carian AI percuma. Pada masa yang sama, slogan klasik "Anda Akan Tahu Apabila Anda Pergi ke Baidu", dan versi baru aplikasi Baidu juga mengintegrasikan keupayaan model besar Wenxin dan Deepseek, melancarkan "AI Search" dan "Refinement Rangkaian Wide Rangkaian"

Pengimbas kelemahan rangkaian berasaskan GO ini dengan cekap mengenal pasti kelemahan keselamatan yang berpotensi. Ia memanfaatkan ciri konkurensi Go untuk kelajuan dan termasuk pengesanan perkhidmatan dan pemadanan kelemahan. Mari kita meneroka keupayaan dan etika

AI Prompt Engineering untuk Generasi Kod: Panduan Pemaju Landskap pembangunan kod bersedia untuk peralihan yang ketara. Menguasai model bahasa yang besar (LLM) dan kejuruteraan segera akan menjadi penting bagi pemaju pada tahun -tahun akan datang. Th


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

SublimeText3 versi Inggeris
Disyorkan: Versi Win, menyokong gesaan kod!

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

MinGW - GNU Minimalis untuk Windows
Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

Dreamweaver Mac版
Alat pembangunan web visual