কোডিং অংশ / বিকাশকারী দৃষ্টিকোণে আগ্রহী ব্যক্তিদের জন্য জার্নম্যান গেকের জবাব (কারণ আমার সম্পাদনা প্রত্যাখ্যান হয়েছে) এর সংযোজন হিসাবে:
প্রোগ্রামারদের দৃষ্টিকোণ থেকে, যারা আগ্রহী তাদের জন্য, ডস সময়গুলি এমন সময় ছিল যেখানে প্রতিটি সিপিইউতে টিক গুরুত্বপূর্ণ ছিল তাই প্রোগ্রামাররা কোডটি যত দ্রুত সম্ভব রক্ষা করত।
একটি সাধারণ দৃশ্য যেখানে কোনও প্রোগ্রাম সর্বাধিক সিপিইউ গতিতে চলবে তা হ'ল সাধারণ (সিউডো সি):
int main()
{
while(true)
{
}
}
এটি চিরকালের জন্য চলবে, এখন, আসুন এই কোড স্নিপেটকে সিউডো-ডস-গেমে পরিণত করুন:
int main()
{
bool GameRunning = true;
while(GameRunning)
{
ProcessUserMouseAndKeyboardInput();
ProcessGamePhysics();
DrawGameOnScreen();
//close game
if(Pressed(KEY_ESCAPE))
{
GameRunning = false;
}
}
}
যদি না DrawGameOnScreen
ফাংশনগুলি ডাবল বাফারিং / ভি-সিঙ্ক ব্যবহার করে (যা ডস গেমস তৈরির সময়ে এক ধরণের ব্যয়বহুল ছিল), গেমটি সর্বোচ্চ সিপিইউ গতিতে চলবে। আধুনিক দিনে মোবাইল আই 7 এটি প্রতি সেকেন্ডে প্রায় 1,000,000 থেকে 5,000,000 বার চলবে (ল্যাপটপের কনফিগারেশন এবং বর্তমান সিপিইউ ব্যবহারের উপর নির্ভর করে)।
এর অর্থ হ'ল আমি যদি আমার bit৪ বিট উইন্ডোতে আমার আধুনিক সিপিইউতে কোনও ডস গেম কাজ করতে পারি তবে আমি এক হাজারেরও বেশি (1000!) এফপিএস পেতে পারি যা কোনও মানুষের পক্ষে খেলতে খুব দ্রুত হয় যদি পদার্থবিজ্ঞানের প্রসেসিং "ধরে নেওয়া হয়" এটি চলে তবে 50-60 fps এর মধ্যে।
বর্তমান দিনের বিকাশকারীরা (করতে পারেন) তা হ'ল:
- গেমটিতে ভি-সিঙ্ক সক্ষম করুন (* উইন্ডোযুক্ত অ্যাপ্লিকেশনগুলির জন্য উপলভ্য নয় ** [ওরফে শুধুমাত্র পূর্ণ-স্ক্রিন অ্যাপ্লিকেশনগুলিতে উপলব্ধ])
- শেষ আপডেটের মধ্যে সময়ের পার্থক্য পরিমাপ করুন এবং সময় পার্থক্য অনুযায়ী পদার্থবিজ্ঞানের আপডেট করুন যা কার্যকরভাবে এফপিএস হার নির্বিশেষে গেম / প্রোগ্রামকে একই গতিতে চালিত করে
- প্রোগ্রামেটিকভাবে ফ্রেমরেট সীমাবদ্ধ করুন
*** গ্রাফিক্স কার্ড / ড্রাইভার / ওএস কনফিগারেশনের উপর নির্ভর করে এটি সম্ভব হতে পারে।
পয়েন্ট 1 এর জন্য আমি দেখাব এমন কোনও উদাহরণ নেই কারণ এটি আসলে কোনও "প্রোগ্রামিং" নয়। এটি কেবল গ্রাফিক্স বৈশিষ্ট্য ব্যবহার করছে using
2 এবং 3 পয়েন্ট হিসাবে আমি সম্পর্কিত কোড স্নিপেট এবং ব্যাখ্যা দেখাব:
2:
int main()
{
bool GameRunning = true;
long long LastTick = GetCurrentTime();
long long TimeDifference;
while(GameRunning)
{
TimeDifference = GetCurrentTime()-LastTick;
LastTick = GetCurrentTime();
//process movement based on how many time passed and which keys are pressed
ProcessUserMouseAndKeyboardInput(TimeDifference);
//pass the time difference to the physics engine so it can calculate anything time-based
ProcessGamePhysics(TimeDifference);
DrawGameOnScreen();
//close game if escape is pressed
if(Pressed(KEY_ESCAPE))
{
GameRunning = false;
}
}
}
এখানে আপনি ব্যবহারকারীর ইনপুট এবং পদার্থবিজ্ঞানগুলি সময়ের পার্থক্যটিকে বিবেচনায় নিতে দেখতে পাচ্ছেন, তবুও আপনি পর্দায় 1000+ এফপিএস পেতে পারেন কারণ লুপটি যত দ্রুত সম্ভব চলছে running যেহেতু পদার্থবিজ্ঞানের ইঞ্জিন জানে যে কত সময় কেটে গেছে, এটি "কোনও অনুমান" বা "একটি নির্দিষ্ট ফ্রেমরেট" এর উপর নির্ভর করতে হবে না সুতরাং গেমটি যে কোনও সিপিইউতে একই গতিতে কাজ করবে।
3:
বিকাশকারীরা ফ্রেমরেটকে সীমাবদ্ধ করতে কী করতে পারে, উদাহরণস্বরূপ, 30 এফপিএস আসলে কিছুই শক্ত নয়, কেবল একবার দেখুন:
int main()
{
bool GameRunning = true;
long long LastTick = GetCurrentTime();
long long TimeDifference;
double FPS_WE_WANT = 30;
//how many milliseconds need to pass before we need to draw again so we get the framerate we want?
double TimeToPassBeforeNextDraw = 1000.0/FPS_WE_WANT;
//For the geek programmers: note, this is pseudo code so I don't care for variable types and return types..
double LastDraw = GetCurrentTime();
while(GameRunning)
{
TimeDifference = GetCurrentTime()-LastTick;
LastTick = GetCurrentTime();
//process movement based on how many time passed and which keys are pressed
ProcessUserMouseAndKeyboardInput(TimeDifference);
//pass the time difference to the physics engine so it can calculate anything time-based
ProcessGamePhysics(TimeDifference);
//if certain amount of milliseconds pass...
if(LastTick-LastDraw >= TimeToPassBeforeNextDraw)
{
//draw our game
DrawGameOnScreen();
//and save when we last drawn the game
LastDraw = LastTick;
}
//close game if escape is pressed
if(Pressed(KEY_ESCAPE))
{
GameRunning = false;
}
}
}
এখানে যা ঘটে তা হ'ল প্রোগ্রামটি গণনা করেছে যে কত মিলি সেকেন্ড চলে গেছে, যদি একটি নির্দিষ্ট পরিমাণ পৌঁছে যায় (33 এমএস) তবে এটি গেমের স্ক্রিনটিকে আবার অঙ্কন করে, কার্যকরভাবে frame 30 এর কাছাকাছি একটি ফ্রেম রেট প্রয়োগ করে।
এছাড়াও, বিকাশকারী উপর নির্ভর করে তিনি উপরের কোডটি সামান্য পরিবর্তিত করে সমস্ত প্রসেসিংটি 30 fps এ সীমাবদ্ধ করতে বেছে নিতে পারেন:
int main()
{
bool GameRunning = true;
long long LastTick = GetCurrentTime();
long long TimeDifference;
double FPS_WE_WANT = 30;
//how many miliseconds need to pass before we need to draw again so we get the framerate we want?
double TimeToPassBeforeNextDraw = 1000.0/FPS_WE_WANT;
//For the geek programmers: note, this is pseudo code so I don't care for variable types and return types..
double LastDraw = GetCurrentTime();
while(GameRunning)
{
LastTick = GetCurrentTime();
TimeDifference = LastTick-LastDraw;
//if certain amount of miliseconds pass...
if(TimeDifference >= TimeToPassBeforeNextDraw)
{
//process movement based on how many time passed and which keys are pressed
ProcessUserMouseAndKeyboardInput(TimeDifference);
//pass the time difference to the physics engine so it can calculate anything time-based
ProcessGamePhysics(TimeDifference);
//draw our game
DrawGameOnScreen();
//and save when we last drawn the game
LastDraw = LastTick;
//close game if escape is pressed
if(Pressed(KEY_ESCAPE))
{
GameRunning = false;
}
}
}
}
কয়েকটি অন্যান্য পদ্ধতি রয়েছে এবং সেগুলির কয়েকটি আমি সত্যিই ঘৃণা করি।
উদাহরণস্বরূপ, ব্যবহার করা sleep(<amount of milliseconds>)
।
আমি জানি ফ্রেমরেট সীমাবদ্ধ করার জন্য এটি একটি পদ্ধতি, তবে যখন আপনার গেম প্রসেসিংয়ে 3 মিলিসেকেন্ড বা তার বেশি লাগে তখন কী হয়? এবং তারপরে আপনি ঘুমটি কার্যকর করবেন ...
এটি কেবল sleep()
যার ফলে হওয়া উচিত তার চেয়ে কম ফ্রেমরেট তৈরি করবে ।
উদাহরণস্বরূপ যাক 16 এমএসের ঘুমের সময় নিই। এটি 60 Hz এ প্রোগ্রামটি চালিত করবে। এখন ডেটা, ইনপুট, অঙ্কন এবং সমস্ত স্টাফ প্রসেসিংয়ে 5 মিলিয়ন সেকেন্ড সময় লাগে। আমরা এখন এক লুপের জন্য 21 মিলি সেকেন্ডে আছি যার ফলস্বরূপ 50 Hz এর চেয়ে সামান্য কম হয়ে যায়, আপনি এখনও সহজেই 60 হার্জে থাকতে পারেন তবে ঘুমের কারণে এটি অসম্ভব।
একটি সমাধান হ'ল প্রক্রিয়াজাতকরণের সময়টি পরিমাপ করার আকারে একটি অভিযোজিত ঘুম তৈরি করা এবং আমাদের "বাগ" ঠিক করার ফলস্বরূপ কাঙ্ক্ষিত ঘুম থেকে প্রসেসিংয়ের সময় কেটে নেওয়া:
int main()
{
bool GameRunning = true;
long long LastTick = GetCurrentTime();
long long TimeDifference;
long long NeededSleep;
while(GameRunning)
{
TimeDifference = GetCurrentTime()-LastTick;
LastTick = GetCurrentTime();
//process movement based on how many time passed and which keys are pressed
ProcessUserMouseAndKeyboardInput(TimeDifference);
//pass the time difference to the physics engine so it can calculate anything time-based
ProcessGamePhysics(TimeDifference);
//draw our game
DrawGameOnScreen();
//close game if escape is pressed
if(Pressed(KEY_ESCAPE))
{
GameRunning = false;
}
NeededSleep = 33 - (GetCurrentTime()-LastTick);
if(NeededSleep > 0)
{
Sleep(NeededSleep);
}
}
}