টাস্ক স্ন্যাপশট

টাস্ক স্ন্যাপশট হলো অ্যান্ড্রয়েড ৮.০-তে প্রবর্তিত একটি পরিকাঠামো, যা রিসেন্টস থাম্বনেইল এবং উইন্ডো ম্যানেজার থেকে সেভড সারফেস- এর স্ক্রিনশটগুলোকে একত্রিত করে। রিসেন্টস থাম্বনেইলগুলো রিসেন্টস ভিউতে কোনো টাস্কের সর্বশেষ অবস্থা উপস্থাপন করে।

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

স্থাপত্য

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

একই GraphicBuffer-টি Recents ভিউতে কোনো টাস্কের প্রিভিউ স্টেট আঁকার জন্য Binder-এর মাধ্যমে SystemUI-তেও পাঠানো হয়। যেহেতু এটি কেবল একটি বাফারের রেফারেন্স, তাই Binder-এর মাধ্যমে এটি পাঠাতে খুব কম রিসোর্স খরচ হয়। GraphicBuffer-টি যখন SystemUI-তে পৌঁছায়, তখন এটিকে একটি হার্ডওয়্যার বিটম্যাপে মোড়ানো হয় এবং তারপর গ্রাফিক্স মেমরিতে কোনো মেমরি আপলোড না করেই স্ক্রিনে আঁকা হয়।

সুবিধা

এই নতুন স্থাপত্যের তিনটি প্রধান সুবিধা রয়েছে:

  • যদি টাস্ক স্ন্যাপশটটি প্রারম্ভিক উইন্ডো হিসেবে ব্যবহার করা হয়, তাহলে স্ন্যাপশট এবং আসল বিষয়বস্তুর মধ্যে একটি সুন্দর ক্রসফেড দেখা যায়।
  • SystemUI-তে টাস্ক স্ন্যাপশট আঁকার সময়, কোনো রকম কপি করা ছাড়াই তা করা যায়। আগে বিটম্যাপটিকে প্রথমে Ashmem-এ, তারপর গ্রাফিক্স মেমরিতে কপি করতে হতো। যেহেতু এই পদ্ধতিটি স্ন্যাপশটটিকে সরাসরি গ্রাফিক্স মেমরিতে সংরক্ষণ করে, তাই কোনো কপি করার প্রয়োজন হয় না।
  • রিসেন্টস-এ আপনি যে অবস্থাটি দেখেন, তা অ্যাপটি পুনরায় খোলার সময় আপনি প্রথমে যে অবস্থাটি দেখবেন তার সাথে সর্বদা মিলে যায়। এখানে একই বাফার থাকার কারণে অনেক মেমরিও সাশ্রয় হয়। এই কারণেই রিসেন্টস এখন এই ছবিগুলো সম্পূর্ণ রেজোলিউশনে দেখাতে সক্ষম। আগে, মেমরি সাশ্রয়ের জন্য এটিকে ৬৪% ডাউনস্যাম্পল করা হতো।

বাস্তবায়ন

এই ফিচারটি সম্পূর্ণরূপে অ্যান্ড্রয়েড প্ল্যাটফর্মে বিদ্যমান। এর জন্য কোনো ইন্টিগ্রেশনের প্রয়োজন নেই এবং কাস্টমাইজেশন সমর্থিত নয়। তবে, ডিভাইস নির্মাতারা টাস্ক স্ন্যাপশট ফিচারটি সম্পূর্ণরূপে নিষ্ক্রিয় করে দিতে পারেন।

এই বৈশিষ্ট্যটি নিষ্ক্রিয় করতে, এই ফাংশনটি পরিবর্তন করুন:

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215

মনে রাখবেন যে, ফিচারটি নিষ্ক্রিয় করা থাকলে, রিসেন্টস ভিউতে কোনো থাম্বনেইলই দেখানো হবে না।

উচ্চ-রেজোলিউশন এবং নিম্ন-রেজোলিউশন স্ন্যাপশট

টাস্ক স্ন্যাপশট দুটি স্কেলে ডিস্কে লেখা হয়। ডিস্ক থেকে একটি টাস্ক স্ন্যাপশট পুনরুদ্ধার করার সময়, প্রথমে লো-রেজ স্ন্যাপশটগুলি পড়া হয় এবং তারপরে সেগুলির হাই-রেজ সংস্করণ দ্বারা প্রতিস্থাপিত করা হয়। এই অপ্টিমাইজেশন ইমেজ লোড হওয়ার সময়কে উন্নত করে। অন্যথায়, ডিস্ক থেকে স্ন্যাপশট ফাইলটি পড়ার সময় সামান্য বিলম্ব হতে পারে এবং ইমেজটি উপলব্ধ না হওয়া পর্যন্ত ব্যবহারকারী একটি খালি টাস্ক কার্ড দেখতে পাবেন। আপনি ডিভাইস ওভারলে কনফিগারেশন ফাইল overlay/frameworks/base/core/res/res/values/config.xml config_highResTaskSnapshotScale এবং config_lowResTaskSnapshotScale সেট করে স্কেলগুলি কনফিগার করতে পারেন। ডিফল্টরূপে, এগুলি যথাক্রমে 1.0 এবং 0.5-এ সেট করা থাকে। config_lowResTaskSnapshotScale 0.0-এ সেট করে লো-রেজ স্ন্যাপশট নিষ্ক্রিয় করুন।

উদাহরণ এবং উৎস

এই ফিচারের বাকি কোডটি TaskSnapshot* ফাইলগুলোর মধ্যে খুঁজুন:

frameworks/base/+/android17-release/services/core/java/com/android/server/wm/