গ্রাফিক্স মেমরি খরচ কমাতে

গ্রাফিক্স স্ট্যাকে, IPC-তে ফাইল বর্ণনাকারী পাঠানোর সাথে যুক্ত ওভারহেড কমাতে কম্পোজার HAL এবং SurfaceFlinger-এর মধ্যে একটি প্রতি-স্তর বাফার ক্যাশে বসে। Android 14-এর আগে, যখন কোনও GraphicBufferProducer একটি SurfaceFlinger GraphicBufferConsumer থেকে সংযোগ বিচ্ছিন্ন করে, যেমন যখন একটি MediaCodec একটি SurfaceView থেকে সংযোগ বিচ্ছিন্ন হয়ে যায় তখন এই বাফার ক্যাশে পরিষ্কার করা হত না। অ্যান্ড্রয়েড 14 দিয়ে শুরু করে, আপনি গ্রাফিক্স মেমরি খরচ কমাতে এই বাফার ক্যাশে জোরপূর্বক পরিষ্কার করতে পারেন।

নিম্নলিখিত দুটি বিকল্পের মধ্যে একটি চয়ন করুন:

  • অ্যান্ড্রয়েড 14 এবং উচ্চতর ডিভাইসগুলির জন্য, আপনাকে অবশ্যই নতুন কম্পোজার HAL API সংস্করণ 3.2 প্রয়োগ করতে হবে৷ এই বিকল্পটি ডিফল্টরূপে সক্রিয় থাকে এবং সর্বাধিক মেমরি সংরক্ষণ করে। 14 এবং পরবর্তীতে আপগ্রেড করা ডিভাইসগুলি সম্পূর্ণ মেমরি সুবিধাগুলি অর্জন করতে এই বিকল্পটি ব্যবহার করতে পারে।
  • Android 14-এ আপগ্রেড করা ডিভাইসগুলির জন্য যার জন্য আপনি Composer HAL 3.2 API প্রয়োগ করতে চান না, আপনি ব্যাকওয়ার্ড-সামঞ্জস্যপূর্ণ বিকল্পটি সক্ষম করতে পারেন। এই অপশনটি আগের অপশনের মতো প্রায় মেমরি সেভ করে।

নিম্নলিখিত দুটি বিভাগ ব্যাখ্যা করে কিভাবে প্রতিটি বিকল্প বাস্তবায়ন করতে হয়।

কম্পোজার HAL 3.2 API প্রয়োগ করুন

সম্পূর্ণ গ্রাফিক্স বাফার মেমরি সুবিধা অর্জন করতে, আপনাকে অবশ্যই:

  1. আপনার কম্পোজার HAL বাস্তবায়ন সংস্করণ 3.2-এ আপডেট করুন।
  2. LayerCommand::bufferSlotsToClear তালিকায় পাওয়া স্লট নম্বর দ্বারা নির্দেশিত বাফার ক্যাশে এন্ট্রিগুলি শুদ্ধ করে প্রক্রিয়া করুন।

LayerCommand:bufferSlotsToClear সহ গ্রাফিক বাফার মেমরির সাথে সম্পর্কিত কম্পোজার HAL 3.2 APIগুলি LayerCommand.aidl- এ রয়েছে।

পশ্চাদগামী-সামঞ্জস্যপূর্ণ বিকল্প সক্রিয় করুন

ব্যাকওয়ার্ড-সামঞ্জস্যপূর্ণ মেমরি রিডাকশন বিকল্পটি ক্যাশে স্লটে একটি 1x1 স্থানধারক বাফারের সাথে একটি বাস্তব বাফার প্রতিস্থাপন করে, যার ফলে বর্তমান সক্রিয় বাফার স্লট ব্যতীত সমস্ত শুদ্ধ স্লটের জন্য মেমরি সঞ্চয় হয়। আংশিক মেমরি সংরক্ষণের সুবিধাগুলি অর্জন করতে, surface_flinger.clear_slots_with_set_layer_buffer sysprop কে true এ সেট করে পশ্চাদগামী-সামঞ্জস্যপূর্ণ বিকল্পটি সক্ষম করুন। এই syspropটি property_contexts ফাইলে পাওয়া যায়।

এই sysprop সেট করার জন্য আপনার কম্পোজার HAL বাস্তবায়নের প্রয়োজন একটি একক বর্তমান চক্রে একই স্তরের জন্য একাধিক setLayerBuffer কমান্ড সঠিকভাবে পরিচালনা করতে।

পশ্চাদগামী-সামঞ্জস্যপূর্ণ বিকল্পটি সক্ষম করার ফলে নিম্নলিখিত প্রভাবগুলি রয়েছে:

  • AIDL HAL-এর জন্য: SurfaceFlinger একটি একক স্তরের জন্য একাধিক LayerCommand দৃষ্টান্ত পাঠায়, প্রতিটিতে একটি করে BufferCommand । প্রতিটি BufferCommand একটি 1x1 প্লেসহোল্ডার বাফার হ্যান্ডেল এবং ক্যাশে বাফার স্লটের জন্য একটি স্লট নম্বর রয়েছে যা পরিস্কার করা প্রয়োজন।

  • HIDL HAL-এর জন্য: SurfaceFlinger একাধিক SELECT_DISPLAY , SELECT_LAYER , SET_BUFFER কমান্ড পাঠায়। এই কমান্ডগুলিতে একটি 1x1 স্থানধারক বাফার হ্যান্ডেল এবং ক্যাশে বাফার স্লটের জন্য একটি স্লট নম্বর রয়েছে যা পরিস্কার করা প্রয়োজন৷

পশ্চাদগামী-সামঞ্জস্যপূর্ণ বিকল্পটি কিছু ডিভাইসে কম্পোজার HAL-কে ক্র্যাশ করতে পারে। আপনি এই সমস্যাটি সমাধান করতে আপনার কম্পোজার HAL পরিবর্তন করতে সক্ষম হতে পারেন। এই আচরণ নিয়ন্ত্রণকারী কোড এখানে পাওয়া যায়:

পরীক্ষা গ্রাফিক্স বাফার ক্যাশে মেমরি খরচ

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

VTS পরীক্ষাগুলি উপলব্ধ রয়েছে যা যাচাই করে যে HAL বাস্তবায়ন কার্যকরীভাবে নতুন API কল (HAL সংস্করণ 3.2+) বা ব্যাকওয়ার্ড-সামঞ্জস্যপূর্ণ বাস্তবায়নের জন্য একাধিক setLayerBuffer কমান্ড গ্রহণ করতে সক্ষম। যাইহোক, এটি সঠিক কার্যকারিতার জন্য পর্যাপ্ত পরীক্ষা হিসাবে বিবেচনা করা উচিত নয়, কারণ কিছু ডিভাইস এই VTS পরীক্ষাগুলি পাস করে, কিন্তু বাস্তব-বিশ্ব ব্যবহারের ক্ষেত্রে ব্যর্থ হয়।

নতুন VTS পরীক্ষার জন্য, নিম্নলিখিত লিঙ্কগুলিতে নেভিগেট করুন:

,

গ্রাফিক্স স্ট্যাকে, IPC-তে ফাইল বর্ণনাকারী পাঠানোর সাথে যুক্ত ওভারহেড কমাতে কম্পোজার HAL এবং SurfaceFlinger-এর মধ্যে একটি প্রতি-স্তর বাফার ক্যাশে বসে। Android 14-এর আগে, যখন কোনও GraphicBufferProducer একটি SurfaceFlinger GraphicBufferConsumer থেকে সংযোগ বিচ্ছিন্ন করে, যেমন যখন একটি MediaCodec একটি SurfaceView থেকে সংযোগ বিচ্ছিন্ন হয়ে যায় তখন এই বাফার ক্যাশে পরিষ্কার করা হত না। অ্যান্ড্রয়েড 14 দিয়ে শুরু করে, আপনি গ্রাফিক্স মেমরি খরচ কমাতে এই বাফার ক্যাশে জোরপূর্বক পরিষ্কার করতে পারেন।

নিম্নলিখিত দুটি বিকল্পের মধ্যে একটি চয়ন করুন:

  • অ্যান্ড্রয়েড 14 এবং উচ্চতর ডিভাইসগুলির জন্য, আপনাকে অবশ্যই নতুন কম্পোজার HAL API সংস্করণ 3.2 প্রয়োগ করতে হবে৷ এই বিকল্পটি ডিফল্টরূপে সক্রিয় থাকে এবং সর্বাধিক মেমরি সংরক্ষণ করে। 14 এবং পরবর্তীতে আপগ্রেড করা ডিভাইসগুলি সম্পূর্ণ মেমরি সুবিধাগুলি অর্জন করতে এই বিকল্পটি ব্যবহার করতে পারে।
  • Android 14-এ আপগ্রেড করা ডিভাইসগুলির জন্য যার জন্য আপনি Composer HAL 3.2 API প্রয়োগ করতে চান না, আপনি ব্যাকওয়ার্ড-সামঞ্জস্যপূর্ণ বিকল্পটি সক্ষম করতে পারেন। এই অপশনটি আগের অপশনের মতো প্রায় মেমরি সেভ করে।

নিম্নলিখিত দুটি বিভাগ ব্যাখ্যা করে কিভাবে প্রতিটি বিকল্প বাস্তবায়ন করতে হয়।

