ردیابی انتقال‌های پنجره بااستفاده از Winscope

‫Winscope ابزار وبی است که به شما امکان می‌دهد وضعیت‌های چندین سرویس سیستم را درطول و پس‌از پویانمایی‌ها و گذارها ضبط، بازپخش، و تجزیه‌وتحلیل کنید. ‫Winscope همه وضعیت‌های سرویس سیستم مربوطه را در فایل ردیابی ضبط می‌کند. بااستفاده از Winscope UI با فایل ردیابی، می‌توانید وضعیت این خدمات را برای هر قاب پویانمایی، با یا بدون ضبط صفحه، با بازپخش، گام‌به‌گام پیش رفتن، و اشکال‌زدایی انتقال‌ها بررسی کنید.

ردیابی‌های پشتیبانی‌شده

‫Winscope امکان جمع‌آوری و نمایش تصویری ردیابی‌های مختلف را فراهم می‌کند، یعنی توالی‌های وضعیت سرویس سیستم. می‌توانید این ردیابی‌ها را پیکربندی کنید تا با موارد استفاده خاص، از سربار کم تا پرحرفی زیاد، مطابقت داشته باشند. ‫Winscope از ردپاهای زیر پشتیبانی می‌کند:

  • EventLog: گزارش رویداد تشخیص خرابی سیستم را بااستفاده از EventLog جمع‌آوری کنید. در Winscope، از این اطلاعات فقط برای شناسایی و نمایش نشانه‌گذاری‌های CUJ استفاده می‌شود.
  • IME: رویدادهای خط لوله «ویرایشگر روش ورودی» (IME) را ردیابی کنید، ازجمله IMS،‏ IMMS، و «کارخواه IME».
  • ورودی: رویدادهای ورودی ردیابی را از بخش‌های مختلف خط لوله رویداد ورودی انجام می‌دهد.
  • ProtoLog: پیام‌های ProtoLog را از خدمات سیستم و کد خدمات سیستم درحال اجرا در فرایندهای کارخواه جمع‌آوری می‌کند.
  • ضبط صفحه‌نمایش: ضبط صفحه‌نمایش را همراه با ردپاها جمع‌آوری کنید.
  • انتقال‌های پوسته: جزئیات سیستم انتقال فعالیت و پنجره را ضبط می‌کند.
  • SurfaceFlinger: ردگیری‌های SurfaceFlinger حاوی اطلاعاتی درباره سطوح (لایه‌ها) مثل موقعیت، میان‌گیر، و ترکیب را جمع‌آوری می‌کند.
  • تراکنش‌ها: مجموعه تغییرات اتمی دریافتی توسط SurfaceFlinger را بااستفاده از SurfaceControl برای ترکیب ردیابی کنید.
  • ViewCapture: ضبط کردن طیفی از دارایی‌های همه نماها از سیستم Windows که از ViewCapture پشتیبانی می‌کنند، مثل «واسط کاربر سیستم» و «راه‌انداز».
  • مدیر پنجره: ردیابی مدیر پنجره حالت‌های حاوی جزئیات مربوط به پنجره‌ها، ازجمله رویدادهای ورودی و تمرکز، جهت صفحه، انتقال‌ها، پویانمایی‌ها، موقعیت‌یابی، و تبدیل‌ها.

خروجی‌های پشتیبانی‌شده

Winscope می‌تواند انبارهای حالت را جمع‌آوری و نمایش دهد. این انبارها عکس‌های آنی از حالت دستگاه هستند که در لحظات خاصی که شما تعریف کرده‌اید گرفته شده‌اند. برخلاف ردگیری‌ها که به‌طور مداوم درطول استفاده از دستگاه جمع‌آوری می‌شوند و می‌توانند بر عملکرد تأثیر بگذارند، نسخه‌های تخلیه فقط در این لحظات تعریف‌شده توسط کاربر گرفته می‌شوند تا اطمینان حاصل شود که عملکرد و سطح جزئیات به‌خطر نمی‌افتند. این کار امکان تجزیه‌وتحلیل متمرکزتر و کارآمدتر وضعیت دستگاه را در نقاط زمانی خاص فراهم می‌کند. ‫Winscope از تخلیه‌های زیر پشتیبانی می‌کند:

  • مدیر پنجره: وضعیت «مدیر پنجره» را تخلیه کنید.
  • SurfaceFlinger: Dump a single SurfaceFlinger snapshot.
  • نماگرفت: نماگرفتی همراه با تخلیه‌ها جمع‌آوری می‌شود.

