অ্যান্ড্রয়েড থ্রেডগুলি আমার মাথাটি ডিজাইনের চারপাশে মুড়ে ফেলার সমস্যা


9

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

প্রশ্ন: আমি কি আমার ক্রিয়াকলাপের পরিবর্তে অন্য শ্রেণীর উদাহরণ তৈরি করব?

এখন আমি একটি কাস্টম থ্রেড শ্রেণি তৈরি করি যা গেমের লুপটি পরিচালনা করে।

প্রশ্ন: আমি আমার সমস্ত ক্রিয়াকলাপে এই ক্লাসটি কীভাবে ব্যবহার করব? বা প্রতিবার বর্ধিত থ্রেড শ্রেণীর জন্য আমার একটি পৃথক উদাহরণ তৈরি করতে হবে?

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

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

উত্তর:


13

আমি আপনাকে সুপারিশ করছি যে আপনার একটি রেন্ডার থ্রেড (ব্যবহার Canvas/ OpenGL ES, Canvasসম্ভবত সেটআপ করা কিছুটা সহজ) এবং একটি গেম থ্রেড যেখানে আপনি আপনার গেমটির যুক্তি রেখেছেন।

গেমটি আসলে "লোড" করতে আপনি একটি গেমসাইনাইন ক্লাস তৈরি করতে পারেন এবং এটি আপনার অ্যাপ্লিকেশনটির কেন্দ্রীয় পয়েন্ট তৈরি করতে পারেন। যখন আপনার রেন্ডারার যেতে প্রস্তুত হয় আপনি গেমইজাইন উদাহরণটিতে একটি কলব্যাক তৈরি করতে পারেন যা গেন্ডার যুক্তির জন্য Runnableরেন্ডারিংয়ের জন্য এবং অন্যটি ব্যবহার করে দুটি থ্রেড তৈরি এবং শুরু করবে Runnable

কোডের উদাহরণ:

আবেদন শুরু

private GameEngine engine;
private CanvasRenderer renderer;

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   // Create instances of your two Runnable classes and pass that into
   // the GameEngine constructor.
   // Create an instance of the game engine.
   engine = new GameEngine(canvasRunnable, gamelogicRunnable);
   renderer = new CanvasRenderer(this, engine); 
   setContentView(renderer); 
}

CanvasRenderer

private GameEngine engine;    

// Save your instance from the GameEngine reference in your constrcutor and make
// a global initializion for your GameEngine instance.  

@Override
public void surfaceCreated(SurfaceHolder holder) {  
   // One time setup here.
   // When your view is ready, make this callback to the 
   // GameEngine.
   engine.surfaceIsReady();
}

GameEngine

private Thread canvasThread;
private CanvasRunnable canvasRunnable;
// You should be able to figure out how to create a second thread
// where you should put your game logic. :)

// Constructor stuff like creating instances of your threads
// and passing references as you wish to those.
// Don't start the threads here.
// Remember to set references from your Runnable's into your Thread's 
// instances here!

/**
 * Callback. Now your renderer is ready and you
 * can start your threads.
 */
public void surfaceIsReady() {
   thread.setName("Canvas");
   thread.start();
   // Same for game logic.
}

ওহ! ধন্যবাদ. আপনি এটি কীভাবে ব্যাখ্যা করেছেন তা আমার পছন্দ হয়েছে। এই একটি ব্যাখ্যা আমার কাছে পুরো ধারণাটি আলোকিত করে।
সেমাহান

@ সেমাঝান: আপনার আরও সমস্যা আছে কিনা তা জিজ্ঞাসা করুন। :)

আমার মাথায় এটিই রয়েছে: গেমজিনাইন ক্লাস যা প্যানেলের সাথে অন্য সমস্ত শ্রেণীর "লিঙ্ক" বা "রেফারেন্স" হিসাবে কাজ করে। ক্রিয়াকলাপ> প্যানেল> গেম ইঞ্জিন> অন্যান্য সমস্ত ক্লাস।
সেমজাহান

@ সেমাজাহান: একদম ঠিক। শুধুমাত্র আপনার জ্ঞান জন্য: যদি তোমার সাথে যেতে করার সিদ্ধান্ত নেন OpenGL ESআপনার যা জানা উচিত যে রেন্ডারার OpenGL ESইতিমধ্যে নিজস্ব থ্রেড আছে এবং যে ক্ষেত্রে আপনি তৈরি এবং একটি নতুন শুরু ম্যানুয়ালি প্রয়োজন হবে না Threadএবং Runnableযে সিস্টেমের জন্য।

এই মন্তব্য উপেক্ষা করুন।
সেমাহান

3

সাধারণত, আপনার গেম-লুপটি একক ক্রিয়াকলাপের মধ্যে স্বয়ংসম্পূর্ণ।

আপনি যখন কার্যকলাপটি স্যুইচ করেন, আপনি আপনার গেম-লুপটি বিরতি / মেরে ফেলেন। পৃথক ক্রিয়াকলাপগুলি যাইহোক গেমটি বিরতি দেওয়ার সাথে সঙ্গতিপূর্ণ হওয়া উচিত (যেমন আপনি "বন্ধুদের ইমেল প্রেরণ" বা "প্রধান মেনু" ক্রিয়াকলাপে স্যুইচ করেছেন)

অতিরিক্ত স্তরের জন্য, আপনার কোনও নতুন থ্রেড তৈরি বা গন্তব্য করা উচিত নয় ... আপনি যদি "স্তর-সম্পূর্ণ, পরবর্তী স্তর লোড করে না চলে থাকেন তবে দয়া করে অপেক্ষা করুন" ক্রিয়াকলাপটি, এবং আপনাকে "মূল গেমটি পুনরায় চালু করতে হবে" "যাইহোক কার্যকলাপ। তবে সেক্ষেত্রে আপনি আসলে "অতিরিক্ত" থ্রেড তৈরি করছেন না, আপনি সেই ক্রিয়াকলাপে কেবল একটি থ্রেড তৈরি করছেন, এবং ক্রিয়াকলাপে হত্যা / পুনঃসূচনা / হত্যা / পুনঃসূচনা ... ইত্যাদি। ক্রিয়াকলাপ। প্রতিটি সময় একটি স্তর সম্পন্ন হয়।


3

আপনি যদি জার্মান বুঝতে পারেন তবে এই টিউটোরিয়ালটি খুব সুন্দর।

ইংরেজি ভাষার জন্য আমি এই টিউটোরিয়ালটির সুপারিশ করতে পারি

থ্রেড ক্লাস সম্পর্কিত: আমি জানি না যে এটি সত্যই প্রয়োজনীয় যে আপনি আপনার অ্যাপ্লিকেশনের সমস্ত ক্লাস থেকে রেফারেন্স করতে পারেন কিনা। আমার খেলায়, আমি এটি সেভাবে সমাধান করেছি:

প্রধান জিইউআই আঁকতে দায়বদ্ধ ক্লাসটির ওভাররাইডেন রেন্ডার পদ্ধতি রয়েছে। এই পদ্ধতিতে একটি থ্রেড শ্রেণি বলা হয় যা সমস্ত GUI উপাদান আপডেট করে এবং ব্যবহারকারীর ইনপুটগুলি প্রক্রিয়া করে।

থ্রেড ধ্রুবক ফ্রেমরেট বজায় রাখতেও দায়বদ্ধ। আপনি যে গেমটি বিকাশ করছেন তার উপর নির্ভর করে এটি গুরুত্বপূর্ণ হতে পারে।


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