মূল গেম লুপটি নিয়ন্ত্রণহীনভাবে চালাতে কি কোনও ক্ষতি আছে?


19

আমি ভাবছিলাম যে আমার গেম লুপটি সিস্টেমের যত দ্রুত গতিতে চালায় তখন কোনও সম্ভাব্য ক্ষতি আছে কিনা?

আমার বর্তমানে একটি লুপ রয়েছে, এটি, ন্যানোসেকেন্ডে সময় পার করে পরিমাপ করে, কোনও সমস্যা ছাড়াই পূর্বনির্ধারিত গতিতে গেম লজিক এবং রেন্ডারিং লজিকটি চালায়। আসলে আমি লুপটিতে যে কোনও যুক্তি করি তা প্রতিটি সেকেন্ডে একটি নির্দিষ্ট পরিমাণ কলগুলিতে আটকে থাকে।

লুপ নিজেই যদিও এটি পছন্দ হিসাবে প্রায় দ্রুত চালায় যা প্রায় ১১.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++;
    }
}

আপনি দেখতে পাচ্ছেন যে প্রতিটি লুপটিতে প্রায় কোনও কোড চালিত হয় না তবে সর্বদা কতটা আসল সময় কেটে যায় তার উপর নির্ভর করে একটি নির্দিষ্ট নির্বাচন প্রশ্নটি সেই 'কর্মী লুপ' এবং এটি কীভাবে সিস্টেমকে প্রভাবিত করে তা উল্লেখ করে।


2
বাধ্যতামূলক 'আপনার টাইমস্টেপ ঠিক করুন' লিঙ্ক: gafferongames.com/game-physics/fix- আপনার- টাইমস্টেপ দয়া করে এটি পড়ুন। এছাড়াও নোট করুন যে থ্রেড.স্লিপ () আপনার টাইমস্টেপটি নির্ভরযোগ্যভাবে থ্রট করতে ব্যবহার করা যাবে না কারণ অনুরোধকৃত সময়ের পরে ওএস আপনার অ্যাপ্লিকেশনটিতে নিয়ন্ত্রণ ফিরিয়ে আনার গ্যারান্টি দেয় না। (এটি ভিন্ন হতে পারে)।
রায় টি।

হ্যাঁ, এটি সিউডোকোডের সমস্যা। গ্যাফার যা লিখেছেন তার বেশিরভাগই আমি করেছি (বর্তমানে একটি ডেল্টা বাস্তবায়নে কাজ করছে যা আমার লুপ কাঠামোর পরিপূরক হয়)। আমি যদি থ্রেড.স্লিপ () ব্যবহার করতে না পারি তবে স্ট্যান্ডার্ড জাভাতে আর কী পাওয়া যায়?
dot_Sp0T

1
আপনি সাধারণত থ্রেড.স্লিপ (0) সহ একটি ব্যস্ত লুপ ব্যবহার করেন এবং সেরাটির জন্য আশা করেন। গাফার কয়েকটি নিবন্ধে এ সম্পর্কে অনেক কথা বলে।
রায় টি।

ওয়েল এটি মূলত আমি যা করছি, কেবল থ্রেড ছাড়াই leep ঘুম (0), এবং মূলত এই প্রশ্নটি উত্সাহিত করেছিল। সিস্টেমের লুপ লুপটিতে কোনও ব্যস্ততার (শ্রদ্ধায় ব্যস্ত নয় এমনকি সেই ছোট্ট পুনরাবৃত্ত যুক্তিটিও থ্রোটলড হয়ে আছে) কি আছে?
dot_Sp0T

কিছুক্ষণ আগে, একটি বাগ স্টারক্রাফ্ট দ্বিতীয়টিকে কিছু নির্দিষ্ট শর্তে এটি করতে বাধ্য করে। এটি আক্ষরিকভাবে কয়েকটি জিপিইউ গলে শেষ হয়েছিল। হ্যাঁ, অনিয়ন্ত্রিত গেমের লুপের পক্ষে ক্ষতির কারণ এটি খুব সম্ভব।
ম্যাসন হুইলার

উত্তর:


35

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

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

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


ফিলিপ ব্যাখ্যা জন্য ধন্যবাদ। আমি আসলে এই সত্যটি উল্লেখ করেছি যে আমি একটি নির্দিষ্ট fps এবং tps এ চালিয়ে যাচ্ছি এবং পাশাপাশি ভোটদানটি সেকেন্ডে কেবলমাত্র একটি নির্দিষ্ট পরিমাণে করে চলেছি। যদিও এটি আরও পরিষ্কার করার চেষ্টা করবে।
dot_Sp0T

