ইউনিটি 3 ডি গেম ইঞ্জিনের 'ফলন ফেরত www' এর অন্তর্নিহিত প্রক্রিয়া


14

ইউনিটি 3 ডি গেম ইঞ্জিনে, রিমোট ডেটা পাওয়ার জন্য একটি সাধারণ কোড ক্রম এটি:

WWW www = new WWW("http://remote.com/data/location/with/texture.png");
yield return www;

এখানে অন্তর্নিহিত প্রক্রিয়া কি?

আমি জানি আমরা ডাউনলোডের কাজটি সম্পন্ন করার সময় পরবর্তী ফ্রেমটি প্রক্রিয়া করার অনুমতি দেওয়ার জন্য ফলন প্রক্রিয়াটি ব্যবহার করি। কিন্তু যখন আমরা এটি করি তখন yield return wwwকী হবে ?

ডাব্লুডাব্লুডাব্লু ক্লাসে কোন পদ্ধতিটি বলা হচ্ছে (যদি থাকে তবে)? Ityক্য কি থ্রেড ব্যবহার করছে? "উপরের" ityক্য স্তরটি কী www উদাহরণস্বরূপ ধরে চলেছে এবং কিছু করছে?

সম্পাদনা করুন:

  • এই প্রশ্নটি বিশেষত ইউনিটি 3 ডি ইন্টার্নাল সম্পর্কে। yieldসি # তে বিবৃতি কীভাবে কাজ করে তার ব্যাখ্যাতে আমি আগ্রহী নই । পরিবর্তে, আমি construcক্য কীভাবে এই নির্মাণগুলি নিয়ে কাজ করে তার একটি অভ্যন্তরীণ ভিউ খুঁজছি, উদাহরণস্বরূপ, ডাব্লুডাব্লুডাব্লুকে বেশ কয়েকটি ফ্রেম জুড়ে বিতরণ করা উপায়ে একটি টুকরো ডেটা ডাউনলোড করার অনুমতি দেওয়ার জন্য।

1
নোট করুন যে yield returnঅ্যাসিক্রোনাস অপারেশনগুলির জন্য ব্যবহার হ্যাক। একটি "আসল" সি # প্রোগ্রামে আপনি এর জন্য একটি ব্যবহার করতে চান Task। Ityক্য সম্ভবত তাদের ব্যবহার করছে না কারণ এটি তৈরি করা হয়েছিল। নেট 4.0, কখন Taskচালু হয়েছিল।
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

উত্তর:


8

এটি কার্যত সি # ফলনের কীওয়ার্ড - এটি কোনও wwwবস্তুর সাথে বিশেষ কিছু করছে না , বরং এর অভ্যন্তরীণ পদ্ধতির জন্য এর অর্থ বিশেষ কিছু Spec বিশেষত এই কীওয়ার্ডটি কেবল এমন পদ্ধতিতে ব্যবহার করা যেতে পারে যা কোনও IEnumerable(বা IEnumerator) প্রদান করে এবং ব্যবহৃত হয় মুভনেক্সট যখন ডাকা হবে তখন এনুমুরেটর দ্বারা কোন অবজেক্টটি "প্রত্যাবর্তন" হবে তা নির্দেশ করতে ।

এটি কাজ করে কারণ সংকলক পুরো পদ্ধতিটিকে একটি পৃথক শ্রেণিতে রূপান্তরিত করে যা একটি রাষ্ট্রীয় মেশিন ব্যবহার করে প্রয়োগ করে IEnumerable(বা IEnumerator) প্রয়োগ করে - নেট ফলাফলটি হ'ল যে কোনও ব্যক্তি রিটার্ন ভ্যালু দিয়ে গণনা না করা অবধি পদ্ধতিটির দেহ নিজেই কার্যকর করা হয় না। এটি যে কোনও প্রকারের সাথে কাজ করবে, এর সাথে বিশেষ কোনও কিছুই নেই WWW, বরং এটির সাথে যুক্ত পদ্ধতি যা বিশেষ।

সি # কম্পাইলারটি কী ধরণের কোড উত্পন্ন করে তা সম্পর্কে আরও অন্তর্দৃষ্টি জন্য সি # ফলন কীওয়ার্ডের দৃশ্যের পিছনে একবার দেখুন বা আইএল স্পাইয়ের মতো কিছু ব্যবহার করে কোডটি নিজেই পরীক্ষা করে দেখুন এবং পরীক্ষা করুন


আপডেট: স্পষ্ট করার জন্য

  • যখন ইউনিটি একটি কর্টিনকে কল করে যা একটি yield returnবিবৃতি ধারণ করে যা ঘটেছিল তা হ'ল একটি গণক ফেরত দেওয়া হয় - পদ্ধতির কোনও অংশই এই মুহুর্তে কার্যকর করা হয় না
  • MoveNextBodyক্যটি সম্পাদন করার পদ্ধতি বডিটি পেতে ক্রমের প্রথম মানটি পেতে পুনরায় পুনরুক্তকারীকে কল করতে হবে। এটি প্রথম yeild returnবিবৃতি পর্যন্ত পদ্ধতিটি কার্যকর করতে পারে যার ফলে কলার পুনরায় শুরু হয় (এবং সম্ভবত ityক্য বাকী ফ্রেমের রেন্ডার করতে চলেছে)
  • যেহেতু আমি এটি ইউনিটি বুঝতে পেরেছি তারপরে MoveNextপ্রতিটি পরবর্তী ফ্রেমে একবারে পুনরুদ্ধারে পদ্ধতিটি কল করা যায় , যার ফলে পদ্ধতিটি yield returnপ্রতিটি ফ্রেমের একবারে পরবর্তী বিবৃতি পর্যন্ত কার্যকর করা হয়, যতক্ষণ না পদ্ধতির শেষ বা yield breakবিবৃতি না পৌঁছানো হয় (নির্দেশক ক্রম শেষ)

শুধুমাত্র বিশেষ বিট এখানে (এবং মধ্যে দম্পতি এর অন্যান্য ক্ষেত্রে ) যে ঐক্য এই বিশেষ পুনরুক্তিকারীর পরবর্তী ফ্রেম আগাম না হয়, এর পরিবর্তে এটি শুধুমাত্র পুনরুক্তিকারীর যখন ডাউনলোড সম্পন্ন করেছে (নির্বাহ অব্যাহত রাখার জন্য পদ্ধতি যার ফলে) এগিয়ে। যদিও সেখানে বেস ইয়েলডিলস্ট্রেশন ক্লাসের উপস্থিতি উপস্থিত রয়েছে যা সম্ভবত ইউনিটিতে সংকেত দেওয়ার জন্য একটি জেনেরিক ব্যবস্থা রয়েছে যখন একটি পুনরুক্তিকারীকে উন্নত করা উচিত, WWWবর্গটি এই শ্রেণীর কাছ থেকে উত্তরাধিকারী বলে মনে হয় না তাই আমি কেবল ধরে নিতে পারি যে এর জন্য একটি বিশেষ কেস রয়েছে ইউনিটি ইঞ্জিনে এই শ্রেণি।

কেবল স্পষ্ট করে বলতে গেলে - yieldকীওয়ার্ডটি WWWশ্রেণীর জন্য বিশেষ কিছু করে না , বরং এটি theক্য প্রত্যাবর্তিত গণনার সদস্যদের যে বিশেষ হ্যান্ডলিং দেয় যা এই আচরণের কারণ হয়ে দাঁড়ায়।


দ্বিতীয়টি আপডেট করুন: যেকোন প্রক্রিয়া যা WWWওয়েব পৃষ্ঠাগুলি তাত্পর্যপূর্ণভাবে ডাউনলোড করতে ব্যবহার করে এটি সম্ভবত HTTPWebRequest.BegGetResponse পদ্ধতি ব্যবহার করে যা অভ্যন্তরীণভাবে অ্যাসিনক্রোনাস আইও ব্যবহার করবে বা বিকল্পভাবে এটি থ্রেড ব্যবহার করতে পারে (হয় নিবেদিত থ্রেড তৈরি করে অথবা থ্রেড পুল ব্যবহার করে)।


5
প্রকৃতপক্ষে, ইউনিটিতে, WWWযখন কোনও বস্তু উত্পন্ন হয় তখন তার সাথে বিশেষ কিছু ঘটে যায় , WWWএর উল্লেখ দেখুন
এরিক

9

yieldcorক্যতে মূলত একটি কর্টিন প্রসঙ্গে ব্যবহৃত হয়েছে বলে মনে হয়। কর্টাইন সম্পর্কে আরও পড়তে এবং তারা সি # এর কেন ব্যবহার করে yieldআমি এই ব্লগের নিবন্ধটি সুপারিশ করছি: ইউনিটিটি 3 ডি কর্টাইনগুলি বিশদে । এই উত্তরের বেশিরভাগ গবেষণা সেই নিবন্ধ থেকে আসে।

ইউনিটিতে কর্টাইনগুলি কার্যগুলি আবদ্ধ করতে ব্যবহৃত হয় যা:

  1. ফ্রেম রেন্ডার হতে আরও বেশি সময় নিতে পারে (যার ফলে মন্দার সৃষ্টি হয়) এবং
  2. গেম লুপ থেকে আলাদাভাবে সম্পাদন করা যায় (কারণ ফলাফলটি বর্তমান ফ্রেমের জন্য উপলব্ধ হওয়ার দরকার নেই)।

