Mühendislik notu

Tarayıcıda deterministik video render’ı: neden asla ekran kaydı almıyoruz

EmlakKlip bir arsayı, tarayıcıdaki haritayı kare kare render ederek havadan videoya dönüştürür. Ekran kaydı videoyu makinenin hızına bağlardı. Bunun yerine her kare zamandan hesaplanır, hazır olduğu kanıtlanınca alınır ve müşteriye ulaşmadan önce denetlenir.

Ekran kaydının sorunu

Ekran kaydı, tarayıcı o an ne gösteriyorsa onu yakalar. Makine meşgulse kare düşer; harita karoları geç gelirse kayıtta bulanık ya da eksik görüntü kalır; aynı girdinin iki kaydı asla aynı olmaz. Çıktısı videonun kendisi olan bir ürün için bu kabul edilemez.

Harita kütüphaneleri ikinci bir sorun ekler: flyTo ve easeTo gibi kamera animasyonları tarayıcının kendi saatiyle çalışır; hareket, makinenin ne kadar hızlı çizdiğine bağlı olur. Bunları kullanmıyoruz.

Tek saat: zaman

Render motorunun tek bir zaman otoritesi vardır. Saniyede f karelik videoda n. karenin zamanı t = n / f’dir. Bir zaman çizelgesi o anın kamera durumunu — merkez, yakınlaşma, eğim ve yön — hesaplar ve arada hiçbir tarayıcı animasyonu olmadan doğrudan uygular. Makine hızı render’ın ne kadar süreceğini değiştirir, videonun ne gösterdiğini asla.

  • Kamera anahtar kareleri arasındaki geçişler yumuşatılır (en az ease-in-out cubic). Doğrusal kamera bilgisayar animasyonu gibi görünür.
  • Yön en kısa açıdan hesaplanır: 350°’den 10°’ye dönüş 20°’dir, ters yönden 340° değil.
  • Parselin etrafındaki dönüş bilinçli olarak doğrusal tek bölümdür: sabit açısal hız sakin görünür.
  • Kamera hiçbir zaman arazi + 25 m’nin altına inmez; arazi abartısı 1,00–1,15 arasında kalır, daha yüksek değerler ucuz görünür.

Hazır demek, bildirilen değil ölçülen demek

Her kare aynı sırayı izler: kamerayı kur, haritanın çizmesine izin ver, karolar boşta kalana kadar bekle, sonra ekran görüntüsünü al. Zor olan, haritanın gerçekten ne zaman hazır olduğunu bilmektir.

Harita kütüphanesinin stilin, karoların ve haritanın yüklendiğini bildirdiği — üçü de doğru — ama uydu görüntüsünün birkaç kopuk karo hâlinde boşlukta asılı kaldığı bir durumu ölçtük. Neden bir yarıştı: kamera, arazi (yükseklik) kaynağı yüklenmeden çerçevelenmişti; karo kapsamı arazi yokmuş gibi hesaplanıyordu. Kamera biraz kıpırdayınca kendiliğinden düzeliyordu. Araziyi kapatmak ya da aynı yakınlaşmalara elle gitmek sorunu hiç üretmedi; yalnız ilk boyama üretti.

Çözüm, hazır olmayı kendimiz tanımlamaktı: stil yüklendi ve arazi kaynağı yüklendi ve karolar yüklendi; ardından sahne hazır ilan edilmeden önce çerçeve bir kez daha uygulanır — sayfa sonsuza dek beklemesin diye kendi zaman aşımıyla. Ders genel: “yüklendi” bayrağı, karenin eksiksiz olduğunun kanıtı değildir.

Ağ kayıtları da yardımcı olmadı. Harita kütüphanesi karoları Web Worker içinde çeker; bunlar ne sayfanın kaynak zamanlamasında ne de tarayıcının ağ kaydında görünür. Kayıttaki sıfır istek, sıfır istek demek değildi.

Kütüphaneye kusursuz görünen kare

Görüntü karoları gerçek saatle birkaç yüz milisaniyede saydamdan opağa geçer. Kendi zamanıyla çalışan bir render motorunda bu geçiş sırasında alınan kare, bütün hazırlık sinyalleri yeşilken soluk görüntü taşır. Kare alma kapısı artık bu geçişi bekliyor; ayrı bir dedektör de bitmiş kareleri soluk karolar için tarıyor. Hızlı kamera dönüşlerinde aynı konum kareden kareye aynı içeriği göstermediği için dedektör hareketi telafi ediyor ve bir kareyi işaretlemeden önce iki yönde karşılaştırıyor.

Her kare geçmek zorunda

  • Ön ısıtma. Kare almadan önce kamera yolu saniyelik adımlarla gezilir; hiçbir kare bir konuma ilk gidiş olmaz.
  • Sabit bekleme yok. Bir kare 30 ms’de de, 400 ms’de de hazır olabilir; beklemeyi kalite belirler. Süresi içinde hazır olmayan kare videoya girmez, render’ı düşürür.
  • Boyut mandalı. Boş bir kare birkaç kilobayt, ayrıntılı bir kare üç megabayt civarındadır. 40 KB’ın altındaki her kare render’ı düşürür.
  • Konsol hataları. Kare alma sırasında tarayıcı konsolundaki tek bir hata render’ı düşürür.
  • Yalnız süre değil, kare sayısı. Kodlamadan sonra dosya ikisi için de denetlenir. Nedenini, bozuk tek bir kare kodlayıcı tarafından sessizce atlandığında öğrendik: video yine tam 20,000000 saniye görünüyordu; onu yalnız kare sayısı — 600 yerine 599 — ele verdi.

Düşemeyen denetime güvenilmez

Her kalite denetimi, aradığı kusur bilerek üretilerek test edilir: render motoru düzeltme kapalıyken çalıştırılır ve denetim tam o kusuru yakalamak zorundadır. Bilerek bozulmuş bir karede geçen denetim bozuktur — ve her şeyden önce o düzeltilir.

Başarısız render hiçbir şey silmez

Bir render ancak kodlama, doğrulama, kalite kontrol kareleri, inceleme ve mobil kopyalar ve manifest başarıyla bittikten sonra yayımlanır. Yeni sürüm öncekinin yerini tek adımda alır; teslim edilen video ve manifesti hiçbir zaman farklı render’lara ait olamaz. Başarısız render son iyi çıktıyı asla silmez.

Deterministik neyi kapsar, neyi kapsamaz

Kamera durumu ve zamanlama deterministiktir: aynı girdi her karede aynı kamerayı üretir. Piksel düzeyinde aynılık iddia edilmez — WebGL iki koşuyu biraz farklı çizebilir — bu yüzden render manifestlerimiz deterministik pikseli değil, deterministik kamerayı kaydeder.

Tarayıcıda üretilen her medya için çıkarımlar

  • Zamanı kendiniz sürün; kamerayı asla tarayıcının saati hareket ettirmesin.
  • Hazır olmayı ölçümle tanımlayın; kütüphane bayraklarını ipucu sayın.
  • Her kareyi boyut ve bütünlükle kapılayın; kodlamadan sonra kareleri sayın.
  • Her denetimi negatif kontrolle test edin.
  • Tek adımda yayımlayın; bir hata son iyi sonucu asla silmesin.

Ayrıntı: EmlakKlip vaka çalışması ve coğrafi veri çalışmalarımız.

Aklınızda bir proje mi var?

Kısa bir açıklama gönderin. Önce karşılıklı NDA isterseniz, ayrıntıları paylaşmadan önce bizimkini gönderelim.

WhatsApp’tan yazın