@ dot_Sp0T আপনার প্রশ্নের আপনার সম্পাদনার পরে, কেবল প্রথম অনুচ্ছেদ এবং শেষ বাক্যটি আপনার ক্ষেত্রে প্রাসঙ্গিক। তবে আমি আমার উত্তরের দ্বিতীয় এবং তৃতীয় অনুচ্ছেদটি ধরে রাখতে চাই কারণ তারা অন্যদের পক্ষে সহায়ক হতে পারে।
ফিলিপ

আমি সম্ভবত আপনার উত্তরটি গ্রহণ করব কারণ প্রথম অনুচ্ছেদটি পুরোপুরি ভাল উত্তর দিয়েছে। আপনি কীভাবে কোনওভাবে দৃষ্টিগোচরভাবে এটিকে উত্তরটির বাকি অংশগুলি থেকে আলাদা করতে চান?
dot_Sp0T

একটি ডেস্কটপে আনপ্যাচড সভ্যতা 2 খেলুন এবং আপনি এটি একটি সমস্যা হিসাবে দেখতে পাবেন। কমপক্ষে, আমি না। shrug
corsiKa

1
ব্যাটারি এবং ফ্যান বিবেচনার পাশাপাশি, বর্ধিত সিপিইউ ব্যবহারের ফলে অতিরিক্ত তাপ বাড়তে পারে যা অস্বস্তিকর হতে পারে (যেমন ল্যাপটপ, এসপি আমার আরএমবিপি) এবং এমনকি পিসি বন্ধ হয়ে যেতে পারে (এসএসপি পুরানো পিসির সাথে ডাস্টি কুলার সহ)। আপনি যদি সমস্ত কোরকে 100% চালনা করেন তবে এই কারণগুলি হতাশাগ্রস্ত হয় ।
এনপিএসএফ 3000

2

আপনি সিপিইউ চক্র নষ্ট করছেন। এর অর্থ নোটবুক, ট্যাবলেট এবং ফোনগুলিতে ব্যাটারির সময় কম, উচ্চ বিদ্যুতের বিল, মেশিন দ্বারা উত্পাদিত আরও উত্তাপ, উচ্চস্বরে ভক্ত। এছাড়াও, আপনি অন্যান্য গুরুত্বপূর্ণ সিস্টেম প্রক্রিয়াগুলি থেকে চক্র খাচ্ছেন (যেমন উইন্ডো সার্ভারটি ঝাঁকুনির সাথে পরিণত হতে পারে), যা গেমপ্লেটিকে প্রভাবিত করতে পারে। আজকের প্রাক-ইমপ্রিটিভ মাল্টিটাস্কিং সিস্টেমে কিছু সিস্টেমের শিডিয়ুলার এমন অ্যাপ্লিকেশনগুলিকেও শাস্তি দেয় যা প্রচুর চক্র ব্যবহার করে, তাই আপনি প্রথমে দ্রুত হতে পারেন, তারপরে হঠাৎ হঠাৎ অদ্ভুত ঝাঁকুনি দেখবেন যখন আপনি সিস্টেমটি ছোঁড়াচ্ছেন।

অনেক গেমার গেমারগুলি তাদের ফ্যানের চশমাগুলির প্রান্ত থেকে স্ক্র্যাচ থেকে কাস্টম পিসিও তৈরি করে, এক্ষেত্রে গরমের দিন এবং আপনার গেমটি উত্তাপের ফলে মেশিনে সুরক্ষিত হতে পারে (সর্বোপরি) বা এমনকি অংশগুলি অতিরিক্ত গরম করে তোলে এবং die (সবচেয়ে খারাপ) সুতরাং যদি এটি আপনার লক্ষ্যযুক্ত শ্রোতা হয় তবে আপনি নিশ্চিত করতে পারেন যে আপনি সর্বদা "শীর্ষে" কিছুটা স্থান রেখে যাচ্ছেন।

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


আমি বিপরীতভাবে বলতে চাই যে লোকেরা যারা আগ্রহীভাবে তাদের মেশিনগুলি তৈরি করে তারা ভাল ফ্যান এমনকি এমনকি জলকুলিং ব্যবহার করে। কেবল এইচটিপিসি বা মিনি আইটিএক্স ক্ষেত্রেই সীমাবদ্ধতা থাকতে পারে। অন্যথায়, দরিদ্র তবে উত্সাহী লোকেরা বাক্সটি ভেন্টিরিড ব্যবহার করবে। যা 100% তেও যথেষ্ট, গরম তবে ঠিক আছে।
v.oddou

