ফ্রেম রেট

গড় এফপিএস

অ্যান্ড্রয়েড ডিভাইসে একটি উচ্চ-মানের গেমিং অভিজ্ঞতা প্রদানের জন্য একটি মসৃণ এবং স্থিতিশীল ফ্রেম রেট অত্যন্ত গুরুত্বপূর্ণ। গেমের পারফরম্যান্স পরিমাপ করার সময়, অভিজ্ঞতা সম্পর্কে একটি প্রাথমিক ধারণা পেতে আপনার গড় FPS-কে ভিত্তি হিসেবে পরিমাপ করা উচিত। একটি দুর্দান্ত গেমিং অভিজ্ঞতা নিশ্চিত করতে আপনার গেমটিকে ৬০ FPS-এর গড় ফ্রেম রেট পূরণের জন্য অপ্টিমাইজ করা উচিত।

স্থিতিশীলতার জন্য P90 এবং P99 FPS

গড়ে মসৃণ ৬০ এফপিএস থাকা সত্ত্বেও, একটি গেমে মাঝে মাঝে বাধা, মাইক্রো-স্টাটারিং এবং অপ্রত্যাশিত ইনপুট ল্যাগ দেখা দিতে পারে, যার ফলে খেলোয়াড়ের অভিজ্ঞতা খারাপ হয়।

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

মেট্রিক্স

  • গড় FPS (বেসলাইন) : এই মৌলিক মেট্রিকটি আপনার গেমের পারফরম্যান্সের একটি সাধারণ বেসলাইন প্রদান করে। যদিও এটি একটি স্ট্যান্ডার্ড বেঞ্চমার্ক, গড় গণনার কারণে এতে মাঝে মাঝে ফ্রেম ড্রপ এবং মাইক্রো-স্টাটারিং শনাক্ত করা যায় না, ফলে এটি এককভাবে প্লেয়ারের অভিজ্ঞতাকে তুলে ধরার জন্য অপর্যাপ্ত।
  • P90 FPS (১০% পার্সেন্টাইলে সামঞ্জস্যপূর্ণ বেসলাইন) : এটি নির্দেশ করে যে আপনার ৯০% ফ্রেম এই সামঞ্জস্যপূর্ণ বেসলাইনকে অতিক্রম করেছে, এবং শুধুমাত্র সবচেয়ে ধীরগতির ১০% ফ্রেম রেন্ডার হতে বেশি সময় নিয়েছে। যদি আপনার P90 ফ্রেম রেট বেশি এবং আপনার গড়ের কাছাকাছি হয়, তাহলে গেমটি সেশনের বেশিরভাগ সময় ধরেই ধারাবাহিকভাবে ভালোভাবে চলছে।
  • P99 FPS (১% পার্সেন্টাইলে স্টাটার ইন্ডিকেটর) : এটি নির্দেশ করে যে আপনার ৯৯% ফ্রেম এই স্টাটার ইন্ডিকেটরকে অতিক্রম করেছে, বিশেষত সবচেয়ে ধীরগতির ১% ফ্রেমকে আলাদা করে। মাইক্রো-স্টাটার, অ্যাসেট-লোডিং বিলম্ব, এবং হঠাৎ অ্যাসেট-ভারী রেন্ডারিং স্পাইক যা দৃশ্যমান হিচ সৃষ্টি করে, তা শনাক্ত করার জন্য এই মেট্রিকটি অপরিহার্য।

উদাহরণ

আপনার গড় FPS-কে P90 এবং P99 মেট্রিক্সের সাথে তুলনা করে, আপনি একটি গেমের অন্তর্নিহিত আচরণ নির্ভুলভাবে নির্ণয় করতে পারেন।

দৃশ্যকল্প ১: একটি সর্বোত্তম বক্ররেখা (অপ্টিমাইজড গেম)

  • গড় : ৬০ এফপিএস (১৬.৬ মিলিসেকেন্ড)
  • পি৯০ : ৫৮ এফপিএস (১৭.২ মিলিসেকেন্ড)
  • পি৯৯ : ৫২ এফপিএস (১৯.২ মিলিসেকেন্ড)
  • বিশ্লেষণ : মেট্রিকগুলো একে অপরের খুব কাছাকাছি। গেমটি অবিশ্বাস্যভাবে মসৃণ এবং সামঞ্জস্যপূর্ণ। এতে কোনো মাইক্রো-স্টাটার নেই, এবং এমনকি সবচেয়ে খারাপ ১% ফ্রেমও খালি চোখে প্রায় নজরে পড়ে না।

দৃশ্যকল্প ২: লোড বাধা (সিপিইউ/জিপিইউ সীমাবদ্ধ)

  • গড় : ৪৫ এফপিএস (২২.২ মিলিসেকেন্ড)
  • পি৯০ : ৪০ এফপিএস (২৫.০ মিলিসেকেন্ড)
  • পি৯৯ : ৩৮ এফপিএস (২৬.৩ মিলিসেকেন্ড)
  • বিশ্লেষণ : গড় ফ্রেম রেট কম, কিন্তু তা ধারাবাহিকভাবে কম। গড়ের তুলনায় P99-এর ফ্রেম রেট মারাত্মকভাবে কমে যায় না। এটি ইঙ্গিত দেয় যে, সিস্টেমটি মূলত গ্রাফিক্যাল সেটিংস বা রেজোলিউশনের সীমাবদ্ধতার কারণে হিমশিম খাচ্ছে। গেমটি আটকে আটকে চলবে না, বরং ধীরগতির মনে হবে। গ্রাফিক্স সেটিংস কমালে সাধারণত এই মেট্রিকগুলো সমানভাবে বেড়ে যায়।

দৃশ্যকল্প ৩: একটি অস্থিতিশীল ৬০ এফপিএস (শেডার কম্পাইলেশন / অ্যাসেট স্ট্রিমিং-এ স্টাটার)

  • গড় : ৬০ এফপিএস (১৬.৬ মিলিসেকেন্ড)
  • পি৯০ : ৪৫ এফপিএস (২২.২ মিলিসেকেন্ড)
  • পি৯৯ : ১৫ এফপিএস (৬৬.৬ মিলিসেকেন্ড)
  • বিশ্লেষণ : এটি সবচেয়ে খারাপ পরিস্থিতি। যদিও গড় ফ্রেম রেট চমৎকার দেখাচ্ছে, P99 একটি গুরুতর সমস্যা প্রকাশ করছে। ৬৬.৬ মিলিসেকেন্ডে P99-এর অর্থ হলো, গেমটি একবারে একাধিক ফ্রেমে পুরোপুরি থেমে যাচ্ছে। এটি গুরুতর আউটলায়ারের দিকে ইঙ্গিত করে—যা সাধারণত সিপিইউ-এর সীমাবদ্ধতা, অ্যাসেট স্ট্রিমিং-এ বিলম্ব (উদাহরণস্বরূপ, ধীরগতির র‍্যাম বা স্টোরেজ), অথবা শেডার কম্পাইলেশনের কারণে সৃষ্ট বাধার জন্য হয়ে থাকে।

পরিমাপ

Average FPS, P90, এবং P99 কার্যকরভাবে পরিমাপ করার জন্য, আপনি Android-এর dumpsys surfaceflinger timestats কমান্ডটি ব্যবহার করতে পারেন। এই টুলটি রেন্ডার করা হচ্ছে এমন সমস্ত লেয়ারের জন্য গড় FPS এবং একটি presentToPresent টাইমিং হিস্টোগ্রাম প্রদান করে। একটি ফ্রেমের presentToPresent সময় হলো বর্তমান ফ্রেম এবং আঁকা হচ্ছে এমন পূর্ববর্তী ফ্রেমের মধ্যবর্তী ব্যবধান।

আপনার গেমের জন্য এই মেট্রিকগুলো সংগ্রহ ও গণনা করার ধাপে ধাপে নির্দেশাবলী নিচে দেওয়া হলো:

  1. তথ্য সংগ্রহ শুরু করুন : তথ্য সংগ্রহ শুরু করতে enable এবং clear ফ্ল্যাগ সহ নিম্নলিখিত কমান্ডটি চালান:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. তথ্য ডাম্প করুন : গেমটি যথেষ্ট সময় ধরে খেলার পর, তথ্য আউটপুট করার জন্য ডাম্প ফ্ল্যাগ সহ কমান্ডটি আবার চালান:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    
  3. লেয়ার অনুযায়ী ফিল্টার করুন : ডাম্প করা তথ্য SurfaceFlinger দ্বারা রেন্ডার করা সমস্ত লেয়ারের ডেটা প্রদান করে। আপনাকে layerName উপর ভিত্তি করে ফিল্টার করে আপনার গেমের সাথে সম্পর্কিত বিভাগটি খুঁজে বের করতে হবে (উদাহরণস্বরূপ, layerName = SurfaceView[com.example.yourgame...])।

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    
  4. গড় FPS শনাক্ত করুন : প্রতিটি লেয়ারের গড় FPS স্বয়ংক্রিয়ভাবে গণনা করা হয় এবং ডাম্প আউটপুটে সরাসরি দেখানো হয় (উদাহরণস্বরূপ, averageFPS = 30.179)।

    ...
    averageFPS = 30.179
    ...
    
  5. P90 এবং P99 FPS গণনা করুন : P90 এবং P99 মেট্রিকগুলো খুঁজে বের করার জন্য, আপনাকে ডাম্পে দেওয়া totalFrames এবং presentToPresent টাইমিং হিস্টোগ্রাম বিশ্লেষণ করতে হবে।

    totalFrames = 1000
    ...
    presentToPresent histogram is as below:
    0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0
    13ms=0 14ms=0 15ms=0 16ms=850 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0
    24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=100 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=35 54ms=0 58ms=0 62ms=0
    66ms=10 70ms=0 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=5 106ms=0
    110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0
    150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0
    650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0
    

    ক. ধারণাগত উদাহরণ (ক্রমবর্ধমান বণ্টন সারণী) ধরা যাক, আপনার গেম সেশনে মোট ১,০০০ ফ্রেম রেকর্ড করা হয়েছে। P90 এবং P99 খুঁজে বের করার জন্য, আপনি সর্বনিম্ন মিলিসেকেন্ড বাকেট থেকে গণনা করে সেই মিলিসেকেন্ড থ্রেশহোল্ডগুলো হিসাব করবেন যেখানে ক্রমবর্ধমান ফ্রেম সংখ্যা যথাক্রমে ৯০০ ফ্রেম (৯০%) এবং ৯৯০ ফ্রেমে (৯৯%) পৌঁছায়।

    ফ্রেম সময় (মিলিসেকেন্ড) ফ্রেম সংখ্যা (হিস্টোগ্রাম) ক্রমবর্ধমান ফ্রেম সংখ্যা পার্সেন্টাইল অবস্থা / গণনা
    ১৬ মিলিসেকেন্ড ৮৫০ ৮৫০ ৮৫.০%
    ৩৩ মিলিসেকেন্ড ১০০ ৯৫০ ৯৫.০%
    ( P90-এর ৯০০ লক্ষ্যমাত্রা অর্জিত হয়েছে! → ১০০০/৩৩ = ৩০.৩ এফপিএস )
    ৫০ মিলিসেকেন্ড ৩৫ ৯৮৫ ৯৮.৫%
    ৬৬ মিলিসেকেন্ড ১০ ৯৯৫ ৯৯.৫%
    ( P99 এর ৯৯০ লক্ষ্যমাত্রা অর্জিত! → ১০০০/৬৬ = ১৫.১ এফপিএস )
    ১০২ মিলিসেকেন্ড ১,০০০ ১০০%

    খ. বাস্তবায়ন যুক্তি (সিউডোকোড) যদি আপনি একটি পাইথন স্ক্রিপ্ট বা লগ পার্সার ব্যবহার করে এই বিশ্লেষণটি স্বয়ংক্রিয় করেন, তাহলে হিস্টোগ্রাম থেকে P90 এবং P99 মানগুলি বের করার যুক্তিটি নিম্নরূপভাবে বাস্তবায়ন করা যেতে পারে:

    # Define target thresholds based on total frame count
    p90_target = totalFrames * 0.90
    p99_target = totalFrames * 0.99
    
    cumulative_frames = 0
    p90_fps = None
    p99_fps = None
    
    # Iterate through the parsed SurfaceFlinger histogram data (sorted by millisecond)
    for ms_bucket, frame_count in present_to_present_histogram:
        cumulative_frames += frame_count
    
        # Capture P90 when cumulative frames cross the 90% threshold
        if p90_fps is None and cumulative_frames >= p90_target:
            p90_fps = 1000 / ms_bucket
    
        # Capture P99 when cumulative frames cross the 99% threshold
        if p99_fps is None and cumulative_frames >= p99_target:
            p99_fps = 1000 / ms_bucket
            break # Optimization: stop iterating once both targets are found
    
  6. ক্যাপচারিং বন্ধ করুন : সমস্ত প্রয়োজনীয় তথ্য সংগ্রহ করার পরে, disable ফ্ল্যাগ ব্যবহার করে টাইমস্ট্যাটস নিষ্ক্রিয় করুন:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

ধীরগতির সেশন

স্লো সেশন বাস্তব জগতের ব্যাপক পারফরম্যান্স সমস্যাগুলো চিহ্নিত করে। একটি সেশনকে "স্লো" বলা হয় যদি ২৫%-এর বেশি ফ্রেম একটি নির্দিষ্ট থ্রেশহোল্ডের (যেমন, ২০ FPS) নিচে নেমে যায়। যদিও এটি বিল্ডের গুরুতর সমস্যা খুঁজে বের করার জন্য কার্যকর, তবে শুধুমাত্র এই মেট্রিকটি একটি উচ্চ-মানের এবং টেকসই অভিজ্ঞতার নিশ্চয়তা দিতে পারে না। একটি গেম হয়তো স্লো সেশন থ্রেশহোল্ড এড়িয়ে যেতে পারে, কিন্তু তারপরেও মাইক্রো-স্টাটারিং-এর শিকার হতে পারে, যা একটি মসৃণ ৬০ FPS অভিজ্ঞতাকে ব্যাহত করে।

যদিও উভয়ই ফ্রেম টাইম থেকে উদ্ভূত, 'স্লো সেশন' এবং 'ফ্রেম রেট' ভিন্ন ভিন্ন ভূমিকা পালন করে। অ্যাভারেজ, P90, এবং P99 FPS মেট্রিকগুলো পারফরম্যান্সের গুণমান এবং স্থায়িত্ব পরিমাপ করে এবং এমন আকস্মিক পতন ও অসামঞ্জস্যপূর্ণ গতি শনাক্ত করে, যা স্লো সেশন মেট্রিকের চোখ এড়িয়ে যেতে পারে।

উপসংহার

সফল পারফরম্যান্স অপ্টিমাইজেশনের জন্য একটি সমন্বিত কৌশল প্রয়োজন। ডেভেলপারদের উচিত গুরুতর পারফরম্যান্স অবনতি শনাক্ত করার জন্য ‘স্লো সেশনস’-কে প্রাথমিক রাডার হিসেবে ব্যবহার করা এবং তারপর অন্তর্নিহিত কারণগুলো নির্ণয় করতে ও গেমপ্লের প্রকৃত মসৃণতা যাচাই করতে গড় FPS, P90 এবং P99 পরীক্ষা করা। এই মেট্রিকগুলো সমন্বিত করার মাধ্যমে, আপনি নিশ্চিত করতে পারেন যে আপনার অ্যাপ্লিকেশনটি ধারাবাহিকভাবে একটি টেকসই এবং অসাধারণ ব্যবহারকারীর অভিজ্ঞতা প্রদান করছে।

অতিরিক্ত সম্পদ

উন্নত প্রোফাইলিং কৌশল, ফ্রেম পেসিং এপিআই (Frame Pacing API) প্রয়োগ এবং ইঞ্জিন-নির্দিষ্ট অপ্টিমাইজেশন কৌশল সম্পর্কে আরও জানতে, অফিসিয়াল অ্যান্ড্রয়েড ডেভেলপার ডকুমেন্টেশন দেখুন: