Sildiğimiz efektler: bu sitede WebGL var, gren yok.
Bu site WebGL, WebGPU ve budanmış bir Three.js ile yayında; mesele efektin kendisi değil, her efektin bedelini bir ölçümle ödemesi.
Bir portfolyo yazısının en kolay hâli, yapılan efektleri saymaktır. Bu yazı tersini yapıyor: silinenleri sayıyor. Önce bir yanlış anlamayı kapatmak gerekiyor — bu sitede üç gerçek hesaplanan katman var. Ana sayfanın göğü Three.js ile çiziliyor, sayfa geçişi ve imza alanı WebGPU hesap boru hatlarında koşuyor, cihaz WebGPU desteklemiyorsa WebGL devralıyor. Yani efekt reddedilmedi. Bazı efektler ölçüldükten sonra silindi, ve silmenin her seferinde bir sayısı oldu.
Gren iki kez reddedildi, bir kez geri geldi, sonra silindi
Grenli doku katmanı ilk kez bir mikro detay turunda reddedildi: gerekçe kâğıdın temizliğinin kimliğin parçası olduğuydu. Sonra bir sanat dili sözleşmesi onu geri getirdi. Sonra son bir turda silindi — ama silinirken nöbetçileri azaltılmadı: beş nöbetçi aynı sayıda kaldı ve hepsi ters yöne çevrildi. Artık ölçülen şey «gren var mı» değil, «doku hâlâ var mı» — çünkü dokunun kaynağı artık hesaplanan yüzeyin kendisi.
- hesaplanan alan görünür → luminans sigma 7,03
- alan gizlenince → luminans sigma 2,48 (kalan poster)
- hareket azaltma kipinde → luminans sigma 1,93 (poster)
- çıplak porselen → luminans sigma 0,58 (yalnız kâğıt ışığı)
Ölçü iki kez yanılttı ve ikisi de kayda geçti: sabit bir kâğıt bölgesi seçmek bugün metin taşıyan bir yere denk geliyordu, imleç altındaki elemanı sormak ise tıklanamaz dekorları hiç görmüyordu. Kâğıt artık içerik gizlenerek ölçülüyor; soru «kâğıt bir doku taşıyor mu», yerleşim değil.
Silinen efekt, arkasındaki gerçek kusuru açığa çıkardı
Turun en pahalı dersi gren gittikten sonra geldi. Bir nöbetçi iki turdan beri yeşil yanıyordu ve yeşil olmasının sebebi ölçtüğü şey değildi: iki ekran görüntüsü arasında gördüğü «fark» tuvalden değil, grenin 0,7 saniyelik kaymasından geliyordu. Gren silinince fark sıfıra indi ve nöbetçi kırmızı yandı. Arkasında gerçek bir kusur vardı.
Kusur şuydu: tuval karışımı rengi ve alfayı ayrı çarpıyor, tarayıcı sonucu alfanın karesiyle gösteriyordu. Alfası 0,05’in altındaki bant ve 0,012’lik tarama çizgisi ekranda hiç yoktu — yalnız 0,3 alfalı tırnaklar görünüyordu. Yani o katman 28 Ağustos’tan beri çizilmiyordu ve hiç kimse görmemişti. Karışım ayrıldı; ölçüm eski şeritte 0’dan 1,23’e, tam sahnede 2,10’a çıktı. Bir efekti silmek, iki turdur yalan söyleyen bir nöbetçiyi de ortaya çıkardı.
Bir düğmeyi kaldırmak sitenin kendi iddiasını onardı
Sitede bir ses anahtarı vardı: isteğe bağlı, varsayılan kapalı, üç sembollü. Kaldırıldı. Kaldırılırken ölçülen yan kazanç kararın kendisinden büyük çıktı — anahtar tercihi tarayıcı deposuna yazıyordu ve sitenin gizlilik metni «yerel depolama kullanılmaz» diyordu. Yani sesi açan bir ziyaretçi için sayfanın kendi iddiası bozuluyordu. Doğrulama süiti bunu göremezdi, çünkü nöbetçi sesi hiç açmadan ölçüyordu. Düğmeyi kaldırmak tutarsızlığı kökünden kapattı; onaylı dizeler sözlükte duruyor.
Sürücüsü kalmayan kod silinir
Ana sayfanın göğünde bir kenar gezinmesi vardı: imleç ekranın kenar bandına girdikçe bakış o yöne dönüyordu. İlk sürüm saniyede 28 derece döndürüyordu, «çok hızlı» bildirimi geldi ve dört kat yavaşlatıldı. Sonra jestin tamamı iptal edildi. İptalle birlikte kamera yalpası da gitti, çünkü onun tek sürücüsü gezinme hızıydı — sürücüsü kalmayan kod ölü koddur. Nöbetçisi silinmedi, bir yokluk nöbetçisine çevrildi ve ters yönü de ölçüyor: kenarda sürüklenme kalmamalı, ama imleç paralaksı hâlâ yaşamalı.
Ölçüm bir fikri uygulandıktan sonra da reddedebilir
Gökteki yıldızları tek tek çizmek yerine önceden hazırlanmış bir doku atlasına geçmek mantıklı görünüyordu. Atlas yazıldı ve ölçüldü: 310,3 milisaniyeye karşı 311,0 milisaniye. Kazanç sıfır. Sebebini profil söyledi — maliyet yıldızlarda değil, sisin gürültü fonksiyonundaydı. Kod silindi.
Aynı turda yumuşak kaydırma kütüphanesi de emekli oldu. Gerekçesi yalnız boyut değildi: proje dokunmatik cihaz ayrımını on dört ayrı yerde kullanıyordu ve o kütüphane listede yoktu; kayıtlı bilinçli bir karar da bulunamadı. Satıcı paketi 51,1 kilobayttan 33,5 kilobayta indi ve masaüstü kaydırması tarayıcının kendisine kaldı.
Uygulanmadan elenen iki fikir
Yöntem sayfası için bir zirve sahnesi planlanmıştı: ziyaretçi sayfanın nöbetçilerinden birini kasten bozsun ve sonucu görsün. Fikir uygulamadan önce elendi, çünkü bu sayfanın etik çekirdeği ihlalin isteğe bağlı olması. İstenmemiş ve sürekli bir bozuk durum, erişilebilirlik ölçütlerinin açıkça karşı olduğu bir şeydir.
İkinci fikir uygulandı ve geri alındı: imza sahnesinin makine okumasını sayfanın tamamına yaymak. Kuruldu, gösterildi, reddedildi — yerleşim okunabilirliği bozuyordu. Geri alma bir başarısızlık kaydı değil, bir tur kaydıdır; sahne sonraki denemede bir atlas plakasına dönüştü.
Komşusunu kıran nöbetçi de silinir
Silinenler yalnız efektler değil. Bir performans nöbetçisi yazıldı, doğru ölçüyordu ve kaldırıldı: işlemciyi dört kat yavaşlatarak koştuğu için hem kendi hükmünü makinenin o anki yüküne bağlıyor, hem de komşu bir nöbetçiyi kırıyordu. Komşu altı koşumda yeşilken, yeni nöbetçinin bulunduğu iki koşumda kırmızı yandı ve korelasyon birebir kontrol edildi. Başka bir nöbetçiyi kıran nöbetçi net zarardır; kazanç karar defterinde ölçülü duruyor, kod durmuyor.
Three.js silinmedi, budandı
Karşı örnek de kayda geçiyor, çünkü asıl kural burada görünüyor. Ana sayfanın üç boyutlu dünyası pahalı bir bağımlılık istiyordu ve o bağımlılık alındı — ama olduğu gibi değil. Kütüphane yalnız kullanılan modüllere budandı ve sıkıştırılmış hâli bir bütçe tavanının altında kilitlendi — tavanı aşarsa doğrulama süiti kırmızı yanıyor. Yalnız ana sayfaya iniyor, o da sayfa yüklendikten ve iş parçacığı boşaldıktan sonra. Hareket azaltma tercihinde, az bellekli cihazda ve veri tasarrufunda hiç inmiyor.
Yani liste bir efekt karşıtlığı değil. Silinenlerin ortak özelliği, bedelinin karşılığını ölçümde bulamamasıydı. Kalanların ortak özelliği ise bedelini ödemesi.
En güçlü efekt, kaldırdığımız oldu.