আমি শুধু অভিজ্ঞতা থেকে পুনরাবৃত্তি করছি। আপনি যদি স্টার ট্রেক অনলাইনে দেখে থাকেন তবে তাদের জিইউআইতে তাদের আলাদা আলাদা সেটিংস রয়েছে যা নির্দিষ্ট মেশিনকে অতিরিক্ত গরম থেকে বাঁচানোর জন্য তাদের মূল লুপে স্লিপ () গুলি প্রবেশ করিয়ে দেবে, সুতরাং নেভারউইনটারের নির্মাতা এবং যদি এটি অস্বাভাবিক জিনিস নাও হতে পারে এসটিও এটি যুক্ত করার প্রয়োজন দেখেছিল। সেই আবেগটি মাথায় রাখুন! = দক্ষতা। এখানে অনেক দক্ষ এবং উত্সাহী টিঙ্কার রয়েছে, তবে এমন আরও কিছু শিক্ষানবিশ এবং অন্যান্য এখনও রয়েছে যা শিখছে এবং একটি শালীন ড্রপ-আউট হারের সাথে পরিসংখ্যান বলছে যে তারা সংখ্যাগরিষ্ঠ।
uliwitness

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

1

আপনার জিটারি মুভমেন্ট / গেমপ্লে করা উচিত নয়

দুটি উপায় রয়েছে যে আপনি গেম যুক্তি প্রয়োগ করতে পারবেন - আসল সময়ের সাথে বাঁধা, বা "টার্নস" / প্রসেসিং পদক্ষেপের সংখ্যায় আবদ্ধ। যদি আপনার গেমের কিছু জিনিস বাম দিকে অগ্রসর হয়, তবে আপনার স্টেপলজিক () কে 50 বারের পরিবর্তে 100 বলা হলেও গতি কি আলাদা হবে?

যদি আপনার কোড অতিবাহিত সময়ের সাথে সর্বত্র স্পষ্টভাবে আচরণ করে এবং এটি সঠিকভাবে করে, তবে এটি ঠিক হতে পারে; তবে আপনার কোডে যদি এমন কিছু থাকে যা 'পদক্ষেপের' সংখ্যার উপর নির্ভর করে তবে আপনি অযাচিত পার্শ্ব-প্রতিক্রিয়া পাবেন।

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

দ্বিতীয়ত, আপনি কম্পিউটারের গতির উপর নির্ভর করে চরিত্রের ক্ষমতা নিয়ে সমস্যা পেতে পারেন - একটি সর্বোত্তম উদাহরণ হ'ল পুরাতন ভূমিকম্পের সমস্যা যেখানে সর্বাধিক জাম্পিংয়ের পরিধিটি অনিচ্ছাকৃতভাবে আপনার fps এর উপর নির্ভরশীল ছিল।

এই কোডটি এফপিএস-স্বতন্ত্র হওয়ার চেষ্টা করার পরেও এই সমস্যাগুলি উপস্থিত হতে পারে, রাউন্ডিং ত্রুটির জমে থাকা প্রায়শই এ জাতীয় বাগের কারণ হতে পারে।


1
আমি আপনার উত্তরটি যতটা পছন্দ চাইছি প্রশ্নের সাথে প্রাসঙ্গিক নয়, কারণ আমি জিটারি মুভমেন্ট / গেমপ্লে সম্পর্কে জিজ্ঞাসা করছি না তবে একটি অনিয়ন্ত্রিত লুপের ক্ষতি সম্পর্কে (যা কোনও যুক্তি বা রেন্ডারিং বা অন্য কোনও কিছু নিয়ন্ত্রণ করে না) সিএসকে করতে পারে
dot_Sp0T

1

আপনার সম্ভাব্য ক্ষতির একমাত্র সম্ভাব্য ক্ষতি তাই মোবাইল ডিভাইসে এটি করবেন না। বিপরীতভাবে, বেশ কিছু এম্বেড থাকা সিস্টেমগুলি ঘটে যাওয়ার জন্য অপেক্ষা করে তাদের পুরো জীবন একটি লুপে ব্যয় করে।

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

স্মার্ট ইনপুট প্রতিক্রিয়া নিশ্চিত করতে আপনি যদি কোনও উইন্ডোজ সিস্টেম বা অনুরূপ থাকেন তবে প্রতিটি পাসে কমপক্ষে জরিপ ইনপুটগুলিতে আপনাকে পরামর্শ দেব।


এটি টাইমারের প্রশ্ন নয়, এটি ক্রোনোমিটারের প্রশ্ন নয় বরং আমি বলতে চাই বা পারফরম্যান্স কাউন্টার। এক সময় আসল সময় পাওয়া উচিত এবং একটি ফ্রি লুপ পুরোপুরি কার্যকর হয়। তবে একটি টাইমার (নিয়মিত বাধা অর্থে) সাধারণ ব্যবহারে লুপের গতি নিয়ন্ত্রণ করার চেষ্টা করছে। আমি এই ভাল বিবেচনা করবেন না। গেম লুপটি নিয়ন্ত্রণ করতে, vsync সিগন্যালে ওয়েট swap/ present/ flipফাংশনটি ব্যবহার করা ভাল ।
v.oddou
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.