SurfaceView এবং GLSurfaceView

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

সারফেসভিউ

একটি সারফেসভিউ হল একটি উপাদান যা আপনি আপনার ভিউ হায়ারার্কির মধ্যে একটি অতিরিক্ত যৌগিক স্তর এম্বেড করতে ব্যবহার করতে পারেন। একটি সারফেসভিউ অন্যান্য ভিউগুলির মতো একই লেআউট প্যারামিটারগুলি নেয়, তাই এটি অন্য যে কোনও ভিউয়ের মতো ম্যানিপুলেট করা যেতে পারে, তবে সারফেসভিউ-এর বিষয়বস্তু স্বচ্ছ।

যখন আপনি একটি বাহ্যিক বাফার উত্সের সাথে রেন্ডার করেন, যেমন GL প্রসঙ্গ বা একটি মিডিয়া ডিকোডার, তখন আপনাকে পর্দায় বাফারগুলি প্রদর্শন করতে বাফার উত্স থেকে বাফারগুলি অনুলিপি করতে হবে৷ একটি সারফেসভিউ ব্যবহার করা আপনাকে এটি করতে সক্ষম করে।

যখন SurfaceView এর ভিউ কম্পোনেন্ট দৃশ্যমান হতে চলেছে, ফ্রেমওয়ার্ক SurfaceControl কে SurfaceFlinger থেকে একটি নতুন পৃষ্ঠের অনুরোধ করতে বলে। পৃষ্ঠ তৈরি বা ধ্বংস হয়ে গেলে কলব্যাক পেতে, সারফেসহোল্ডার ইন্টারফেস ব্যবহার করুন। ডিফল্টরূপে, নতুন তৈরি পৃষ্ঠটি অ্যাপ UI পৃষ্ঠের পিছনে স্থাপন করা হয়। নতুন পৃষ্ঠকে শীর্ষে রাখতে আপনি ডিফল্ট Z-অর্ডারকে ওভাররাইড করতে পারেন।

SurfaceView এর সাথে রেন্ডারিং এমন ক্ষেত্রে উপকারী যেখানে আপনাকে একটি পৃথক পৃষ্ঠে রেন্ডার করতে হবে, যেমন আপনি যখন ক্যামেরা API বা একটি OpenGL ES প্রসঙ্গে রেন্ডার করেন। আপনি যখন SurfaceView এর সাথে রেন্ডার করেন, SurfaceFlinger সরাসরি স্ক্রিনে বাফার কম্পোজ করে। একটি সারফেসভিউ ছাড়া, আপনাকে একটি অফস্ক্রিন পৃষ্ঠে কম্পোজিট বাফার করতে হবে, যা পরে স্ক্রিনে সংমিশ্রিত হয়, তাই সারফেসভিউ দিয়ে রেন্ডার করা অতিরিক্ত কাজকে সরিয়ে দেয়। SurfaceView এর সাথে রেন্ডার করার পরে, কার্যকলাপের জীবনচক্রের সাথে সমন্বয় করতে UI থ্রেড ব্যবহার করুন এবং প্রয়োজনে দৃশ্যের আকার বা অবস্থানের সাথে সামঞ্জস্য করুন। তারপরে, হার্ডওয়্যার কম্পোজার অ্যাপ UI এবং অন্যান্য স্তরগুলিকে মিশ্রিত করে।

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

SurfaceView এবং কার্যকলাপ জীবনচক্র

একটি SurfaceView ব্যবহার করার সময়, প্রধান UI থ্রেড ব্যতীত অন্য একটি থ্রেড থেকে পৃষ্ঠটি রেন্ডার করুন।

একটি সারফেসভিউ সহ একটি কার্যকলাপের জন্য, দুটি পৃথক কিন্তু পরস্পর নির্ভরশীল রাষ্ট্র মেশিন আছে:

  • অ্যাপ onCreate / onResume / onPause
  • সারফেস তৈরি/পরিবর্তিত/ধ্বংস হয়েছে

যখন কার্যকলাপ শুরু হয়, আপনি এই ক্রমে কলব্যাক পাবেন:

  1. onCreate()
  2. onResume()
  3. surfaceCreated()
  4. surfaceChanged()

আপনি ফিরে ক্লিক করলে, আপনি পাবেন:

  1. onPause()
  2. surfaceDestroyed() (পৃষ্ঠ চলে যাওয়ার ঠিক আগে বলা হয়)

আপনি যদি স্ক্রীনটি ঘোরান, কার্যকলাপটি ভেঙে ফেলা হয় এবং পুনরায় তৈরি করা হয় এবং আপনি সম্পূর্ণ চক্রটি পান। আপনি isFinishing() চেক করে এটি একটি দ্রুত পুনঃসূচনা বলতে পারেন। একটি ক্রিয়াকলাপ এত দ্রুত শুরু/বন্ধ করা সম্ভব যে surfaceCreated() onPause() এর পরে ঘটে।

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

স্ক্রীন ফাঁকা হয়ে গেলে আপনি কী ঘটতে চান তার উপর নির্ভর করে থ্রেডের জীবনকাল পৃষ্ঠ বা কার্যকলাপের সাথে আবদ্ধ হতে পারে। থ্রেডটি অ্যাক্টিভিটি স্টার্ট/স্টপ বা সারফেস ক্রিয়েট/ডিস্ট্রয় শুরু/বন্ধ করতে পারে।

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

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

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

GLSurfaceView

GLSurfaceView ক্লাস EGL প্রসঙ্গ, আন্তঃথ্রেড যোগাযোগ এবং কার্যকলাপ জীবনচক্রের সাথে মিথস্ক্রিয়া পরিচালনার জন্য সহায়ক ক্লাস প্রদান করে। GLES ব্যবহার করার জন্য আপনাকে GLSurfaceView ব্যবহার করতে হবে না।

উদাহরণস্বরূপ, GLSurfaceView রেন্ডারিংয়ের জন্য একটি থ্রেড তৈরি করে এবং সেখানে একটি EGL প্রসঙ্গ কনফিগার করে। কার্যকলাপ বিরতি যখন রাষ্ট্র স্বয়ংক্রিয়ভাবে পরিষ্কার করা হয়. GLSurfaceView এর সাথে GLES ব্যবহার করার জন্য বেশিরভাগ অ্যাপের EGL সম্পর্কে কিছু জানার প্রয়োজন নেই।

বেশিরভাগ ক্ষেত্রে, GLSurfaceView GLES এর সাথে কাজ করা সহজ করে তুলতে পারে। কিছু পরিস্থিতিতে, এটি পথ পেতে পারে.