গ্রাফিক্স স্ট্যাকে, কম্পোজার এইচএএল (Composer HAL) এবং সারফেসফ্লিঙ্গার (SurfaceFlinger)-এর মাঝে একটি প্রতি-স্তর বাফার ক্যাশে থাকে, যা আইপিসি (IPC)-র মাধ্যমে ফাইল ডেসক্রিপ্টর পাঠানোর সাথে সম্পর্কিত ওভারহেড কমাতে সাহায্য করে। অ্যান্ড্রয়েড ১৪-এর আগে, যখন কোনো GraphicBufferProducer সারফেসফ্লিঙ্গার-এর GraphicBufferConsumer থেকে সংযোগ বিচ্ছিন্ন করত, তখন সিস্টেম এই বাফার ক্যাশেটি পার্জ (purze) করত না; উদাহরণস্বরূপ, যখন কোনো মিডিয়াকোডেক (MediaCodec) একটি সারফেসভিউ (SurfaceView) থেকে সংযোগ বিচ্ছিন্ন করত। অ্যান্ড্রয়েড ১৪ থেকে, গ্রাফিক্স মেমরির ব্যবহার কমাতে আপনি এই বাফার ক্যাশেটি জোরপূর্বক পার্জ করতে পারবেন।
নিচের দুটি বিকল্প থেকে যেকোনো একটি বেছে নিন:
- অ্যান্ড্রয়েড ১৪ এবং তার পরবর্তী সংস্করণ সহ লঞ্চ হওয়া ডিভাইসগুলির জন্য, আপনাকে অবশ্যই নতুন কম্পোজার এইচএএল এপিআই (Composer HAL API) সংস্করণ ৩.২ প্রয়োগ করতে হবে। এই বিকল্পটি ডিফল্টরূপে সক্রিয় থাকে এবং সর্বাধিক পরিমাণ মেমরি সাশ্রয় করে। ১৪ এবং তার পরবর্তী সংস্করণে আপগ্রেড করা ডিভাইসগুলিও মেমরির সম্পূর্ণ সুবিধা পেতে এই বিকল্পটি ব্যবহার করতে পারে।
- যেসব ডিভাইস অ্যান্ড্রয়েড ১৪-এ আপগ্রেড করা হচ্ছে এবং যেগুলোতে আপনি কম্পোজার এইচএএল ৩.২ এপিআই প্রয়োগ করতে চান না, সেগুলোর জন্য আপনি ব্যাকওয়ার্ড-কম্প্যাটিবল অপশনটি চালু করতে পারেন। এই অপশনটি আগের অপশনটির মতোই প্রায় সমান মেমোরি সাশ্রয় করে।
পরবর্তী দুটি বিভাগে প্রতিটি বিকল্প কীভাবে বাস্তবায়ন করতে হয় তা ব্যাখ্যা করা হয়েছে।
Composer HAL 3.2 API বাস্তবায়ন করুন
গ্রাফিক্স বাফার মেমরির সম্পূর্ণ সুবিধা পেতে হলে আপনাকে অবশ্যই:
- আপনার Composer HAL ইমপ্লিমেন্টেশনটি সংস্করণ 3.2-এ আপডেট করুন।
- তালিকায় থাকা স্লট নম্বর দ্বারা নির্দেশিত বাফার ক্যাশ এন্ট্রিগুলি মুছে ফেলার মাধ্যমে
LayerCommand::bufferSlotsToClearপ্রক্রিয়াটি সম্পন্ন করুন।
গ্রাফিক বাফার মেমরি সম্পর্কিত কম্পোজার HAL 3.2 API-গুলো, যার মধ্যে LayerCommand::bufferSlotsToClear অন্তর্ভুক্ত, LayerCommand.aidl ফাইলে রয়েছে।
পশ্চাৎ-সামঞ্জস্যপূর্ণ বিকল্পটি সক্রিয় করুন
ব্যাকওয়ার্ড-কম্প্যাটিবল মেমরি রিডাকশন অপশনটি ক্যাশ স্লটের একটি আসল বাফারকে একটি 1x1 প্লেসহোল্ডার বাফার দিয়ে প্রতিস্থাপন করে। এর ফলে বর্তমান সক্রিয় বাফার স্লটটি ছাড়া বাকি সমস্ত পার্জ করা স্লটের জন্য মেমরি সাশ্রয় হয়। আংশিক মেমরি সাশ্রয়ের সুবিধা পেতে, surface_flinger.clear_slots_with_set_layer_buffer sysprop-টিকে true সেট করে ব্যাকওয়ার্ড-কম্প্যাটিবল অপশনটি সক্রিয় করুন। এই sysprop-টি property_contexts ফাইলে পাওয়া যায়।
এই sysprop সেট করার জন্য আপনার Composer HAL ইমপ্লিমেন্টেশনকে একটি present cycle-এর মধ্যে একই লেয়ারের জন্য একাধিক setLayerBuffer কমান্ড সঠিকভাবে হ্যান্ডেল করতে হবে।
ব্যাকওয়ার্ড-কম্প্যাটিবল অপশনটি সক্রিয় করলে নিম্নলিখিত প্রভাবগুলো দেখা যায়:
AIDL HAL-এর ক্ষেত্রে: SurfaceFlinger একটিমাত্র লেয়ারের জন্য একাধিক
LayerCommandইনস্ট্যান্স পাঠায়, যার প্রতিটিতে একটিমাত্রBufferCommandথাকে। প্রতিটিBufferCommandএকটি 1x1 প্লেসহোল্ডার বাফার হ্যান্ডেল এবং যে ক্যাশে বাফার স্লটটি পার্জ করা প্রয়োজন, তার জন্য একটি স্লট নম্বর থাকে।HIDL HAL-এর ক্ষেত্রে: SurfaceFlinger একাধিক
SELECT_DISPLAY,SELECT_LAYER,SET_BUFFERকমান্ড পাঠায়। এই কমান্ডগুলোতে একটি 1x1 প্লেসহোল্ডার বাফার হ্যান্ডেল এবং যে ক্যাশে বাফার স্লটটি পার্জ করা প্রয়োজন, তার জন্য একটি স্লট নম্বর থাকে।
ব্যাকওয়ার্ড-কম্প্যাটিবল অপশনটির কারণে কিছু ডিভাইসে কম্পোজার এইচএএল (Composer HAL) ক্র্যাশ করতে পারে। এই সমস্যাটি সমাধান করার জন্য আপনি আপনার কম্পোজার এইচএএল পরিবর্তন করতে পারেন। এই আচরণটি নিয়ন্ত্রণকারী কোডটি এখানে পাওয়া যাবে:
গ্রাফিক্স বাফার ক্যাশে মেমরি ব্যবহারের পরীক্ষা
টেস্টের মাধ্যমে যাচাই করা যায় না যে HAL ইমপ্লিমেন্টেশনগুলো ক্যাশ স্লটগুলো পার্জ করে কি না। তবে, আপনি গ্রাফিক বাফার ব্যবহার নিরীক্ষণ করতে আপনার ডিবাগিং টুল ব্যবহার করতে পারেন। নিরীক্ষণ করার সময়, আপনি হয়তো লক্ষ্য করবেন যে ইউটিউবে একাধিক ভিন্ন ভিডিও দ্রুত থামানো এবং চালু করার ক্ষেত্রে আউট-অফ-মেমরি এরর কম হচ্ছে।
VTS টেস্ট রয়েছে যা যাচাই করে যে, HAL ইমপ্লিমেন্টেশনটি নতুন API কলগুলো (HAL ভার্সন 3.2+) অথবা ব্যাকওয়ার্ড-কম্প্যাটিবল ইমপ্লিমেন্টেশনের জন্য একাধিক setLayerBuffer কমান্ড গ্রহণ করতে কার্যকরীভাবে সক্ষম কিনা। তবে, সঠিক কার্যকারিতার জন্য এটিকে পর্যাপ্ত পরীক্ষা হিসেবে বিবেচনা করা উচিত নয়, কারণ কিছু ডিভাইস এই VTS টেস্টগুলোতে উত্তীর্ণ হলেও বাস্তব ব্যবহারের ক্ষেত্রে ব্যর্থ হয়।
নতুন VTS পরীক্ষাগুলোর জন্য, নিচের লিঙ্কগুলো দেখুন: