ঘুম ব্যবহার করে একটি থ্রেডে রেন্ডার / অঙ্কন কোড থেকে যুক্তি / আপডেট পৃথক করে


9

আমি পড়েছি যে গেমের বিষয়গুলির গতি এফপিএস দ্বারা বাধা দেওয়া উচিত নয় বরং পরিবর্তে সময় ভিত্তিক হওয়া উচিত। অঙ্কন হার সীমাবদ্ধ না রেখে পারফরম্যান্স সর্বাধিকীকরণের জন্য আপডেট / অঙ্কিত কোডটি কীভাবে আলাদা করতে পারি এবং সময়ের ভিত্তিতে একটি ধ্রুবক যুক্তি আপডেটের হার সরবরাহ করতে পারি?

আমার বর্তমান সিউডো কোডটি নিম্নরূপ

loop
{
    draw();
    if (ticksElapsed() > 100)
    {
        update();
        ticks+= ticksElapsed();
    }        
}

সমস্যা হ'ল অঙ্কন কোডটি আপডেট () হারের কার্যকারিতা বাধা দেয়। এবং এটি 100% সিপিইউ খরচ করে কারণ যদি ঘুমের মধ্যে ফেলে দেওয়া হয় তবে এটি অঙ্কন / যুক্তি উভয়ই বন্ধ করে দেয়।

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


1
আপনাকে কেবল অপেক্ষা করার জন্য 100% সিপিইউ শক্তি নষ্ট করার দরকার নেই, টিক্সল্যাপড () <100 থাকলে লুপগুলি লুপের শেষে শেষের দিকে একটি ঘুম (0) রাখুন other অন্য কোনও থ্রেড না থাকলে ওএস তাত্ক্ষণিকভাবে থ্রেডে ফিরে আসবে চালাতে চায় তবে আর 100% সিপিইউ শক্তি অপচয় করে না।
মাইক সেমদার

যাইহোক, এই জাতীয় 1 থ্রেড সেটআপের সর্বোত্তম সমাধানটি হ'ল ভিসিএনসি ব্যবহার করা, যদি আপনি ভিসিএনসি করতে না পারেন তবে লক্ষ্য ফ্রেমের হারে পৌঁছা পর্যন্ত একটি লুপে ঘুম (0) কল করুন, তারপরে আপডেট করুন এবং আঁকুন
মাইক সেমডার

উত্তর:


3

আপনার কোড স্নিপেটে দেখে মনে হচ্ছে আপনি স্থির-সময় ধাপে আপনার গেমটি ব্যস্ত-অপেক্ষা করে চালানোর চেষ্টা করছেন যদি আপনার অঙ্কন এবং আপডেটটি 15 মিমি (60fps) কম নেয়। এটি সম্ভব এবং আপনি সঠিকভাবে অনুমান করেছিলেন যে স্লিপ কল ব্যবহার করে এটি করা যাবে না কারণ আপনি কতক্ষণ ঘুমাতে যাচ্ছেন তা আপনি ঠিক জানেন না। ব্যস্ত-অপেক্ষার লুপটি ভাল সমাধান।

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

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

মূলত আপনি এখান থেকে যান:

void UpdatePlayer()
 player.x += 10;

প্রতি

void UpdatePlayer(float elapsedSeconds) //the total seconds elapsed since last update
 player.x += walkspeed * elapsedSeconds;

সুতরাং আমার ইঞ্জিন সর্বদা 100% গ্রাস করবে এবং আমি এটি সম্পর্কে কিছুই করতে পারি না?
ওসকেনসো কাশি

1
এটি শিডিয়ুলার এটি পেতে যতটা চক্র গ্রহণ করবে ততটুকু এটি ব্যবহার করবে, তবে এটি সত্যিই কোনও সমস্যা নয় কারণ আপনি গেম খেলার সময় অন্যান্য অনেক কিছুই করতে পারবেন না :) do
রায় টি।

@ ওসেকনসো, তবে আপনি যদি 1 টির বেশি থ্রেড ব্যবহার করেন তবে এটি একটি সমস্যা, তবে মূল থ্রেড অন্যকে তারা যতটা পারত চালাতে দেবে না, সেই সময় লুপটিতে প্রচুর পরিমাণে গণনা শক্তি নষ্ট করে, আপনার সত্যিই একটি ঘুম বিবেচনা করা উচিত
মাইক সেমদার

@ মাইক সেমদার: ঘুমের (x) সঠিক না হওয়ার জন্য আপনার কী সমাধান আছে? ঘুমের ব্যবধান কেটে যাওয়ার পরে, থ্রেডটি চালানোর জন্য প্রস্তুত। তবে একটি প্রস্তুত থ্রেড অবিলম্বে চালানোর গ্যারান্টিযুক্ত নয়। তা শিডিয়ুলার পর্যন্ত। আপনি যখন দুটি থ্রেড ব্যবহার করছেন তখন এর অন্যান্য সমাধানও রয়েছে, তার জন্য এই দুর্দান্ত নিবন্ধটি দেখুন: altdevblogaday.com/2011/07/03/threading- এবং- আপনার- খেলা- লুপ
রায় টি।

1
@ রয় স্লিপ (0) এর সমাধান। এটি চালনা করতে চায় এমন অন্য কোনও থ্রেড না থাকলে তা অবিলম্বে ফিরে আসে ( স্লিপ উইনএপিআই ) এবং অন্যান্য থ্রেডগুলি চালানোর সুযোগ দেয়। অন্য থ্রেডটি যদি মূল থ্রেডকে বিনিময়ে চালানোর সুযোগ না দেয় তবে আপনার থ্রেডিংয়ের সমস্যা রয়েছে তবে প্রথমে ঘুম না ডেকে অন্য কিছুকে ব্লক করা আরও খারাপ করে তোলে এবং এর সমাধান খুব কমই হয়। কীটি হ'ল স্লিপ (0) কল করা এবং আপনার লক্ষ্য স্থির ফ্রেমের হারের উপর চাপ না দেওয়া অবধি সময়কে পরীক্ষা করা, যাতে আপনি কেবল অপেক্ষা করার জন্য 100% সিপিইউ অপচয় করবেন না।
মাইক সেমদার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.