منابع

برای اطلاعات بیشتر درباره ساختن و اجرای Winscope، به اجرای Winscope مراجعه کنید.

برای اطلاعات درباره جمع‌آوری ردگیری‌ها، به ضبط ردگیری‌ها مراجعه کنید.

برای اطلاعات درباره نحوه بار کردن ردیابی‌ها بااستفاده از واسط کاربر وب Winscope، به بار کردن ردیابی‌ها مراجعه کنید.

برای کسب اطلاعات درباره تجزیه‌وتحلیل ردیابی‌ها، تجزیه‌وتحلیل ردیابی‌ها را ببینید.

مثال‌ها

مثال زیر نحوه اشکال‌زدایی آزمایش لرزش ناموفق و اشکال گزارش‌شده توسط کاربر را شرح می‌دهد.

آزمایش لرزش ناموفق بود

این مثال نشان می‌دهد که چگونه از Winscope برای اشکال‌زدایی آزمایش ناموفق لرزش استفاده کنید.

بررسی کردن ناموفق بودن آزمایش

برای تعیین نوع مشکل و بررسی پیام خطای آزمایش، این مراحل را دنبال کنید.

  1. با بررسی نام کلاس و آزمون، نوع مشکل را تعیین کنید.

    نام آزمون و کلاس:

    FlickerTestsNotification com.android.server.wm.flicker.notification.OpenAppFromLockscreenNotificationColdTest#appLayerBecomesVisible[ROTATION_0_GESTURAL_NAV]
    

    نوع مشکل:

    • «کاربر از اعلان صفحه قفل برنامه راه‌اندازی می‌کند» (CUJ) به این معنی است که کاربر برنامه را از اعلان صفحه قفل راه‌اندازی می‌کند (OpenAppFromLockscreenNotificationColdTest).
    • آزمایش انتظار دارد برنامه نمایان شود (#appLayerBecomesVisible).
  2. پیام خطای آزمون را بررسی کنید، این پیام اطلاعات جامعی درباره خطا ارائه می‌دهد، ازجمله:

    • مقایسه بین نتیجه موردانتظار و نتیجه قابل‌مشاهده واقعی
    • مُهرهای زمان برای کمک به تعیین دقیق زمان وقوع خرابی
    • نام مصنوع یا فایل مرتبط با خرابی
    • اطلاعات زمینه‌ای اضافی مربوط به درک و اشکال‌زدایی خرابی
    android.tools.flicker.subject.exceptions.IncorrectVisibilityException: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity# should be visible
    
    Where?
        Timestamp(UNIX=2024-05-10T11:04:14.227572545(1715339054227572545ns), UPTIME=37m21s184ms79178ns(2241184079178ns), ELAPSED=0ns)
    
    What?
        Expected: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#
        Actual: [e636ecd com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3457: Buffer is empty, Visible region calculated by Composition Engine is empty, com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458: Visible region calculated by Composition Engine is empty]
    
    Other information
        Artifact: FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV.zip
    
    Check the test run artifacts for trace files
    
        at android.tools.flicker.subject.layers.LayerTraceEntrySubject.isVisible(LayerTraceEntrySubject.kt:187)
        at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:151)
        at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:150)
        at android.tools.flicker.assertions.NamedAssertion.invoke(NamedAssertion.kt:32)
        at android.tools.flicker.assertions.CompoundAssertion.invoke(CompoundAssertion.kt:42)
        at android.tools.flicker.assertions.AssertionsChecker.test(AssertionsChecker.kt:79)
        at android.tools.flicker.subject.FlickerTraceSubject.forAllEntries(FlickerTraceSubject.kt:59)
        at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:46)
        at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:43)
        at android.tools.flicker.assertions.AssertionDataImpl.checkAssertion(AssertionDataImpl.kt:33)
        at android.tools.flicker.assertions.ReaderAssertionRunner.doRunAssertion(ReaderAssertionRunner.kt:35)
        at android.tools.flicker.assertions.ReaderAssertionRunner.runAssertion(ReaderAssertionRunner.kt:29)
        at android.tools.flicker.assertions.BaseAssertionRunner.runAssertion(BaseAssertionRunner.kt:36)
        at android.tools.flicker.legacy.LegacyFlickerTest.doProcess(LegacyFlickerTest.kt:59)
        at android.tools.flicker.assertions.BaseFlickerTest.assertLayers(BaseFlickerTest.kt:89)
        at com.android.server.wm.flicker.notification.OpenAppTransition.appLayerBecomesVisible_coldStart(OpenAppTransition.kt:51)
        at com.android.server.wm.flicker.notification.OpenAppFromNotificationColdTest.appLayerBecomesVisible(OpenAppFromNotificationColdTest.kt:64)
    

    این نمونه برونداد نشان‌دهنده موارد زیر است:

    • این مشکل در 2024-05-10T11:04:14.227572545 رخ می‌دهد.
    • انتظار می‌رود NotificationActivity نمایان باشد اما نمایان نیست.
    • نام فایل آرتیفکت که حاوی ردپاهای اشکال‌زدایی است FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV است.