এই ধরণের কাজের উদাহরণগুলি হ'ল পাথফাইন্ডিং (পুনরায়) গণনা বা আপনার প্রশ্নের ক্ষেত্রে যেমন কোনও ওয়েবসাইট থেকে ডেটা প্রাপ্ত।

আপনার অনুচ্ছেদে উত্তর দেওয়ার জন্য (কিছুটা পরিবর্তিত ক্রমে):

ডাব্লুডাব্লুডাব্লু ক্লাসে কোন পদ্ধতিটি বলা হচ্ছে (যদি থাকে তবে)? "উপরের" ityক্য স্তরটি কী www উদাহরণস্বরূপ ধরে চলেছে এবং কিছু করছে?

ইউনিটির WWWক্লাসটি কর্টিন থেকে উত্পাদনের জন্য ডিজাইন করা হয়েছে। উপরে লিঙ্ক করা ব্লগ নিবন্ধের মতামত অনুসারে, এর কোডের অনুমানমূলক ব্লক ("" উপরের "স্তর") YieldInstructionআসলে একটি সুইচ রয়েছে যা ফলনকারীদের জন্যও পরীক্ষা করে WWW। এই কোডটি তখন নিশ্চিত করে যে ডাউনলোডটি সম্পন্ন হওয়ার পরে কর্টিন স্বয়ংক্রিয়ভাবে শেষ হয়ে যাবে, যেমন WWWউল্লেখ করা হয়েছে

Ityক্য কি থ্রেড ব্যবহার করছে?

এক্ষেত্রে "বাকী খেলা অবরুদ্ধ না করে" ডেটা ডাউনলোড করতে: হ্যাঁ, সম্ভবত। (এবং থ্রেডিং অবশ্যই ডাউনলোড করা ডেটা সংক্ষেপিত করতে ব্যবহৃত হয়, যার প্রমাণ হিসাবে WWW.threadPriority))


চমৎকার! আমি altdevblogaday.com/2011/07/07/une3d-coroutines-in-detail/… মন্তব্যটি দেখেছি এবং মনে হয় যে ডাব্লুডাব্লুডাব্লু বিশেষভাবে চিকিত্সা করা হয়। সুতরাং আমি কীভাবে এটি সম্পন্ন হয় তা জানতে, কোনও থ্রেড ব্যবহার না করেই বেশ কয়েকটি ফ্রেম জুড়ে ডাউনলোডের অনুমতি দেওয়ার জন্য?
থায়ানড্রেকার্ডোসো

ভাল যুক্তি! আমি মনে করি যে স্তরের কিছু পরে অবশ্যই থ্রেডিং চলছে, আমি তার উত্তরটি সম্পাদন করতে আমার উত্তর সম্পাদনা করব।
এরিক

1
@thyandrecardoso আমি চাই এটি ব্যবহার করে HttpWebRequest.BeginGetResponse বা অনুরূপ, তবে আপনি সমাবেশ এটি নিশ্চিত হলে এটা আপনার উপর সত্যিই গুরুত্বপূর্ণ decompile পারে।
জাস্টিন

আপাতত, আমি সত্যিই কেবল "সেরা ব্যাখ্যা" এর জন্য অপেক্ষা করছি ... Unক্য দেব দলের কেউ যদি "সঠিক উত্তর" 8 -) দেয় ... তবে শেষ পর্যন্ত, আমি মনে করি আসল বাস্তবায়ন হবে না ইতিমধ্যে এখানে দেওয়া বিষয়গুলি থেকে দূরে ... আমার সমাবেশটি ছড়িয়ে দেওয়ার সত্যিকারের প্রয়োজন নেই এবং নিশ্চিতভাবেই এই সমস্ত জানা উচিত। তবে আমি এটি পরে চেষ্টা করতে পারি :)
thyandrecardoso

7

দুর্ভাগ্যক্রমে, ডাব্লুডাব্লুডাব্লু অভ্যন্তরীণভাবে স্থানীয় কোড হিসাবে প্রয়োগ করা হয়েছে যার অর্থ আমরা কোডটি দেখতে পারি না। পরীক্ষা-নিরীক্ষা থেকে আমি এটি বলতে পারি

  1. WWWথেকে উদ্ভূত হয় নাYieldInstruction , সুতরাং যখনই যা হয় তা যখন আপনাকে yieldঅবশ্যই এটি বিশেষ-কেস কোড দ্বারা পরিচালনা করতে হবে।
  2. আমি এর মধ্যে কোন পার্থক্য কখনই ছাড়িনি

    yield return www;

    এবং

    while(!www.isDone)
        yield return null;

    আমি মনে করি এটি বাস্তবায়নের সর্বাধিক যৌক্তিক উপায় এবং সম্ভবত এটিই হুডের নীচে চলছে। তবে আমি নিশ্চিতভাবে জানি না।

  3. Ityক্য ডাউনলোড করার জন্য একটি নতুন থ্রেড শুরু করে না , অন্তত কিছু প্ল্যাটফর্মে (আইওএস, ওয়েবপ্লেয়ার)। অথবা যদি এটি হয় তবে এটি WWW.isDoneমূল থ্রেডে সেট করে। আমি এই জানি কারণ এই কোড:

    while(!www.isDone)
        Thread.Sleep(500);

    কাজ করে না

আমি মনে করি না যে ইউনিটি 3 ডি এর উত্স কোডটিতে অ্যাক্সেস সহ কেউ এখানে না এলে আপনার আরও নির্দিষ্ট উত্তর থাকতে পারে।


হা. সত্যিই দুর্দান্ত অন্তর্দৃষ্টি! ধন্যবাদ! প্রতি সেড কোনও থ্রেড চালু না করা সত্ত্বেও, সবচেয়ে সম্ভাব্য যেটি ঘটতে পারে তা হ'ল ডাব্লুডাব্লুডাব্লু (বা ইঞ্জিন স্তর) এইচটিটিপিওয়েব্রেকস্ট.বেগিনগেটরেস্পোনস (বা এর মতো কিছু) ব্যবহার করে ... তাই না? পুরোপুরি অ্যাসিঙ্কটি অবশ্যই কোনওভাবেই ঘটতে পারে ... ডাউনলোডটি "বিরতি" দেওয়া যায় না।
thyandrecardoso

** ফ্রেমগুলির মধ্যে "বিরতি" দেওয়া যায় না, আমি বলতে চাইছি।
thyandrecardoso

2

যেহেতু ইউনিটি 3 ডি তাদের স্ক্রিপ্টিং ইঞ্জিন হিসাবে সি # ব্যবহার করে আমি মনে করি এটির স্ট্যান্ডার্ড ফলন কীওয়ার্ড যা সি # তে অন্তর্নির্মিত। মূলত এর অর্থ হ'ল এটি ইতিমধ্যে www এর মান ফেরত দেয় যাতে আপনি চালিয়ে যেতে পারেন যখন পরবর্তী পুনরাবৃত্তি এটি পরবর্তী মান ইত্যাদি ফেরত দেয় ... ফলন মূলত ব্যাকগ্রাউন্ডে একটি স্টেট মেশিন এবং পুনরুক্তি তৈরি করে।


হ্যাঁ, আমি মনে করি ফলন কীওয়ার্ড সম্পর্কে আমার প্রাথমিক ধারণা আছে। যাইহোক, ডাব্লুডাব্লুডাব্লু এর কনস্ট্রাক্টরের সময় কী ঘটছে যা "রাষ্ট্রীয় মেশিন" এর অনুমতি দেয়? আমার অর্থ, "ফলন ফেরত www" ডাব্লুডাব্লুডাব্লু ক্লাসের অভ্যন্তরে কিছু কল করছে না বলে মনে হচ্ছে ... আপনি যখন বলছেন "এর অর্থ এটি ইতিমধ্যে www এর মান ফেরত দেয়", www উদাহরণটির মানটি কী? এই উদাহরণটি পরবর্তী "পুনরাবৃত্তি" এ কী করবে?
thyandrecardoso

1
ইউনিটির কর্টিনগুলিতে, ডাব্লুডাব্লুডাব্লু ফলন একটি বিশেষ ক্ষেত্রে, WWWএর উল্লেখ দেখুন । তদুপরি, আমি নিশ্চিত yieldকিছু তৈরি করি না। পুনরাবৃত্তির IEnumerableপ্রকার হিসাবে এটি প্রয়োগ করে বা ব্যবহার করে পুনরুক্তি প্রসঙ্গে তৈরি করা হয় । "স্টেট মেশিন "ও বন্ধ মনে হচ্ছে। অবশ্যই, রাষ্ট্র আছে, কিন্তু এটি একা যথেষ্ট সম্পত্তি নয়, তাই না? সম্ভবত আপনি এটি বিস্তারিত বলতে পারে।
এরিক

1
সাধারণ সি # আচরণ সম্পর্কে এখানে একটি ভাল রেফারেন্স। ছায়াছোডিং.ব্লগস্পট.এনএল/2009/01/yeld-and-c-state-machine.html । ফলন এটির ক্ষেত্রে কোথায় রয়েছে তা ট্র্যাক রাখতে প্রচুর কোড উত্পন্ন করে। ইউনিটির বিশেষ ক্ষেত্রে ডাব্লুডাব্লুডাব্লু উত্পাদনশীল সম্পর্কে, আমি জানতাম না তবে ডক্স অনুসারে এটি সাধারণ সি # কীওয়ার্ডের সাথে কিছু করতে পারে না, এটি খুব বিভ্রান্তিকর, তারা কেবল এটিকে একটি অ্যাসিঙ্ক পদ্ধতিতে তৈরি করতে পারে।
রায় টি।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.