Steven
Steven4 minit bacaan

Mengapa Rakaman Skrin Menangkap Monitor yang Salah (dan Cara Kami Membetulkannya)

Pada persediaan dua monitor, GeekBye merakam dan menangkap tangkapan skrin paparan utama tak kira di skrin mana anda bekerja. Pembetulannya hanya satu fungsi kecil — tetapi versi pertamanya salah, dan semakan kod menemui sebabnya.

Rakaman Skrin
Multi-Paparan
Kejuruteraan
Keluaran GeekBye
Mengapa Rakaman Skrin Menangkap Monitor yang Salah (dan Cara Kami Membetulkannya)

Inilah pepijat yang hanya wujud jika anda memiliki dua monitor — sebab itulah ia hidup secara senyap buat seketika. Anda bekerja di skrin sisi, memulakan rakaman GeekBye, dan ia merakam monitor utama anda. Yang ada bar menu. Yang tidak anda pandang.

Kecacatan yang sama, lebih senyap dan lebih buruk, mengenai tangkapan skrin yang GeekBye hantar kepada AI sebagai konteks: tekan pintasan tangkapan skrin pada monitor kedua anda, dan AI mendapat gambar monitor pertama anda. Tiada petanda visual — pembantu itu cuma menjawab tentang skrin yang salah dan anda tertanya-tanya mengapa ia keliru. GeekBye v2.0.10 membetulkan kedua-duanya.

Dua saluran paip, satu nilai lalai yang malas

Tangkapan skrin pada desktop ialah dua laluan kod berasingan, dan kedua-duanya secara bebas telah memilih paparan utama:

  • Rakaman video menyenaraikan sumber skrin yang tersedia dan mengambil yang pertama — sources[0]. Pada macOS itu secara praktiknya sentiasa paparan utama. Tiada pemilih, tiada logik tentang di mana anda sebenarnya berada. Komen dalam kod kami sendiri secara literalnya menyebut "auto-select first screen source."
  • Tangkapan skrin menggunakan perintah screencapture macOS dengan bendera -m. Bendera itu mempunyai tepat satu makna: main display only (paparan utama sahaja). Ditulis mati.

Tiada satu pun daripada kedua-dua laluan itu pernah bertanya soalan yang penting: pengguna berada di skrin mana?

Satu perkara yang tidak pernah rosak, berbaloi dijelaskan kerana orang menyangka begitu: bertukar antara Spaces macOS pada monitor yang sama sentiasa berfungsi. Tangkapan berlaku pada peringkat paparan — ia mengambil apa jua Space yang kelihatan pada paparan yang dipilih. Pepijat ini tidak pernah tentang Spaces. Ia sentiasa tentang memilih paparan fizikal yang salah.

Pembetulan yang kelihatan jelas — dan ternyata salah

Isyarat yang betul kelihatan mudah: tangkap paparan tempat pengguna berada. Pelaksanaan pertama kami berpaut pada tetingkap overlay GeekBye — tangkap paparan mana pun tempat overlay itu berada.

Semakan kod membunuhnya, dengan betul. Overlay GeekBye dicipta sebagai tetingkap kawasan-kerja-penuh pada paparan utama, pada kedudukan (0,0). Ia hanya berpindah ke monitor lain jika anda secara fizikal menyeret pilnya ke sana — dan pintasan papan kekunci yang menolaknya ke sana sini terhad kepada dimensi paparan utama, jadi ia tidak boleh memindahkannya ke monitor kedua sama sekali. Berpaut tangkapan pada overlay bermakna: bagi setiap pengguna yang tidak kebetulan menyeret overlay ke skrin kerjanya, "pembetulan" itu kembali terus ke paparan utama. Ia hampir tidak membetulkan sesiapa pun — sambil kelihatan, dalam ujian pantas pada mesin pembangunan bermonitor tunggal, seolah-olah ia berfungsi.

Sauh yang betul ialah kursor. Di mana jua tetikus anda berada, itulah paparan tempat anda bekerja — dan ia betul untuk setiap cara sesuatu tangkapan bermula: pintasan papan kekunci mencetus di tempat anda menuding, dan mengklik butang Rakam meletakkan kursor anda pada paparan itu menurut takrifnya. Pembetulan akhirnya ialah fungsi dua baris: paparan paling hampir dengan kursor. Video memadankan sumber tangkapannya dengan id paparan itu; tangkapan skrin menghantar sempadan paparan itu kepada screencapture -R (segi empat tepat tertentu) dan bukannya bendera paparan-utama -m.

Kami memilih -R (segi empat tepat eksplisit dalam koordinat skrin global) berbanding -D (sebuah indeks paparan) secara sengaja: indeks paparan OS tiada padanan terjamin dengan susunan paparan rangka kerja, jadi indeks akan menjadi permainan teka kedua. Segi empat tepat daripada sempadan paparan sebenar tiada kesamaran — dan kami mengesahkan gelagat bendera itu, termasuk koordinat negatif untuk paparan yang diletakkan di kiri paparan utama, pada pentas multi-monitor sebenar sebelum dikeluarkan.

Mengapa ini pepijat yang baik untuk belajar

  1. "Tangkap skrin" menyembunyikan satu keputusan. Pada satu paparan tiada keputusan, jadi keputusan itu tidak pernah direka bentuk — ia dilalaikan. Multi-monitor ialah tempat setiap nilai lalai tersirat timbul ke permukaan.
  2. Salah secara senyap lebih buruk daripada salah secara jelas. Pepijat video menjengkelkan orang. Pepijat tangkapan skrin mengelirukan AI, secara tak kelihatan. Apabila anda membina ciri yang menyuap konteks kepada sesuatu model, input yang salah menghasilkan output yang salah dengan penuh yakin tanpa sebarang ralat di mana-mana. Itulah kegagalan yang paling berbaloi diburu bersungguh-sungguh.
  3. Pembetulan yang lulus pada mesin anda boleh gagal pada mesin orang lain. Versi yang berpaut pada overlay berfungsi dalam ujian bermonitor tunggal. Seluruh intipati pepijat ini ialah berbilang monitor — dan penyemak menaakul tentang kedudukan sebenar tetingkap itu dan bukannya mempercayai ujian hijau. Semakan bukanlah cop getah pada kod yang berfungsi; ia model kedua tentang mengapa kod itu berfungsi.

GeekBye v2.0.10 mengeluarkan pembetulan berasaskan kursor untuk kedua-dua rakaman dan tangkapan skrin. Jika anda menggunakan berbilang paparan, tangkapan kini mengikut anda.

Untuk keluaran jiran dalam siri ini, lihat mengapa AI notetaker anda berhenti merakam di pertengahan mesyuarat (v2.0.9) dan mengapa transkripsi AI tersalah dengar istilah teknikal (v2.0.11). Untuk bagaimana overlay berkelakuan semasa panggilan, lihat cara kekal halimunan semasa perkongsian skrin.