اشکال‌زدایی کردن

برای تعیین علت پرش، این مراحل را دنبال کنید:

  1. فایل‌های ردیابی را بارگیری کنید و آن‌ها را در Winscope بار کنید. Winscope با SurfaceFlinger که به‌طور خودکار انتخاب شده است باز می‌شود:

    صفحه مقصد Winscope با نمای SurfaceFlinger

    شکل ۱. صفحه مقصد Winscope با نمای SurfaceFlinger.

  2. با کپی و جای‌گذاری کردن مُهر زمان از پیام استثنا در فیلد مُهر زمان، به مُهر زمانی که مشکل در آن رخ می‌دهد بروید. می‌توانید مُهر زمان را در قالب قابل‌خواندن برای انسان (2024-05-10T11:04:14.227572545) کپی کنید و در فیلد اول جای‌گذاری کنید، یا مُهر زمان را در نانوثانیه (1715339054227572545ns) کپی کنید و در فیلد دوم جای‌گذاری کنید.

    کادر گفتگوی مُهر زمان

    شکل ۲. کادر گفتگوی مُهر زمان.

  3. برای پیمایش به قاب قبلی، کلید چپ‌بَر را فشار دهید. در این حالت، برنامه NotificationActivity به‌درستی در ویدیو نشان داده می‌شود و هر دو سطح برنامه و صفحه اسپلش قابل‌مشاهده هستند که با مستطیل‌های سبز در نمای سه‌بعدی و تراشه V روی عناصر سلسله‌مراتبی آن‌ها نشان داده شده است.

    نام‌های سطح برنامه و صفحه آغازین عبارت‌اند از:

    com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
    
    Splash Screen com.android.server.wm.flicker.testapp#3453
    

    این نشان می‌دهد که برنامه درحال راه‌اندازی بوده است که صفحه سیاه شده است و این رویداد درطول راه‌اندازی برنامه رخ می‌دهد، زیرا صفحه اسپلش هنوز قابل‌مشاهده است:

    هنگام راه‌اندازی برنامه

    شکل ۳. هنگام راه‌اندازی برنامه.

  4. برای پیمایش به قاب بعدی که در آن پرش رخ می‌دهد، کلید راست‌بَر را فشار دهید. در نمای مستطیل‌ها، NotificationShade به‌جای برنامه روی صفحه نشان داده می‌شود. سطوح زیر در این قاب نشان داده می‌شود:

    • رونهادهای تزئینی صفحه‌نمایش (بالا و پایین)
    • نوار پیمایش
    • مکان اشاره‌گر (از ضبط صفحه‌نمایش)

    فعالیت Flicker

    شکل ۴. فعالیت Flicker.

  5. فعالیت برنامه را در نمای سلسله‌مراتب انتخاب کنید. اگر نمی‌توانید آن را پیدا کنید، گزینه نمایش فقط V را غیرفعال کنید. سپس نمای ویژگی‌ها را بررسی کنید.

    نام سطح برنامه:

    com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
    

    مشخصه‌های برنامه

    شکل ۵. دارایی‌های برنامه.

    اگرچه فعالیت برنامه روی قابل‌مشاهده و مات تنظیم شده است، اما سطح به‌دلیل خطای Invisible due to: null visible region نشان داده نمی‌شود. این اتفاق زمانی می‌افتد که سطح مات دیگری درطول ترکیب‌بندی در جلوی آن قرار داده شده باشد. این فرضیه از این واقعیت ناشی می‌شود که مستطیل NotificationShade در نمای سه‌بعدی جلوی مستطیل NotificationActivity قرار دارد و NotificationShade مرئی (سبز) احتمالاً لایه انتخابی است.

  6. برای اعتبارسنجی این فرضیه، سطح نمایان NotificationShade را در قاب کنونی انتخاب کنید و ویژگی‌های آن را بررسی کنید. پرچم‌ها روی OPAQUE|ENABLE_BACKPRESSURE (0x102) تنظیم شده است. نام سطح NotificationShade NotificationShade#3447 است. سپس، کلید پیکان چپ را فشار دهید تا به قاب قبلی (قبل‌از پرش) برگردید و دوباره ویژگی‌های سطح NotificationShade را بررسی کنید. توجه داشته باشید که به‌جای OPAQUE، سطح فقط پرچم ENABLE_BACKPRESSURE (0x100) را دارد. این تأیید می‌کند که NotificationShade قبل‌از اینکه راه‌اندازی برنامه کاملاً تمام شود، مات می‌شود. چون NotificationShade جلوی NotificationActivity قرار دارد، برنامه نشان داده نمی‌شود. NotificationShade سیاه است، بنابراین صفحه برای لحظه‌ای سیاه می‌شود که باعث پرش می‌شود.

  7. در کد مشخص کنید که چرا NotificationShade خیلی زود مات می‌شود.

