আপডেট: 2018 এ, ইউনিটি একাধিক সিপিইউ কোর ব্যবহারের অফলোড এবং ব্যবহারের উপায় হিসাবে একটি সি # জব সিস্টেমটি চালু করছে ।
নীচের উত্তরটি এই সিস্টেমের পূর্বাভাস দেয়। এটি এখনও কাজ করবে, তবে আপনার প্রয়োজনের উপর নির্ভর করে আধুনিক ityক্যে আরও ভাল বিকল্প উপলব্ধ থাকতে পারে। বিশেষত, জব সিস্টেমটি নীচে বর্ণিত, ম্যানুয়ালি তৈরি থ্রেডগুলি নিরাপদে কী অ্যাক্সেস করতে পারে তার কিছু সীমাবদ্ধতার সমাধান করার জন্য উপস্থিত হয়। বিকাশকারীরা পূর্বরূপ প্রতিবেদনের সাথে পরীক্ষা করে রেসকাস্টগুলি সম্পাদন করে এবং সমান্তরালে মেস তৈরি করে ।
আমি ইঞ্জিনের বর্তমান অবস্থা প্রতিফলিত করে তাদের নিজস্ব উত্তর যুক্ত করার জন্য এই চাকরী সিস্টেমটি ব্যবহার করে অভিজ্ঞদের সাথে আমন্ত্রণ জানাব।
আমি অতীতে ইউনিটির হেভিওয়েট কাজের জন্য থ্রেডিং ব্যবহার করেছি (সাধারণত চিত্র এবং জ্যামিতি প্রক্রিয়াজাতকরণ), এবং দুটি সিভেট সহ অন্যান্য সি # অ্যাপ্লিকেশনগুলিতে থ্রেড ব্যবহার করা একেবারে আলাদা নয়:
ইউনিটি .NET এর কিছুটা পুরনো সাবসেট ব্যবহার করে, এমন কিছু নতুন থ্রেডিং বৈশিষ্ট্য এবং লাইব্রেরি রয়েছে যা আমরা বাক্সের বাইরে ব্যবহার করতে পারি না, তবে বেসিকগুলি সেখানে রয়েছে।
উপরে যেমন একটি মন্তব্যে অ্যালমো নোট করেছেন, অনেক ইউনিটির ধরণ থ্রেডসফ নয়, এবং যদি আপনি মূল থ্রেডটি নির্মাণ, ব্যবহার বা এমনকি তাদের তুলনা করার চেষ্টা করেন তবে ব্যতিক্রম ছুঁড়ে ফেলবেন। জিনিষ মনে রাখা:
একটি সাধারণ ক্ষেত্রে গেমঅজেক্ট বা মনোবিহাইওয়ের রেফারেন্সটি এর সদস্যদের অ্যাক্সেস করার চেষ্টা করার আগে বাতিল কিনা তা পরীক্ষা করে দেখা হচ্ছে। myUnityObject == null
ইউনিটিইজাইন থেকে উত্পন্ন যে কোনও কিছুর জন্য একটি ওভারলোডেড অপারেটরকে কল করে bঅজেক্ট, তবে এটি System.Object.ReferenceEquals()
প্রায় এক ডিগ্রিতে কাজ করে - কেবল মনে রাখবেন যে একটি ডিস্ট্রয় () এড গেমওজেক্ট ওভারলোডটি নাল হিসাবে সমান তুলনা করে, তবে এখনও শূন্যের জন্য রেফারেন্সএকুয়াল নয়।
ইউনিটির ধরণগুলি থেকে পরামিতিগুলি পড়া অন্য থ্রেডে সাধারণত নিরাপদ থাকে (যেহেতু আপনি উপরে যতটা নাল পরীক্ষা করতে যত্নবান হন ততক্ষণে অবিলম্বে কোনও ব্যতিক্রম ছুঁড়ে ফেলা হবে না) তবে এখানে ফিলিপের সতর্কতা নোট করুন যে মূল থ্রেডটি রাষ্ট্র পরিবর্তন করতে পারে যখন আপনি এটি পড়ছেন। কিছু অসঙ্গত অবস্থায় পড়া এড়ানোর জন্য কাকে কী পরিবর্তন করার অনুমতি দেওয়া হয়েছে সে সম্পর্কে আপনাকে শৃঙ্খলাবদ্ধ হতে হবে, যা আপনার ত্রিশের মধ্যে সাব-মিলিসেকেন্ড সময়ের উপর নির্ভরশীল এমন বাগগুলি সন্ধান করতে পারে যেগুলি ত্রুটিযুক্তভাবে অনুসরণ করা শক্ত হতে পারে they ইচ্ছায় পুনরুত্পাদন করা হবে না।
এলোমেলো এবং সময় স্থির সদস্যদের পাওয়া যায় না। সিস্টেমের উদাহরণ তৈরি করুন need থ্রেডের প্রতি র্যান্ডম যদি আপনার এলোমেলো প্রয়োজন হয়, এবং সিস্টেম.ডায়াগনস্টিক্স S স্টপওয়াচ আপনার সময়সীমার তথ্য প্রয়োজন হলে স্টপওয়াচ করুন।
ম্যাথফ ফাংশন, ভেক্টর, ম্যাট্রিক্স, কোয়ার্ট্রিয়েন এবং রঙ সমস্ত থ্রেড জুড়ে সূক্ষ্মভাবে কাজ করে, যাতে আপনি আপনার বেশিরভাগ গণনা আলাদাভাবে করতে পারেন you
গেমঅবজেক্টস তৈরি করা, মনোবিহাইওয়েরগুলি সংযুক্ত করা, বা টেক্সচার, মেশস, উপকরণ ইত্যাদি তৈরি / আপডেট করা ইত্যাদির মূল থ্রেডে ঘটতে হবে। অতীতে যখন এগুলির সাথে কাজ করার দরকার হয়েছিল তখন আমি একটি প্রযোজক-ভোক্তা সারি সেট আপ করেছি, যেখানে আমার কর্মী থ্রেড কাঁচা ডেটা প্রস্তুত করে (জাল বা টেক্সচারের জন্য প্রয়োগ করতে ভেক্টর / রঙের বড় অ্যারের মতো), এবং ডেটাগুলির জন্য মূল থ্রেড পোলে একটি আপডেট বা করোটিন এবং এটি প্রয়োগ করে।
এই নোটগুলি বাইরে না যাওয়ার সাথে সাথে এখানে একটি প্যাটার্ন দেওয়া হয়েছে যা আমি প্রায়শই থ্রেডেড কাজের জন্য ব্যবহার করি। আমি কোনও গ্যারান্টি দিচ্ছি না যে এটি একটি সেরা অনুশীলন শৈলী, তবে এটি কাজটি করে। (উন্নতি করার জন্য মন্তব্য বা সম্পাদনাগুলি স্বাগত - আমি জানি থ্রেডিং একটি খুব গভীর বিষয় যা আমি কেবলমাত্র বেসিকগুলি জানি)
using UnityEngine;
using System.Threading;
public class MyThreadedBehaviour : MonoBehaviour
{
bool _threadRunning;
Thread _thread;
void Start()
{
// Begin our heavy work on a new thread.
_thread = new Thread(ThreadedWork);
_thread.Start();
}
void ThreadedWork()
{
_threadRunning = true;
bool workDone = false;
// This pattern lets us interrupt the work at a safe point if neeeded.
while(_threadRunning && !workDone)
{
// Do Work...
}
_threadRunning = false;
}
void OnDisable()
{
// If the thread is still running, we should shut it down,
// otherwise it can prevent the game from exiting correctly.
if(_threadRunning)
{
// This forces the while loop in the ThreadedWork function to abort.
_threadRunning = false;
// This waits until the thread exits,
// ensuring any cleanup we do after this is safe.
_thread.Join();
}
// Thread is guaranteed no longer running. Do other cleanup tasks.
}
}
গতির জন্য যদি আপনার থ্রেড জুড়ে কাজটি কঠোরভাবে প্রয়োজন না হয় এবং আপনি এটিকে অবরুদ্ধ করার উপায় হিসাবে সন্ধান করছেন যাতে আপনার বাকি খেলাটি টিকিয়ে রাখে, ityক্যের হালকা ওজন সমাধান হ'ল Coroutines । এগুলি এমন ফাংশন যা কিছু কাজ করতে পারে তারপরে এটি চালিয়ে যাওয়ার জন্য ইঞ্জিনটিতে আবার নিয়ন্ত্রণ দেয় এবং পরবর্তী সময়ে নির্বিঘ্নে পুনরায় শুরু করতে পারে।
using UnityEngine;
using System.Collections;
public class MyYieldingBehaviour : MonoBehaviour
{
void Start()
{
// Begin our heavy work in a coroutine.
StartCoroutine(YieldingWork());
}
IEnumerator YieldingWork()
{
bool workDone = false;
while(!workDone)
{
// Let the engine run for a frame.
yield return null;
// Do Work...
}
}
}
এটির জন্য কোনও বিশেষ পরিষ্কারের বিবেচনার প্রয়োজন নেই, যেহেতু ইঞ্জিনটি (যতদূর আমি বলতে পারি) আপনার জন্য ধ্বংসপ্রাপ্ত বস্তুগুলি থেকে কর্টিনগুলি থেকে মুক্তি পাবে।
পদ্ধতির সমস্ত স্থানীয় রাজ্য সংরক্ষণ করা হয় যখন এটি আসে এবং পুনরায় শুরু হয়, তাই অনেকগুলি উদ্দেশ্যে এটি অন্য থ্রেডে নিরবচ্ছিন্নভাবে চলমান ছিল (তবে আপনার কাছে মূল থ্রেডে চলার সমস্ত সুবিধা রয়েছে)। আপনার কেবল এটি নিশ্চিত করতে হবে যে এর প্রতিটি পুনরাবৃত্তি যথেষ্ট সংক্ষিপ্ত যে এটি আপনার মূল থ্রেডটি অযৌক্তিকভাবে ধীর করে দিচ্ছে না।
গুরুত্বপূর্ণ ক্রিয়াকলাপগুলি কোনও ফলন দ্বারা আলাদা করা হয় না তা নিশ্চিত করে আপনি একক থ্রেডযুক্ত আচরণের ধারাবাহিকতা পেতে পারেন - মূল থ্রেডের কোনও অন্য লিপি বা সিস্টেম আপনি কাজ করার মাঝখানে থাকা ডেটা পরিবর্তন করতে পারবেন না তা জেনে।
ফলন ফেরতের লাইন আপনাকে কয়েকটি বিকল্প দেয়। আপনি করতে পারেন ...
... আপনি যখন কর্টিনটি এর পরবর্তী বারটি নেবেন তখন তার উপর নির্ভরশীল।
বা yield break;
কর্টিন শেষ হওয়ার আগে থামাতে, আপনি যেভাবে return;
কোনও প্রচলিত পদ্ধতিটি প্রারম্ভিক-আউট ব্যবহার করতে পারেন ।