এই কোডে "ডেল্টা" এর বিন্দুটি কী? এটি গেম ডেভের কোনও মানক জিনিসকে প্রতিফলিত করে?


24

আমি গেম প্রোগ্রামিং সম্পর্কে খুব কম জানি তবে আরও শিখতে চাই। আমি এই গেমটির কোড বোঝার চেষ্টা করছি । আমি বোঝার চেষ্টা করছি কেন কোডটি শিপকন্ট্রোলস.জেজে একটি "ব-দ্বীপ" পাঠাচ্ছে, যা ব্যবহারকারীর ইনপুটের ভিত্তিতে জাহাজের দিক পরিবর্তন করে।

মূলত গেমটি প্রতিটি লুপ "ব-দ্বীপ" গণনা করে ...

এখানে স্ট্যাকের একটি সংক্ষিপ্ত সংস্করণ দেওয়া হয়েছে যা একটি লুপের মাধ্যমে ডেল্টা ব্যবহার করে ...

var delta = now - this.time;
this.time = now;
this.current.render.call(this.current, delta, this.renderer);  

এখানে পদক্ষেপ ...

ctx.manager.add("game", scene, camera, function(delta, renderer)
{
if(delta > 25 && this.objects.lowFPS < 1000) this.objects.lowFPS++;
var dt = delta/16.6;
this.objects.components.shipControls.update(dt); 

এখানে পদক্ষেপ ...

bkcore.hexgl.ShipControls.prototype.update = function(dt)
{
var pitchAng;
var yaw;
var roll;
if (undefined != hand){ 

যা এর মতো স্টাফ করে ...

if(this.key.forward)
    this.speed += this.thrust * dt;
else

এবং এই...

if(this.key.right)
{
    angularAmount -= this.angularSpeed * dt;

এখানে ব-দ্বীপের কী লাভ? এটি কি কেবল এলোমেলোতার একটি উপাদান পরিচয় করানোর চেষ্টা করছে? এই গেমের কোডটি খুব ভাল। কেন এই লোকটি ডেল্টা ব্যবহার করেছিল?


2
"এটি কি কেবল এলোমেলোতার একটি উপাদান চালু করার চেষ্টা করছে?" আসলে ঠিক এর বিপরীতটি সত্য, এখানের ব-দ্বীপের উদ্দেশ্যটি এলোমেলোতা হ্রাস করা এবং গেম ইঞ্জিনে পদার্থবিজ্ঞানকে স্বাভাবিক করা।
zzzzBov

উত্তর:


27

এটিই "টাইম ডেল্টা"। পূর্ববর্তী আপডেটের পরে এটি কতটা সময় কেটে গেছে। এটি নিশ্চিত করা প্রয়োজন যে অ্যানিমেশন, পদার্থবিজ্ঞান এবং আরও সঠিক গতিতে চলছে।

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

টাইম ডেল্টাস প্রায়শই পদার্থবিজ্ঞানে প্রয়োগ করা হয় কারণ সহজ ইউলার সংহতকরণের জন্য সমীকরণগুলি নির্দিষ্ট করা হয়। অবস্থানে বেগ একীভূত হিসাবে সংজ্ঞায়িত করা হয় x1 = x0 + v * (t1 - t0), যা মত কোড মধ্যে সরলীকৃত x += v * dt। অতএব, পদার্থবিজ্ঞানের আপডেটগুলি মূল্যায়নের জন্য সময় ডেল্টা প্রয়োজন।

সময় ডেল্টাস পরিমাপ ও প্রয়োগ করা খুব স্বাভাবিক।


আমি মনে করি এটি সেরা উত্তর কারণ এটি ব্যাখ্যা করে যে 'ডিটি' অনেকগুলি পরিবর্তিত হতে পারে, এজন্য আমাদের এটির সাথে পদার্থবিজ্ঞানের গণনাগুলি বিভক্ত করা দরকার।
বিআইআইবি

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

... অবজেক্টের অবস্থানের মধ্যে স্বাভাবিকের চেয়ে বড় পরিমাণের দূরত্ব)।
সুপারক্যাট

@ সুপের্যাট: এটাই আপনার টাইমস্টেপ স্টাফ ঠিক। কোনও নির্দিষ্ট সিমুলেশন কবে পদক্ষেপ করা উচিত তা জানতে আপনার এখনও প্রতি ফ্রেম সময় ডেল্টাস দরকার।
শান মিডলডিচ

@ সানমিডলডিচ: আতারি ২ 26০০ এর জন্য গেমস কোড করেছেন এমন একজন হিসাবে আমি কিছুটা কৌতূহল দেখতে পেয়েছি যে আধুনিক খেলায় যখন খেলোয়াড় নিয়ামককে স্থানান্তরিত করে এবং চরিত্রটি প্রতিক্রিয়া জানায় তখন কোনও অপ্রয়োজনীয় পিছিয়ে থাকার বিষয়টি নিয়ে কেউ দুঃখ প্রকাশ করেনি। অনেকগুলি অ্যাটারি 2600 গেমগুলিতে, নিয়ন্ত্রণটি প্রতি 16.7 মিমি পল করে এবং প্লেয়ার আপডেটগুলি এর 1-16 মিমের মধ্যে হয় (উল্লম্ব অবস্থানের উপর নির্ভর করে); আধুনিক সরঞ্জামগুলি দ্রুত প্রতিক্রিয়া জানাতে অক্ষম।
সুপারক্যাট

32

"ডেল্টা", "ডি" বা "Δ" এর অর্থ গাণিতিক প্রসঙ্গে "পার্থক্য" । যখনই একই সংখ্যার সাথে দুটি সংখ্যার মধ্যে পার্থক্য রয়েছে, তখন এই পার্থক্যটিকে "ডেল্টা" বা "ডি" বলা যেতে পারে।

গেম বিকাশে ডেল্টাস খুব সাধারণ very উদাহরণস্বরূপ, এক সেকেন্ড আগে কোনও চরিত্রের এক্স-কোঅর্ডিনেট এবং এর এক্স-স্থানাঙ্কের মধ্যে পার্থক্যকে এখন "ডেল্টা এক্স" বলা যেতে পারে, এবং সাধারণত dx, delta_xবা হিসাবে চিহ্নিত করা হয় d_x

এছাড়াও, আপনার কোডটিতে যেমন দুটি বারের মধ্যে পার্থক্য রয়েছে তা খুব সাধারণ বিষয়:

var delta = now - this.time;

এই ক্ষেত্রে, যে পরিবর্তনশীল কিছু সময় সঞ্চিত মধ্যে পার্থক্য বাচক হয় this.time, এবং সময় সঞ্চিত now

ডেল্টাস সাধারণত সময়ে কোনও কিছুর পরিবর্তনের প্রতিনিধিত্ব করতে ব্যবহৃত হয়। সুতরাং উদাহরণস্বরূপ, যদি আপনি জানেন যে কোনও খেলোয়াড়ের এক্স স্থানাঙ্কের প্রতিটি ফ্রেমে 5 পিক্সেল পরিবর্তন করা উচিত, আপনি এই পরিবর্তনটি ব-দ্বীপ হিসাবে সংরক্ষণ করতে পারেন:

var delta_x = 5

এবং তারপরে যখনই আপনার প্রয়োজন হবে পরিবর্তনটি প্রয়োগ করতে সেই ডেল্টাটি ব্যবহার করুন:

player.x = player.x + delta_x

তবে মনে রাখবেন এটি কেবল একটি সম্মেলন। কেউ আপনাকে আপনার ভেরিয়েবলের নাম "ডেল্টা" বা "ডি" রাখতে বাধ্য করে না, তবে এটি করার ফলে আপনার কোডটি পড়তে পারে এমন কেউ বা নিজেকে ভবিষ্যতে পড়তে সাহায্য করতে পারে, ভেরিয়েবলটি কী করার কথা তা বোঝার জন্য।

প্রোগ্রামিংয়ে বহুল ব্যবহৃত অন্যান্য গ্রীক অক্ষরগুলি হ'ল:

অ্যাপসিলন : খুব স্বল্প মূল্যের জন্য। যথাযথ সমস্যার সাথে ভাসমান পয়েন্ট বা অন্যান্য ভেরিয়েবলের সাথে তুলনা করার সময় সাধারণত ব্যবহৃত হয়:

const epsilon = 0.0001
...
if abs(some_float - other_float) < epsilon then
    -- close enough, let's say they're equal
end

পাই : এপিমনাম ধ্রুবকের জন্য

থিতা : কোণ উপস্থাপনের জন্য

লাম্বদা : বেনামে ফাংশন বা সমাপনি উপস্থাপনের জন্য


1
আপনি 2π, π / 2, π / 4 এবং e এর মতো certain এর নির্দিষ্ট গুণকগুলিও দেখতে পাবেন (uleলারের ধ্রুবক)।
জেজেक्स

@ থমাস: অবশ্যই, গাণিতিক ভিত্তিক কোনও প্রোগ্রাম কোডের মধ্যে তাত্ত্বিক স্বীকৃতি আনবে। লক্ষ্য করুন বাক্য "অন্যান্য সাধারণ গ্রিক অক্ষর ব্যাপকভাবে ব্যবহৃত প্রোগ্রামিং রয়েছে"। " কিছু গ্রাফিক্স কোড" "সাধারণ" বা "বহুল ব্যবহৃত" হিসাবে খুব কমই যোগ্যতা অর্জন করে। আমি কখনও দাবি করিনি যে এগুলি কেবলমাত্র গ্রীক অক্ষর যা ব্যবহার করা যেতে পারে, বা এই গ্রীক অক্ষরের জন্য আপনি সেট করতে পারেন এমন একমাত্র অর্থ those
পান্ডা পাইজামা

@ ইজএক্স: গতবার আমি যাচাই করেছিলাম, ইউলারের ধ্রুবকটি লাতিন বর্ণটি "ই" ব্যবহার করেছে । আমি গাণিতিক ধ্রুবকগুলির বিষয়ে কথা বলছিলাম না যা কোডে উপস্থিত হয়, তবে পরিবর্তে গ্রীক বর্ণগুলি সম্পর্কে কোডে ব্যবহৃত হয়।
পান্ডা পাইজামা

@ পান্ডপাজামা আমার মন্তব্যটি স্বাগত নয় বলে আমি মুছে ফেলেছি।
টমাস

3
যদি আপনার কমরেড বিশেষত নিতম্ব হয় তবে আপনি এমনকি 2π এর পরিবর্তে তাউ (τ) দেখতে পাবেন π
কাজ ড্রাগন

3

dtজন্য দাঁড়িয়েছে delta time। এটি ফ্রেমের হারের গণনায় ব্যবহৃত হয়ে গেমটি একই গতিতে রান করে তা বীমা করানোর জন্য ফ্রেমের হার যাই হোক না কেন।

আরও তথ্য এখানেframerate independence পাওয়া যাবে


3

dt (ডেল্টা সময়) আপনার লুপের প্রতিটি চক্র / রেন্ডার ফ্রেমের (বা যে কোনও সময় আপনি পছন্দ করেন স্ট্যাম্পের মধ্যে) সময় হয়। এই ব-দ্বীপ সময়ের সাথে আমরা সময়ের সাথে নির্দিষ্ট মানগুলি প্রসারিত করতে পারি। বাস্তব বিশ্বের মতো আমরা সময়ের সাথে সাথে কিছু পদার্থবিজ্ঞানের বৈশিষ্ট্যও পরিমাপ করি।

ধরা যাক আমরা আমাদের গেমটি 60 সেকেন্ডে একটি সেকেন্ডে চালাই। আমরা যদি চাই আমাদের প্লেয়ারটি প্রতি সেকেন্ডে 5 পিক্সেল সরিয়ে নিয়ে যায়

 5 * (1/60); //Assuming we have a stable delta time of 0.016
 // (1/60) = 0.016 || 0.016 * 5 =  0.083 --> moved per frame || 60 frames * 0.083 = 5

অথবা

 5 * (newTime - oldTime); //aka dt

চরিত্রটি 5 পিক্সেল 60 ফ্রেমের উপরে সরিয়ে নিয়েছে। আপনার চক্রটি যত বেশি সময় নেয় বড় বদ্বীপের সময় পাবে।

প্রতিটি ফ্রেমরেটের জন্য (1/30, 1/25, ইত্যাদি) ফলাফল একই হবে।

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