اشکال گزارش‌شده توسط کاربر

اشکال‌زدایی کردن اشکال‌های گزارش‌شده توسط کاربر می‌تواند چالش‌برانگیز باشد زیرا اغلب فاقد اطلاعات دقیق هستند. برخلاف خطاهای آزمون پرش که مُهرهای زمان خاص، جزئیات عنصر، و ضبط‌های صفحه را ارائه می‌دهند، اشکالات گزارش‌شده توسط کاربر معمولاً فقط شامل شرح مختصری از مشکل است.

در مطالعه موردی ما، تنها اطلاعات ارائه‌شده عنوان لرزش صفحه هنگام باز کردن مجدد برنامه از صفحه دونیمه و مُهر زمان تقریبی ۱۸ آوریل ۲۰۲۴ ساعت ۳:۵۱ ب.ظ. GMT-04:00 است.

برای اشکال‌زدایی کردن اشکال گزارش‌شده توسط کاربر، این مراحل را دنبال کنید:

  1. فایل ردیابی را در Winscope بار کنید. ‫Winscope با SurfaceFlinger انتخاب خودکار باز می‌شود.

    صفحه مقصد Winscope با نمای SurfaceFlinger

    شکل ۶. صفحه مقصد Winscope با نمای SurfaceFlinger.

  2. با وارد کردن 15:50:00 در فیلد مُهر زمان خوانا برای انسان، به مُهر زمان تقریبی گزارش‌شده توسط کاربر، در این مورد 3:50 PM GMT-04:00، پیمایش کنید.

    کادر گفتگوی مُهر زمان

    شکل ۷. کادر گفتگوی مُهر زمان.

  3. از نمای rects برای شناسایی آنچه روی صفحه کشیده شده است استفاده کنید. برای دید بهتر، از لغزنده چرخش برای تغییر چشم‌انداز مستطیل‌ها استفاده کنید. با علامت‌گذاری نمایش فقط V و مسطح در نمای سلسله مراتب، سطوح کاغذدیواری، رونهاد تزئین صفحه، قاب‌بندی، راه‌انداز، مخاطبین، و شماره‌گیر قابل‌مشاهده است.

    نام بسته‌ها این است:

    • راه‌انداز: com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity#40602
    • مخاطبین: com.google.android.contacts/com.android.contacts.activities.PeopleActivity#40565
    • شماره‌گیر: com.google.android.dialer/com.google.android.dialer.extensions.GoogleDialtactsActivity#40564

    علاوه‌بر سطوح نمایان (مستطیل‌های سبز)، مستطیل خاکستری که نشان‌دهنده سطح ناحیه نمایش است و نمایش ناشناخته نام دارد نمایش داده می‌شود. برای بهبود نمایان بودن، روی (نماد رؤیت‌پذیری) در کنار سطح ScreenDecorHwcOverlay#64 کلیک کنید تا مستطیل مربوط به آن پنهان شود و سطوح پشت آن آشکار شود. پوشش را برای تجزیه‌وتحلیل برمی‌داریم زیرا برای کاربر قابل‌مشاهده نیست و به‌عنوان پویانمایی سوسوزننده گزارش نمی‌شود.

    گزارش کاربر

    شکل ۸. گزارش کاربر.

  4. پس‌از شناسایی سطوحی که در نمای صفحه تقسیم‌شده دخیل هستند، از ردیابی «گذارها» برای گام‌به‌گام پیش رفتن در کنش‌های مختلف کاربر و پیدا کردن پرش استفاده کنید. روی برگه انتقال‌ها در Winscope کلیک کنید تا فهرست انتقال‌های پخش‌شده را تجسم کنید:

    گذارها

    شکل ۹. گذرها.

    گذار پخش‌شده در این قاب با رنگ آبی برجسته شده است. در این مورد، پرچم‌های گذار شامل TRANSIT_FLAG_IS_RECENTS است که نشان می‌دهد کاربر وارد صفحه اخیر شده است.

  5. روی پیوند ستون زمان اعزام (در این مورد 2024-04-18, 15:50:57.205) کلیک کنید تا به آن نقطه زمانی بروید و مستطیل‌ها را در زبانه Surface Flinger تأیید کنید. با گام‌به‌گام پیش رفتن در انتقال با کلید جهت راست و مشاهده مستطیل‌ها، صحت وضعیت دستگاه را درطول انتقال تأیید کنید.

    «راه‌انداز» در 15:50:57.278 ظاهر می‌شود، اما پویانمایی در آن زمان شروع نمی‌شود. کاغذدیواری ازقبل قابل‌مشاهده است چون چیزی بین برنامه‌های صفحه دونیمه (جداکننده) کشیده نشده است. یک قاب زودتر (۱۵:۵۰:۵۷.۲۱۲)، کاغذدیواری نمایان نیست و جداکننده نشان داده می‌شود، که ظاهر صفحه‌نمایش دوگانه در حالت بدون پویانمایی است.

    صفحه‌نمایش قبل‌از سوسو زدن

    شکل ۱۰. صفحه‌نمایش قبل‌از رویداد سوسوزدن.

  6. برای بررسی انتقال بعدی، مستقیماً روی خط زمان کلیک کنید. حالت‌های SurfaceFlinger با ردیفی از بلوک‌های آبی روشن نشان داده می‌شود. گذارها با ردیفی از بلوک‌های صورتی نشان داده می‌شوند.

    پایان گذار اول

    شکل ۱۱. پایان اولین گذار.

    روی ردیف SurfaceFlinger در موقعیت شروع انتقال بعدی کلیک کنید. در شکل ۱۱، جایگاه عمودی مکان‌نما با خط آبی نازک نشان داده شده است. پس‌زمینه آبی روشن ردیف SurfaceFlinger موقعیت افقی آن را نشان می‌دهد. با کلید راست‌بَر، مراحل گذار را یکی‌یکی طی کنید تا ببینید آیا لرزش رخ می‌دهد یا نه. تأیید کنید که دستگاه برای این انتقال درست به‌نظر می‌رسد.

  7. از گذار بعدی رد شوید زیرا مدت آن بسیار کوتاه است، بنابراین احتمالاً دارای سوسو زدن نیست. درعوض، روی خط زمان در ردیف SurfaceFlinger در موقعیت شروع انتقال طولانی‌تر بعدی کلیک کنید، همان‌طور که با مکان‌نما در تصویر زیر نشان داده شده است.

    پایان گذار دوم

    شکل ۱۲. پایان انتقال دوم.

    درطول این انتقال، در 15:51:13.239، مشاهده کنید که لایه‌های Splash Screen برای هر دو برنامه، مخاطبین، و شماره‌گیر، در یک سمت نمایشگر قرار دارند:

    صفحه‌های اسپلش

    شکل ۱۳. صفحه‌های اسپلش.

  8. توضیح دهید کدام برنامه در سمت اشتباه قرار دارد. با کلیک روی نماد پرچم در کنار فیلد ورودی ns، به موقعیت فعلی خود نشانک اضافه کنید تا بعداً بتوانید به این قاب برگردید.

    افزودن نشانک

    شکل ۱۴. افزودن نشانک.

  9. با کلیک مستقیم روی خط زمان، برای مثال، روی 15:51:13.859، به قاب در انتهای انتقال پیمایش کنید. در اینجا دو برنامه در موقعیت نهایی خود قرار دارند، شماره‌گیر در سمت چپ و مخاطبین در سمت راست:

    صفحه دونیمه نهایی

    شکل ۱۵. صفحهٔ دونیمه نهایی.

  10. برای بازگشت به قاب دارای پرش، روی پرچم نشانک در خط زمان کلیک کنید.

    خط زمان نشانک

    شکل ۱۶. خط زمان نشانک‌گذاری شود.

    هر دو برنامه در سمت راست هستند، که نشان می‌دهد شماره‌گیر در جای اشتباهی قرار دارد.

  11. برای مشاهده ویژگی‌های صفحه ورود شماره‌گیر، روی آن کلیک کنید. به‌طور خاص به خصوصیت‌های تبدیل آن در نمای خصوصیت‌ها که به‌طور ویژه انتخاب شده است نگاه کنید.

    تبدیل خصوصیات

    شکل ۱۷. خصوصیات تبدیل.

    تبدیل محاسبه‌شده برای این سطح اعمال شده است، اما در این سطح تنظیم نشده است. ستون‌های محاسبه‌شده و درخواست‌شده مقادیر متفاوتی دارند، که نشان می‌دهد تبدیل از سطح والد به ارث رسیده است.

  12. تخت را در نمای سلسله‌مراتبی لغو انتخاب کنید تا کل درخت سلسله‌مراتبی نشان داده شود، و به گره‌های اصلی سطح برنامه پیمایش کنید تا هر دو تبدیل محاسبه‌شده و درخواست‌شده یکسان شوند، که نشان می‌دهد تبدیل در سطح Surface(name=Task=7934)/@0x1941191_transition-leash#40670 درخواست شده است.

  13. تأیید کنید که تبدیل برای اولین‌بار چه زمانی و با چه مقداری تنظیم شده است. با کلیک کردن روی نماد کنار عنوان، دارایی‌های گلچین‌شده را جمع کنید:

    جمع کردن دارایی‌های گلچین‌شده

    شکل ۱۸. جمع کردن دارایی‌های گلچین‌شده.

  14. نمایش تفاوت را در نمای Proto Dump انتخاب کنید تا ویژگی‌هایی که در این قاب تغییر می‌کنند برجسته شوند. برای فیلتر کردن دارایی‌ها، transform را در فیلد جستجوی نوشتاری تایپ کنید:

    نمایش تفاوت‌ها

    شکل ۱۹. نمایش تفاوت‌ها.

    تبدیل از IDENTITY به SCALE|TRANSLATE|ROT_270 در این قاب برای transition-leash تنظیم شده است.

    این اطلاعات نشان می‌دهد که لرزش زمانی رخ داده است که تبدیل روی بند انیمیشن برنامه صفحهٔ دونیمه شماره‌گیر اعمال شده است.

    شناسایی پرش

    شکل ۲۰. شناسایی پرش.

  15. در کد شناسایی کنید که چرا این تبدیل روی مهار انتقال صفحه دونیمه تنظیم شده است.