আমি ভাবছিলাম যে আমার গেম লুপটি সিস্টেমের যত দ্রুত গতিতে চালায় তখন কোনও সম্ভাব্য ক্ষতি আছে কিনা?
আমার বর্তমানে একটি লুপ রয়েছে, এটি, ন্যানোসেকেন্ডে সময় পার করে পরিমাপ করে, কোনও সমস্যা ছাড়াই পূর্বনির্ধারিত গতিতে গেম লজিক এবং রেন্ডারিং লজিকটি চালায়। আসলে আমি লুপটিতে যে কোনও যুক্তি করি তা প্রতিটি সেকেন্ডে একটি নির্দিষ্ট পরিমাণ কলগুলিতে আটকে থাকে।
লুপ নিজেই যদিও এটি পছন্দ হিসাবে প্রায় দ্রুত চালায় যা প্রায় ১১.7 মিলিয়ন আমার মেশিনে এক সেকেন্ডে আসে।
লুপ (সাধারণ সিউডোকোড):
while(!isGameOver){
if(canPollInputs){
pollInputs()
}
while(canStepLogic){
stepLogic()
}
if(canRender){
render()
}
}
আমার প্রশ্নটি মূলত যদি সেই সরল লুপটি যদি এটি একটি নিয়ন্ত্রিত গতিতে না চালায় তবে কোনও সিস্টেমের কোনও ক্ষতি করতে পারে?
সম্পাদনা করুন: তার অর্থ আমার যুক্তি 30 সেকেন্ডে (30 টিপিএস) 30 বার চলছে, আমার রেন্ডারার f০ এফপিএসে চলছে, আমি ভোট দিচ্ছি প্রতি সেকেন্ডে ১০০ গুণ এবং লজিককে মোকাবেলা করার জন্য কিছুটা যুক্তি বা প্রত্যাশার চেয়ে বেশি সময় নিচ্ছে । তবে লুপটি নিজেই থ্রোটলড নয়।
সম্পাদনা: Thread.sleep()
উদাহরণস্বরূপ প্রধান লুপটি প্রতি সেকেন্ডে 250 লুপের নিচে থ্রটল হ্রাস হ্রাস করতে পারে তবে লুপগুলি কাঙ্ক্ষিত 250 এর পরিবর্তে প্রতি সেকেন্ডে প্রায় 570 লুপে চালিত হয় (যখন আমি আমার ডেস্কটপ মেশিনে থাকি তখন কোড যুক্ত করা হবে ..)
সম্পাদনা করুন: আমরা এখানে যাচ্ছি, একটি স্পষ্ট জাভা গেমলুপ জিনিস পরিষ্কার করার জন্য। এটি নির্দ্বিধায় ব্যবহার করুন তবে এটি আপনার বলে দাবি করবেন না;)
private void gameLoop() {
// Time that must elapse before a new run
double timePerPoll = 1000000000l / targetPPS;
double timePerTick = 1000000000l / targetTPS;
double timePerFrame = 1000000000l / targetFPS;
int maxFrameSkip = (int) ( (1000000000l / MINIMUM_FPS) / timePerTick);
int achievedPPS = 0;
int achievedFPS = 0;
int achievedTPS = 0;
long timer = TimeUtils.getMillis();
int loops = 0;
int achievedLoops = 0;
long currTime = 0l;
long loopTime = 0l;
long accumulatorPPS = 0l;
long accumulatorTPS = 0l;
long accumulatorFPS = 0l;
long lastTime = TimeUtils.getNano();
while(!isRequestedToStop) {
currTime = TimeUtils.getNano();
loopTime = currTime - lastTime;
lastTime = currTime;
loops = 0;
accumulatorPPS += loopTime;
accumulatorTPS += loopTime;
accumulatorFPS += loopTime;
if(accumulatorPPS >= timePerPoll) {
pollInputs();
playerLogic();
achievedPPS++;
accumulatorPPS -= timePerPoll;
}
while(accumulatorTPS >= timePerTick && loops < maxFrameSkip) {
tick();
achievedTPS++;
accumulatorTPS -= timePerTick;
loops++;
}
// Max 1 render per loop so player movement stays fluent
if(accumulatorFPS >= timePerFrame) {
render();
achievedFPS++;
accumulatorFPS -= timePerFrame;
}
if(TimeUtils.getDeltaMillis(timer) > 1000) {
timer += 1000;
logger.debug(achievedTPS + " TPS, " + achievedFPS + " FPS, "
+ achievedPPS + " Polls, " + achievedLoops + " Loops");
achievedTPS = 0;
achievedFPS = 0;
achievedLoops = 0;
}
achievedLoops++;
}
}
আপনি দেখতে পাচ্ছেন যে প্রতিটি লুপটিতে প্রায় কোনও কোড চালিত হয় না তবে সর্বদা কতটা আসল সময় কেটে যায় তার উপর নির্ভর করে একটি নির্দিষ্ট নির্বাচন প্রশ্নটি সেই 'কর্মী লুপ' এবং এটি কীভাবে সিস্টেমকে প্রভাবিত করে তা উল্লেখ করে।