40 FPS dan 140 FPS gacha: alomatni emas, sababni topish
Bir kuni o'yin 40 FPS bera boshladi. Oldin bunday emas edi, temir o'zgarmagan, drayver yangilangan bo'lsa ham katta farq bo'lmasligi kerak edi.
Birinchi harakatim har kimnikidek bo'ldi: rezolyutsiyani tushirdim. 1440p dan 1080p ga o'tdim, apskeyler yoqdim — va 200 FPS oldim. Muammo "hal bo'ldi".
Ammo bu yechim emas edi. Bu — alomatni bo'g'ish. Men monitorni 1440p uchun olganman, uni 1080p da ishlatish uchun emas. Va eng muhimi, men nima uchun bunday bo'lganini bilmasdim. Bilmagan narsangiz keyin yana qaytadi.
Bu maqola aynan shu haqda: nosozlikni yopish bilan sababni topish o'rtasidagi farq haqida. Misol o'yindan, lekin usul har qanday ishlab chiqarish muammosiga tegishli.
Nima uchun "ishladi" degan javob yetarli emas
Rezolyutsiyani tushirish yordam bergani menga bitta ma'lumot berdi: bo'g'in piksel ishida. Bu foydali, lekin yetarli emas, chunki savol ochiq qoladi — nega birdan piksel ishi oshib ketdi? Rezolyutsiya o'zgarmagan-ku.
Dasturchilikda ham xuddi shunday. "Retry qo'shdim, endi yiqilmayapti" — bu tuzatish emas. Bu xatoni sanoqqa kirmaydigan qilib qo'yish. Sabab joyida turibdi va boshqa shaklda qaytadi.
Shuning uchun men orqaga qaytdim va savolni boshqacha qo'ydim: kim qancha piksel chizishga buyruq beryapti?
Birinchi o'lchov: bo'g'in qayerda
Avval GPU'ni kuzatdim. Sonlar shunday chiqdi:
quvvat harorat yuklama video xotira FPS
1440p 58W 84C 99% 3753 MB 40
1080p+FSR 34W 78C 64% 3409 MB 200Eng muhim ustun — video xotira. U deyarli o'zgarmadi: 3753 va 3409 MB. Ya'ni xotira bo'g'in emas edi. Yuklama esa 99% dan 64% ga tushdi.
Bu ikki son birgalikda aniq javob beradi: GPU xotiraga emas, hisob-kitob ishiga tiqilib qolgan. Ya'ni u haqiqatan ham juda ko'p piksel chizyapti.
Bu debug'dagi eng foydali qadam: taxmin qilishdan oldin o'lchash. "Menimcha xotira yetmayapti" degan gipoteza bir daqiqalik o'lchov bilan rad etildi va meni butunlay boshqa yo'nalishga burdi.
Ikkinchi o'lchov: u aslida qancha piksel chizyapti
Agar GPU juda ko'p piksel chizayotgan bo'lsa, aniq nechta ekanini bilish kerak. Men oynaning haqiqiy o'lchamini so'radim — va javob kutilmagan bo'ldi.
Monitorim 2560x1440. Tizim esa uni shunday ko'rsatardi:
$ xrandr --listmonitors
0: +*HDMI-A-1 4480/597x2520/336+2560+0
Screen 0: current 7040 x 25204480x2520. Ya'ni 11.3 megapiksel — 1440p dan uch barobar ko'p. O'yin to'liq ekran rejimida aynan shuncha piksel chizardi, keyin tizim uni 1440p ga siqib ko'rsatardi. Butun ortiqcha ish behuda ketardi.
Mana shu joyda hamma narsa o'z o'rniga tushdi. 40 FPS — noto'g'ri son emas edi. Uch barobar ko'p ish uchun u aynan to'g'ri son edi.
Sabab: bitta global sozlama
Qolgani oson bo'ldi. Laptopda ikkita ekran bor: ichki ekran yuqori zichlikda, unga 1.75 masshtab qo'yilgan; tashqi monitor esa oddiy, masshtabsiz.
Kompozitor eski X11 ilovalari uchun bitta umumiy masshtab ishlatadi va u eng kattasini tanlaydi — ya'ni 1.75 ni. Bu qiymat masshtab kerak bo'lmagan monitorga ham tarqaladi. Natijada tashqi monitor eski ilovalarga 2560x1440 emas, 4480x2520 bo'lib ko'rinadi.
O'yin esa aynan shu eski rejimda ishga tushardi — uni ishga tushirish skripti o'zi shunday qilib sozlangan edi.
Sabab shu: ichki ekranning masshtabi tashqi monitordagi o'yinni uch barobar ortiqcha ishlashga majburlagan.
Yechim va nega ikkinchi variantni tanladim
Ikkita yo'l bor edi.
Birinchisi — o'yinni butunlay zamonaviy rejimda ishga tushirish, ya'ni eski qatlamni chetlab o'tish. FPS tuzaldi, lekin yon ta'siri chiqdi: ikki monitorli sozlamada o'yin har doim noto'g'ri ekranda ochilardi va uning ichidagi monitor tanlash sozlamasi ishlamay qoldi.
Ikkinchisi — global masshtabni 1 ga tushirish, ya'ni eski ilovalarni tizim o'zi kattalashtiradigan qilib qo'yish. Chiqish va qayta kirishdan keyin: 40 FPS dan 140 FPS ga.
Men ikkinchisini tanladim. Narxi bor — laptop ekranida eski ilovalar biroz xiralashadi. Lekin bu narx men uchun arziydi, chunki u bitta o'yinni emas, barcha eski ilovalarni bir yo'la tuzatadi.
Bu ham debug'ning bir qismi: eng chiroyli yechim emas, yon ta'siri eng kam yechim tanlanadi.
Keyingi bo'g'in
Tuzatgandan keyin yana o'lchadim — va ikkinchi bo'g'inni ko'rdim: protsessor 94-97 daraja va uch sekundda 524 millisekund throttle qilyapti. Ya'ni endi cheklov GPU'da emas, sovutishda.
Bu odatiy hol. Bitta bo'g'inni ochsangiz, keyingisi ko'rinadi. Muhimi — har safar o'lchab tasdiqlash, taxmin qilmaslik.
Usul
Bu hikoyadan qoladigan narsa o'yin sozlamalari emas, tartib:
- Vaqtinchalik yechim ishlagani — bu ma'lumot, yechim emas. U sizga bo'g'in qayerdaligini aytadi, xolos.
- Taxmin qilishdan oldin o'lchang. Menda "xotira yetmayapti" gipotezasi bir daqiqada rad etildi.
- Tizim nima deb o'ylayotganini so'rang, siz nima bilishingizni emas. Monitorim 1440p, lekin tizim uni 4480x2520 deb bilardi — butun javob shu farqda edi.
- Sabab topilgach, yechimni yon ta'siri bo'yicha tanlang.
- Tuzatgandan keyin yana o'lchang. Keyingi bo'g'in har doim bor.
Dasturchilikda ham xuddi shunday ishlaydi. Sekin API, ko'payib ketgan xotira, goh chiqadigan xato — hammasida bir xil savol beriladi: men alomatni yopyapmanmi yoki sababni topdimmi?
Agar javobni ayta olmasangiz, muammo hali joyida turibdi.