জাভা 2 ডি গেম প্রোগ্রামিং: গেম লুপ তৈরির জন্য বিভিন্ন পদ্ধতি


10

আমি জাভা গেম প্রোগ্রামিংয়ে নতুন, তবে যতই পড়ি ততই আমি বিভ্রান্ত হয়ে পড়েছি, কারণ আমি গেম লুপ তৈরির জন্য বিভিন্ন পদ্ধতি দেখেছি: ১. টাইমার ক্লাস ব্যবহার করার মানক পদ্ধতি (কম বলে মনে হচ্ছে) সুনির্দিষ্ট)। ২. সিস্টেম.নানোটাইম ব্যবহার করে আরও সুনির্দিষ্ট পদ্ধতির। ৩. একটি সাধারণ পন্থা যা শিডিয়ুলএটিফিক্সডেরেট ব্যবহার করে।

কোনটি সাধারণত পছন্দ করা উচিত এবং প্রতিটি পদ্ধতির সুবিধা / অসুবিধাগুলি কোথায়? যেকোনো তথ্যের জন্য অগ্রিম ধন্যবাদ.

উত্তর:


7

একটি বেসিক গেম লুপের জন্য, আপনি কিছুক্ষণ লুপ চালাতে চাইবেন যার মধ্যে আপনি ন্যানোটাইম () ব্যবহার করে সময় পাবেন, শেষ ফ্রেমের পরে কতটা সময় কেটে গেছে তা নির্ধারণ করুন, তারপরে আপনার গেমস্টেট আপডেট করুন এবং রেন্ডার করুন।

Http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime%28%29 ব্যবহার করে আপনি অতিবাহিত সময়ের জন্য ভোট দিতে পারেন। মূলত ...

public static void main(String [ ] args)
{
    long current_frame_time = system.nanoTime();
    long last_frame_time = current_frame_time;

    while(gameIsRunning)
    {
        last_frame_time = current_frame_time;
        current_frame_time = system.nanoTime();

        long timeTaken = current_frame_time - last_frame_time;

        //update and render game here
    }
}

এই বেসিক পদ্ধতিটি উন্নত করা যেতে পারে, যেমন: http://www.koonsolo.com/news/dewitters-gameloop/ এবং http://gafferongames.com/game-physics/fix-your-timestep/

বিকল্পভাবে, আপনি একটি টাইমার তৈরি করতে এবং এই আপডেটটি চালাতে এবং প্রতিটি এক্স মিলিসেকেন্ড রেন্ডার করতে এই টাইমার সেট করতে পারেন। তবে, গেমলুপটি তৈরি করার মতো কিছু ডাউনসাইড রয়েছে।

Http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html এর মতে : " প্রতিটি টাইমার অবজেক্টের সাথে সঙ্গতিপূর্ণ হ'ল একক পটভূমি থ্রেড যা টাইমার এর সমস্ত সম্পাদন করতে ব্যবহৃত হয় ক্রমানুসারে, টাইমার কাজগুলি দ্রুত সম্পন্ন করা উচিত If টাইমার টাস্কটি শেষ করতে অতিরিক্ত সময় নিলে এটি টাইমার টাস্ক এক্সিকিউশন থ্রেডকে "হোগস" করে turn এটি ফলস্বরূপ পরবর্তী কাজগুলি কার্যকর করতে বিলম্ব করতে পারে, যা "গুচ্ছো" হতে পারে এবং আপত্তিকর কাজটি শেষ হয়ে গেলে (এবং যদি) দ্রুত উত্তরাধিকারে কার্যকর করুন ute "

Http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html#scheduleAtFixedRate%28java.util.TimerTask ,% 20java.util.Date ,% 2020 Long%29 অনুসারে : " স্থির-হার কার্যকরকরণের ক্ষেত্রে, প্রতিটি মৃত্যুদন্ড কার্যকর কার্যকর সময় নির্ধারিত সময় অনুসারে নির্ধারিত হয় an যদি কোনও কারণে কার্যকর হয় (যেমন আবর্জনা সংগ্রহ বা অন্যান্য পটভূমি ক্রিয়াকলাপ) কার্যকর হয় তবে দুটি বা তার বেশি মৃত্যুদন্ড কার্যকর হবে rapid "ক্যাপচার আপ"। দীর্ঘমেয়াদে, মৃত্যুদন্ড কার্যকর করার ফ্রিকোয়েন্সিটি নির্দিষ্ট সময়ের জন্য হুবহু যথাযথ হবে (ধরে নিলে সিস্টেম ক্লক অন্তর্নিহিত অবজেক্ট.ওয়েট (দীর্ঘ) সঠিক)) "

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

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


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

আমি প্রশ্নের উত্তর প্রতিফলিত করতে আমার উত্তর অভিযোজিত।
এক্সিলি

7

আমি টাইমারটিতে প্রধান লুপটি রাখব না। বরং আমি একটি 'ওয়েল' লুপ তৈরি করব যা প্রতিটি ফ্রেমকে প্রক্রিয়া করে এবং তারপরে শেষ ফ্রেম / শেষ পুনরাবৃত্তির পরে কতটা সময় কেটে গেছে তা গণনা করার জন্য কিছু ধরণের টাইমকিপিং কার্যকারিতা (এটি জাভাতে মনে হয় যে System.nanoTime হবে) ব্যবহার করবে লুপ.

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

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