কম্পোজার HAL 3.2 API প্রয়োগ করুন

সম্পূর্ণ গ্রাফিক্স বাফার মেমরি সুবিধা অর্জন করতে, আপনাকে অবশ্যই:

  1. আপনার কম্পোজার HAL বাস্তবায়ন সংস্করণ 3.2-এ আপডেট করুন।
  2. LayerCommand::bufferSlotsToClear তালিকায় পাওয়া স্লট নম্বর দ্বারা নির্দেশিত বাফার ক্যাশে এন্ট্রিগুলি শুদ্ধ করে প্রক্রিয়া করুন।

LayerCommand:bufferSlotsToClear সহ গ্রাফিক বাফার মেমরির সাথে সম্পর্কিত কম্পোজার HAL 3.2 APIগুলি LayerCommand.aidl- এ রয়েছে।

পশ্চাদগামী-সামঞ্জস্যপূর্ণ বিকল্প সক্রিয় করুন

ব্যাকওয়ার্ড-সামঞ্জস্যপূর্ণ মেমরি রিডাকশন বিকল্পটি ক্যাশে স্লটে একটি 1x1 স্থানধারক বাফারের সাথে একটি বাস্তব বাফার প্রতিস্থাপন করে, যার ফলে বর্তমান সক্রিয় বাফার স্লট ব্যতীত সমস্ত শুদ্ধ স্লটের জন্য মেমরি সঞ্চয় হয়। আংশিক মেমরি সংরক্ষণের সুবিধাগুলি অর্জন করতে, surface_flinger.clear_slots_with_set_layer_buffer sysprop কে true এ সেট করে পশ্চাদগামী-সামঞ্জস্যপূর্ণ বিকল্পটি সক্ষম করুন। এই syspropটি property_contexts ফাইলে পাওয়া যায়।

এই sysprop সেট করার জন্য আপনার কম্পোজার HAL বাস্তবায়নের প্রয়োজন একটি একক বর্তমান চক্রে একই স্তরের জন্য একাধিক setLayerBuffer কমান্ড সঠিকভাবে পরিচালনা করতে।

পশ্চাদগামী-সামঞ্জস্যপূর্ণ বিকল্পটি সক্ষম করার ফলে নিম্নলিখিত প্রভাবগুলি রয়েছে:

  • AIDL HAL-এর জন্য: SurfaceFlinger একটি একক স্তরের জন্য একাধিক LayerCommand দৃষ্টান্ত পাঠায়, প্রতিটিতে একটি করে BufferCommand । প্রতিটি BufferCommand একটি 1x1 প্লেসহোল্ডার বাফার হ্যান্ডেল এবং ক্যাশে বাফার স্লটের জন্য একটি স্লট নম্বর রয়েছে যা পরিস্কার করা প্রয়োজন।

  • HIDL HAL-এর জন্য: SurfaceFlinger একাধিক SELECT_DISPLAY , SELECT_LAYER , SET_BUFFER কমান্ড পাঠায়। এই কমান্ডগুলিতে একটি 1x1 স্থানধারক বাফার হ্যান্ডেল এবং ক্যাশে বাফার স্লটের জন্য একটি স্লট নম্বর রয়েছে যা পরিস্কার করা প্রয়োজন৷

পশ্চাদগামী-সামঞ্জস্যপূর্ণ বিকল্পটি কিছু ডিভাইসে কম্পোজার HAL-কে ক্র্যাশ করতে পারে। আপনি এই সমস্যাটি সমাধান করতে আপনার কম্পোজার HAL পরিবর্তন করতে সক্ষম হতে পারেন। এই আচরণ নিয়ন্ত্রণকারী কোড এখানে পাওয়া যায়:

পরীক্ষা গ্রাফিক্স বাফার ক্যাশে মেমরি খরচ

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

VTS পরীক্ষাগুলি উপলব্ধ রয়েছে যা যাচাই করে যে HAL বাস্তবায়ন কার্যকরীভাবে নতুন API কল (HAL সংস্করণ 3.2+) বা ব্যাকওয়ার্ড-সামঞ্জস্যপূর্ণ বাস্তবায়নের জন্য একাধিক setLayerBuffer কমান্ড গ্রহণ করতে সক্ষম। যাইহোক, এটি সঠিক কার্যকারিতার জন্য পর্যাপ্ত পরীক্ষা হিসাবে বিবেচনা করা উচিত নয়, কারণ কিছু ডিভাইস এই VTS পরীক্ষাগুলি পাস করে, কিন্তু বাস্তব-বিশ্ব ব্যবহারের ক্ষেত্রে ব্যর্থ হয়।

নতুন VTS পরীক্ষার জন্য, নিম্নলিখিত লিঙ্কগুলিতে নেভিগেট করুন: