Methodক্যে আপডেট পদ্ধতি এবং ফিক্সডআপডেটের মধ্যে পার্থক্য?


14

আমি Unity3d শিখতে শুরু করছি এবং বিভ্রান্তির আমি পাই এক মধ্যে পার্থক্য Update()এবং FixedUpdate()

আমি সেখানে লিন্ডা ইউনিটি 2 ডি গেম ডেভলপমেন্ট টিউটোরিয়াল অনুসরণ করছি, প্রশিক্ষক Updateপদ্ধতিটি ব্যবহার করেন , খেলোয়াড়ের সাথে রিজিডডোডি 2 ডি উপাদান এবং বক্স সংঘর্ষক রয়েছে, তিনি Updateপ্লেয়ারটিকে অনুবাদ করার জন্য পদ্ধতিটি ব্যবহার করেন , তবে আমি যখন Updateপ্লেয়ারে একই করি তখন সরানো হয় না তবে কখন করি এটি মধ্যে FixedUpdate, সবকিছু কাজ করে। তিনি ইউনিটি ৪.৩ থেকে টিউটোরিয়াল দিচ্ছেন এবং আমি ইউনিটি ৪.6 এ কোর্স নিচ্ছি।

কোথায় আমি ব্যবহার করা উচিত Updateএবং FixedUpdate?

উত্তর:


14

আমি এটি একটি মন্তব্য হিসাবে লিখতে যাচ্ছিলাম, তবে এটি শেষ হয়ে গেছে বরং দীর্ঘায়িত তাই আমি এটিকে একটি উত্তরে পরিণত করেছি।

বর্তমান উত্তরগুলি বেশিরভাগই সঠিক, তবে উল্লিখিত কয়েকটি বিষয় বিভ্রান্তিকর / ভুল।

সাধারণভাবে, বেশিরভাগ গেম-প্লে সম্পর্কিত কাজগুলি হবে Update

উদাহরণস্বরূপ, আপনি ইনপুটটির জন্য ভোটগ্রহণ করতে চান না FixedUpdate(পারফরম্যান্সের কারণে নয়, তবে কলগুলি কেবল সঠিকভাবে কাজ করবে না বলে)। এআই একই নৌকায় পড়ে।

ক্রমাগত আপডেট হওয়া পদার্থবিজ্ঞান হ'ল একমাত্র গেমপ্লে সম্পর্কিত টাস্ক যা এর FixedUpdateজন্য ব্যবহার করা উচিত। অবিচ্ছিন্ন / একবার-একবার-এ- যেমন-তে Physics.Raycastবা এমনকি Rigidbody.AddForceঅন্তর্ভুক্ত জিনিসগুলিতে কল Update। আমার উল্লেখটি Rigidbody.AddForceডকুমেন্টেশন দ্বারা বোঝানো যা হতে পারে তার বিপরীতে আপাতদৃষ্টিতে বিপরীত, তবে মূলটি হল ধারাবাহিক বনাম অ-অবিচ্ছিন্ন।

শুধুমাত্র অবিচ্ছিন্ন পদার্থবিজ্ঞানের সাথে যুক্ত থাকার একটি বিশাল কারণ FixedUpdateহ'ল প্রকৃত প্রকৃতি FixedUpdate। অন্যান্য উত্তরে উল্লেখ করা হয়েছে যে কীভাবে স্থির interval, but that's slightly misleading. In reality, a script is passed a time in Time.deltaTime/ Time.fixedDeltaTime* এ ফিক্সডআপডেটকে ডাকা হয় যা কলগুলির মধ্যে প্রকৃত সময়ের সাথে সরাসরি মিল নয়, বরং কলগুলির মধ্যে সিমুলেটেড সময়।

(* Time.deltaTimeএবং Time.fixedDeltaTimeএকই মান হিসাবে FixedUpdateকল করা হলে [ইউনিটি বলতে পারে যে বর্তমান কলটি কখন উত্সাহিত Time.deltaTimeহয়েছিল FixedUpdateএবং ফিরে আসে কি তা বলতে সক্ষম হয় Time.fixedDeltaTime))

স্বাভাবিকভাবে একই Updateরকমভাবে বিভিন্ন পারফরম্যান্সের কারণে ধ্রুবক পদ্ধতিতে কল করা যায় না, পারে না FixedUpdate। মূল পার্থক্যটি হ'ল, প্রতিটি ফ্রেম, যদি FixedUpdateকলগুলির মধ্যে সঠিক ব্যবধানের জন্য প্রায়শই পর্যাপ্ত পরিমাণে ফোন করা না হয় তবে এটি একাধিকবার বলা হয় (বা বলা হয় না গড় খুব বেশি)। এক্সিকিউশন অর্ডারে থাকা ডক্সগুলি এটিকেই উল্লেখ করে যে ফিক্সডআপকে একটি ফ্রেমে একাধিকবার বলা যেতে পারে:

... ফিক্সডআপডেট: ফিক্সডআপডেটকে প্রায়শই আপডেটের চেয়ে বেশি বলা হয়। এটি ফ্রেম প্রতি একাধিকবার বলা যেতে পারে, যদি ফ্রেমের হার কম থাকে এবং ফ্রেমের হার বেশি হলে ফ্রেমের মধ্যে একেবারেই নাও বলা যেতে পারে ...

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

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

আপনি একটি নির্দিষ্ট ব্যবধান ব্যবহার অন্যান্য পদ্ধতি ইউনিটি যেমন উপলব্ধ এ কিছু করার প্রয়োজন হলে Coroutinesএবং InvokeRepeating

Time.deltaTimeএবং কখন এটি ব্যবহার করবেন সে সম্পর্কে একটি ছোট নোট :

টাইম.ডেলটাটাইমের প্রভাব বর্ণনা করার সবচেয়ে সহজ উপায় হ'ল এটি হ'ল একটি ফ্রেম প্রতি ইউনিট থেকে প্রতি সেকেন্ডে ইউনিট পরিবর্তন করে । উদাহরণস্বরূপ, transform.Translate(Vector3.up * 5)আপডেটের মতো কিছু সহ আপনার যদি কোনও স্ক্রিপ্ট থাকে তবে আপনি মূলত ফ্রেম প্রতি 5 মিটার হারে ট্রান্সফর্মটি সরিয়ে নিচ্ছেন । এর অর্থ যদি ফ্রেমরেট কম হয় তবে চলাচল ধীর হয় এবং ফ্রেমরেট যদি উচ্চ হয় তবে চলাচল আরও দ্রুত হয়।

আপনি যদি একই কোডটি নেন এবং এটিকে পরিবর্তন করেন transform.Translate(Vector3.up * 5 * Time.deltaTime)তবে অবজেক্টটি সেকেন্ডে 5 মিটার হারে সরানো হচ্ছে । এর অর্থ ফ্রেমরেট কোনও ব্যাপার নয়, বস্তুটি প্রতি সেকেন্ডে 5 মিটার সরে যাবে (তবে ফ্রেমরেটটি ধীরে ধীরে, অবজেক্টের গতিবেগটি লাফিয়ে উঠবে কারণ এটি প্রতি X সেকেন্ডে একই পরিমাণে সরায়)

সাধারণভাবে, আপনি চান আপনার চলাচল প্রতি সেকেন্ডে হোক। কম্পিউটার যে গতিতে চলেছে সেভাবেই আপনার পাতাগুলি / চলাচল একই রকম আচরণ করবে এবং ধীর ডিভাইসগুলিতে আপনার অদ্ভুত বাগ পপ হবে না।

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


4

Updateফাংশন যে ফ্রেম বলা হয়। কম্পিউটার কতটা দ্রুত চিত্রগুলি উপস্থাপন করতে সক্ষম তার উপর এর ফ্রিকোয়েন্সি নির্ভর করে। ধীর কম্পিউটারে Updateদ্রুত কম্পিউটারের চেয়ে কম ঘন ঘন বলা হয়। আপনি যদি সময় ভিত্তিক গণনা করেন তবে আপনি এগুলি ব্যবহার করে সাধারণ করতে পারেন Time.deltaTimeযা আপনাকে জানায় যে শেষ সময় Updateবলা হওয়ার পরে এটি কতক্ষণ হয়েছে (ক্যাভেটস প্রয়োগ হয়)।
আপনি সাধারণত Updateডিসপ্লে-সম্পর্কিত কাজগুলি সম্পাদন করতে ব্যবহার করবেন (যেমন কোনও ইউআই উপাদান আপডেট করে)

FixedUpdateফাংশন নির্ধারণ অন্তর বলা হয়। চিত্রটি প্রায়শই রিফ্রেশ করে না কেন, প্রতি সেকেন্ডে বার FixedUpdateবলা হবে আপনি সাধারণত গেমপ্লে সম্পর্কিত কাজগুলি সম্পাদন করতে ব্যবহার করবেন (যেমন পদার্থবিজ্ঞানের আপডেট করা)1/Time.fixedDeltaTime
FixedUpdate


এটি কি সময়.ডেলটা সময়কে গুণ করার বিকল্প? একটি বা অন্য ব্যবহার করার কারণ আছে?
বেন

@ বেন তাদের দুটি পৃথক লক্ষ্য রয়েছে এবং আপনি যা করছেন তার জন্য আপনার সঠিক ফাংশনটি ব্যবহার করা উচিত।
o0 '

@ লোহরিস দুঃখিত, আমি বোঝাতে চাইছি যে ফিক্সড আপডেট ওভারটাইম ও টাইম.ডেলটাটাইমের দ্বারা জিনিসগুলি ফ্রেমকে স্বাধীন করার জন্য জিনিসগুলি গুছিয়ে নেওয়ার কোনও কারণ আছে?
বেন

@ হ্যাঁ, নির্ভুলতা ধীরে রেন্ডারিং সহ একটি সিস্টেমে Updateকম এবং কম প্রায়ই বলা হয়ে থাকে এবং আপনার অনুকরণ সেখান থেকে অনেক ক্ষতিগ্রস্থ হবে। সিমুলেশনটি সহজ হওয়ার সময় আপনি লক্ষ্য করতে পারেন না, তবে এটি যখন খুব সহজেই ঘটে তখন ভয়াবহভাবে ভেঙে যায়।
o0 '

1
@ নন: আপনি যদি নিজের সিমুলেশনটি সুনির্দিষ্ট করতে চান তবে আপনাকে অনেক ছোট ছোট পদক্ষেপ নিতে হবে, প্রতিবার এলোমেলোভাবে বড় বা ছোট নয়। এবং না, ফিক্সড আপডেটের পুরো বিষয়টিটি এটি বহুবার বলা হয়, কোনও প্রশ্নই করা হয়নি।
o0 '

2

থেকে: http://une3d.com/learn/tutorials/modules/beginner/scriptting/update-and-fixedupdate

ফিক্সডআপেডে ব্যবহৃত সময়-পদক্ষেপটি পরিবর্তনশীল নয়।

যদি আপনার গেমটি পিছিয়ে যেতে শুরু করে, যখন এটি ধরা পড়ে, আপনি কোনও আপডেটে> 10 সেকেন্ডের পদার্থবিজ্ঞানটি চান না, তাই এটি সাধারণত ফিক্সডআপটেটে করা হয় যা একটি নির্দিষ্ট-বিরতিতে ডাকা হয়।

উদাহরণ স্বরূপ:

Update(float elapsedSeconds)
{
  Position += Velocity * 34.23423; //Windows Update is self-important
}
FixedUpdate(float elapsedSeconds)
{
  Position += Velocity * 0.0166; //60fps
}

কোথায়:

Update(34.23423)

==

FixedUpdate(10.0)
FixedUpdate(10.0)
FixedUpdate(10.0)
//4.23423 + 5.76577 game-seconds later...
FixedUpdate(10.0)

আমি আমার উত্তরে এটি উল্লেখ করেছি, তবে FixedUpdateআসলে কোনও নির্দিষ্ট বিরতিতে ডাকা হয় না। প্রকৃত প্রকৃতি FixedUpdateহ'ল যদি আপনার গেমটি পিছিয়ে যেতে শুরু করে এবং যদি খুব দ্রুত চলে যায় তবে চক্র এড়িয়ে চলা শুরু করে যাতে গড় স্থির আপডেট টাইমস্টেপ থেকে বেরিয়ে আসে phys Ityক্য মাল্টি-থ্রেডেড নয়, সুতরাং নির্দিষ্ট বিরতিতে ফিক্সডআপডেট কলগুলির গ্যারান্টি দেওয়ার কোনও উপায় থাকবে না (যখন কোনও ফিক্সডআপ্টেট খুব বেশি সময় নেয় তখন কী হয়)। এমনকি যদি এটি হয় তবে এটি এখনও অসম্ভবের কাছাকাছি ছিল।
সেলাালী অ্যাডোবর

বেশিরভাগ [ityক্য?] লোকেরা সচেতন নয় যে রেন্ডার / আপডেট / ফিক্সডআপডেট সবই একক কলব্যাক পদ্ধতির মধ্যে থেকে আহবান করা হয়েছে, তাই আমি ধারণাটি ধারণ করেছিলাম। আপনার প্রচেষ্টার জন্য ধন্যবাদ!
জন

2

Updateযাকে সম্ভব দ্রুত বলা হয়। ভেরিয়েবল 'টাইম.ডেলটাটাইম' শেষ কল থেকে যে সময় পার হয়ে গেছে তার আসল পরিমাণে সেট করা থাকে। যদি ল্যাগ বা অনুরূপ কিছু গেমটি গতি কমিয়ে দেয় তবে Updateউচ্চ মানের সাথে ল্যাগটি শেষ হয়ে গেলেই কেবল তখনই তাকে ডাকা হবে deltaTime

FixedUpdateনিয়মিত বিরতিতে ডাকা হয়। এটি 'টাইম.ফিক্সডডেল্টটাইম'-এ উল্লিখিত অনুপাতের চেয়ে বেশি বেশি কখনও ডাকা হবে না। যদি পিছিয়ে বা অনুরূপ কিছু গেমটি গতি কমিয়ে দেয়, FixedUpdateগেমটি ধরতে সক্ষম করার জন্য দ্রুত পর পর একাধিকবার ডাকা হবে। রান Time.deltaTimeকরার Time.fixedDeltaTimeআগে সমান সেট করা FixedUpdateথাকলেও দুজনের মধ্যে কোড মাইগ্রেট করা সহজ করার জন্য এটি কেবল একটি প্রীতি।

সাধারণত, Updateঅবিচ্ছিন্ন আচরণের FixedUpdateজন্য এবং এমন আচরণগুলির জন্য ব্যবহার করা উচিত যা ধাপে ধাপে গণনা করা উচিত, বা যা তাদের উপর নির্ভর করে যেমন পদার্থবিজ্ঞান ভিত্তিক আন্দোলন। আপনি যদি Updateলাইন ধরে কোনও ধরণের লুপ লিখছেন for(time=0;time<=deltaTime;time+=someStep)...তবে সম্ভবত এটির পরিবর্তে সম্ভবত ফিক্সডআপেটে করা উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.