Vuruş İşlemenin Durumu

Yazılım mühendisimiz, ekibin vuruş işleme netliğini ve doğruluğunu nasıl geliştirdiğini anlatıyor.

Merhaba, ben Kevin Lee. VALORANT'ın Oyun Sistemleri Ekibi'nde yazılım mühendisi olarak çalışıyorum. Ekibimiz VALORANT'ın oynanışıyla ilgili hareket, savaş ve girdi gibi birçok temel sistemin geliştirilmesini sağladı. Bu yazıda FPS oyunları için olmazsa olmaz bir sistemden bahsedeceğiz: vuruş işleme.

VALORANT gibi bir oyunda, galibiyet ve yenilgi arasındaki fark tek bir kafadan vuruşla belirlenebildiği için vuruş işleme oyundaki en önemli sistemlerden biri haline geliyor. Geliştiriciler olarak amacımız, bir oyuncu ateş ettiğinde atışın sonucunun net olması, mantıklı hissettirmesi ve en önemlisi de doğru olması.

Oyuncular bazen vuruş işlemenin düzgün çalışmıyor gibi göründüğü klipler paylaşıyor. Bize iletilen tüm bu durumları ciddiye alıyoruz ve videoları kare kare izleyerek sistemin beklendiği gibi çalıştığından emin oluyoruz.

Bununla birlikte, VALORANT'taki vuruş işleme sisteminin şu anda gayet iyi bir durumda olduğunu düşünüyoruz. Evet, hâlâ bazı nadir durumlarda sorun yaşanabiliyor ama tüm bu örnekleri çok ciddiye alıyoruz. Sürekli olarak bütün sistemlerimizin kalitesini ve netliğini arttırmanın yollarını arıyoruz.

DOĞRULUK VE NETLİK

0.50 Beta Yaması'nda, vuruş işlemeyle ilgili şikâyetlerin çok arttığını fark ettik. Oyuncu raporlarını, videoları ve uzun süreli dahili testleri inceledikten sonra vuruş işlemede sorun olan birkaç uç durum keşfettik. Fakat bunların hiçbiri aldığımız şikâyet sayısını açıklayacak kadar ciddi değildi. Daha yakından incelediğimizde, bize iletilen kliplerin büyük bir çoğunluğunda doğruluk değil, netlik sorunu bulunduğunu fark ettik. Atışlar doğru bir biçimde işleniyor ama atışın meydana getirdiği görsel geribildirim oyuncuyu yanıltıyordu. Bu, doğruluk ve netlik arasındaki büyük farkı güzel bir biçimde anlatıyor.

Her ikisi de atışların sağladığı "hissi" sağlamak için önemli olsa da:

  • Doğruluk, bir atışın sonucunun yanlış belirlenmesiyle ilgilidir (örneğin, kafaya çarpan bir mermi vücut atışı olarak işleniyorsa veya rakip oyuncular istemcide sunucuya göre farklı görünüyorsa).
  • Netlik, bir atışın nereye gittiğini anlamanın zorluğuyla ilgilidir (örneğin, mermi omza çarpıyor ama görsel geribildirimde kafaya çarpmış gibi görünüyor).
  • Doğrulukla ilgili sorunlar, netlikle ilgili olanlardan çok daha kötüdür.

Bu yazıda sistemin nasıl çalıştığını biraz anlatarak oyuncuların kendi oyunlarına baktıklarında atış yaptıktan sonra ekranda ne olduğunu anlayabilmelerini istiyoruz. Sistemin yüksek seviyede nasıl çalıştığıyla başlayacağız ve ateş tuşuna basılan andan merminin kafaya çarpmasına kadar geçen sürede ne olduğunu açıklayacağız.

Daha detaylı bir teknik inceleme isteyenler Riot Tech Blog'da bulunan VALORANT'ın ağ programlamasıyla ilgili bu makaleye göz atabilir.

Ayrıca "yanlış vuruş işleme" şikâyetlerinde sık sık karşılaştığımız bazı durumları da inceleyerek neler olduğunu ve bu durumlarda netliği iyileştirmek için neler yaptığımızı anlatacağız.

TIKLAMADAN KAFADAN VURUŞA DOĞRU

Bir atış yapıldığında neler olduğunu daha detaylıca konuşmadan önce, oyunun gerçekleşen olayları nasıl simüle ettiğini anlamamız çok önemli. VALORANT'ın oynanışı iki defa simüle ediliyor: Bir kere sunucuda (simülasyonun nasıl ilerleyeceğinin kararını verir), bir kere de istemcide (sunucunun sonuçlarını tahmin ederek oyunun daha hassas hissettirmesini sağlar).

Oyun simülasyonu, tüm oyuncuların konumları, havada uçuşan yetenekler ve savaş alanındaki tüm sisler gibi oyunun dünyasını oluşturan her şeyi içerir. Her karede oyun, simülasyonunun bir anlık görüntüsünü alır ve bu karenin görüntüsünü işleyerek ekranınıza iletir. Sunucu da bunu kendi tarafındaki tüm kareler için yapar (izleyen kimse olmadığı için görüntü işleme kısmını atlar).

Peki, diyelim düşmanlardan biri kafasını uzattı ve etrafa bakmak istiyor. Siz de muhteşem nişangâh yerleşiminizle anında kafasını hedef aldınız ve sol fare düğmesine bastınız. Sonra ne oluyor?

hit_reg_flow.jpg

Bir tuşa bastığınız anda, bu bilgi girdi sistemimize gönderilir (donanım ve işletim sistemine bağlı ufak bir gecikme olabilir). Girdi sistemi, oyundaki her kare için bir önceki kareden sonra gelen tüm komutları işler. Bir atış yaptığınızda o "atış" girdisi, atışın simülasyonun hangi karesinde gerçekleştiğini gösteren bir zaman belirteciyle birlikte sunucuya gönderilir.

Bu zaman belirtecinin, oyun girdi bilgisini aldığı anda ekranınızda görüntülenen kareye göre belirlendiğini unutmayın. Bunun ardından yaptığınız atış iki farklı simülasyonda belirir: istemcide ve sunucuda.

Önce istemciyle, yani yerel makinenizle başlayalım. Atış bilgisi sunucuya gönderilir gönderilmez istemci, atışın namlu ateşini ve atış izini görüntülemeye başlar. Bu, en erken atış girdinizden bir sonraki karede gerçekleşebilir çünkü oyun yeni bir kareyi ekranınızda görüntü olarak işlemek için süreye ihtiyaç duyar. Bu da şu anlama geliyor: Atışın işlendiği kareyle atış izinin görüntülendiği kare aynı DEĞİL. Aralarında en az bir karelik bir fark var.

Bu sebeple atışın netliğinde bazen hatalar meydana gelebiliyor. Bu uyumsuzluğu çözmenin en kolay yolu mermiye gecikme eklemek. Fakat VALORANT'ta girdi gecikmesini minimumda tutmak istediğimiz için mermiye gecikme ekleyemeyiz. İstemci, ekranda vuruşun gerçekleştiğini göstermeden önce sunucudan haber bekler. Tüm kullanıcılara tutarlı bir deneyim sunmak ve hile kullananların istemcileri hack'leyerek yanlış atış sonuçları göstermesini engellemek için atış sonuçları yalnızca sunucu tarafında teyit edilir.

Bu esnada, sunucu istemciden atış yapıldığına dair bir ileti alır. İnternet gecikmesi sebebiyle atıştan sonra bir süre geçmiş olur. Atışın, oyuncuya gösterilen simülasyonla aynı şekilde gerçekleşmesini sağlamak için sunucu, simülasyonu iletilen zaman belirtecine uygun şekilde geri sarar ve ardından vuruş işlemeyi değerlendirir. Bunu yaparken oyuncuların konumlarını ve animasyon pozlarını da geriye sarar. Ardından atışın sonucunu istemciye geri iletir. Örnek olarak, diyelim ki bir kafadan vuruş oldu.

İstemci, sunucudan atışın sonucu bildiren bir ileti alır. Sonrasında uygun görsel efekti ve sesi oynatır. Yani örneğimize göre kafadan vuruş görsel efekti ve sesini oynatır. İstemcinin, sunucudan gelecek atış sonucunu beklemesi gerektiği için atış izi ve vuruş efekti arasında, bağlantınızın gidiş-geliş süresi artı ufak bir işlem süresine eşit miktarda bir gecikme yaşanır (örn. 40 ms sunucu bağlantısı = atış izi ve vuruş efekti arasında 80 ms gecikme). Daha yüksek gecikme oranlarında atış izi ve vuruş efekti arasındaki gecikme gözle görülebilir seviyeye gelir.

Bu, netlik açısından sürekli olarak iyileştirmeye çalıştığımız bir durum.

VAKA İNCELEMESİ 1: Hareketli hedefleri vurma

Case_Study_1.gif

Vuruş işlemeyle ilgili aldığımız birçok şikâyette, atış yapılan hedefin koşmakta olduğunu görüyoruz. Bir atış, koşmakta olan bir hedefi başarıyla vurduğunda görsel olarak neler olduğuna daha yakından bakalım. Oyuncunun, koşmakta olan diğer oyuncuyu atışıyla kafadan vurduğunu görüyoruz. Bu örneği daha kolay anlatabilmek için istemci 60 FPS'de çalışıyor olsun. Atış izi çıkmadan önceki karede nişangâhın düşmanın kafasının üzerinde olduğunu görüyoruz.

case-study-1_frame-1.jpgcase-study-1_frame-2.jpg

Fakat atış izinin çıktığı karede, durum böyle değil.

case_study_1_part_2.gif

İkinci klipte de benzer bir durum var fakat oyuncu atışı ucu ucuna ıskalıyor. Videoya kare kare baktığımızda bunun tam tersinin olduğunu görüyoruz: Oyuncunun nişangâhı, atış izinden önceki karede düşmanın tam kafasında değil. Atış izinin çıktığı karede tam kafaya geliyor. İlk bakışta atış izinin çıktığı kareye bakıp, "İşte mis gibi kafadan vurmuş!" diyebilirsiniz. Ancak videoları incelerken, atışın tam olarak ne zaman yapıldığını anlayabilmek için atış izinden önceki kareye bakmamız gerekiyor.

case-study-1_part2_frame-1.jpgcase-study-1_part2_frame-2.jpg
case-study-1_part2_no-hit-vfx.jpg

Atışın nereye çarptığını gösteren örneğe geri dönelim ve atış görsel efektinin görüntülendiği kareye bakalım. İnternet gecikmesi sebebiyle oyuncunun mevcut konumuyla vuruş görsel efektinin konumu arasında gözle görülür bir fark var. Atışınızın sonucunun ne olduğunu anlamaya çalışırken bu kafa karışıklığı yaratabilir. Çünkü büyük ihtimalle düşmanın mevcut konumuna odaklanıyor olacaksınız, atış yapıldığındaki konumuna değil. Bu aynı zamanda çömelme ve yan yan yürüme durumlarında da kafa karışıklığına sebep olabiliyor (bu durumlara Vaka İncelemesi 2'de göz atacağız).

case-study-1_part2_frame-where-hit-vfx-rendered.jpg

Bu vaka incelemesinde, mevcut vuruş işleme sisteminde netlik konusunda eksiklik olduğu görülüyor. İdeal senaryoda, ekranda olup biteni net bir şekilde anlayabilmek için tüm bu arka plan bilgilerini okumanıza gerek kalmamalı. Geliştiriciler olarak bu durumun farkındayız ve sürekli netliği arttırmanın yöntemlerini arıyoruz.

VAKA İNCELEMESİ 2: Atış efektinden sonra çömelme

Diyelim ki uzun menzilli bir çatışmaya girdiniz. Sonradan pişman olacak şekilde sol fare tuşunu basılı tuttunuz ve silahınızla mermi yağdırdınız. Bu mermilerden en az biri kafaya isabet edecek, değil mi? Ama durumun böyle olmadığını, Vandal'la 3 adet gövde atışı yaparak 117 hasar verdiğinizi ve karşılığında kafanıza bir mermi yediğinizi gördünüz.

Oyundan sonra sinirli bir biçimde oyunun videosunu açtınız. Vuruş işlemenin düzgün çalışmadığından eminsiniz. Rakip oyuncunun, atışlarınızdan sakınmak için sürekli olarak çömelip kalktığını görüyorsunuz. Üstüne üstlük oyuncu tam çömelirken kafasının üzerinde bir vuruş görsel efekti çıkıyor. Ama çatışma raporunda yalnızca gövdeden vuruş olduğu yazıyordu! Hayırdır??

Reddit'te bu varsayımla ilgili "Headshots not registering when a player crouches" (Oyuncu çömelirken kafadan vuruşlar doğru işlenmiyor) isimli başlığa göz atabilirsiniz.

Ekibimiz vuruş işlemenin düzgün çalışmama şikâyetlerini incelerken, yanlış vuruş işleme gibi görünen durumların birçoğunun buna benzer olduğunu fark etti. Fakat aslında vuruş işleme düzgün çalışıyor. Atış tuşuna bastığınızda atışlar hedeflediğiniz yere gidiyor (saçılma ve hareket hatalarını saymazsak) ve sunucuda doğru bir şekilde işleniyor.

Ancak birkaç farklı sebepten dolayı bu örnekte olduğu gibi görsel olarak yanıltıcı olabiliyor:

  1. İnternet gecikmesinden dolayı vuruş görsel efektinin gecikmes
  2. Vuruş görsel efektinin orijinal atış noktasında gösterilmesi
  3. Hedefteki oyuncunun hareket etmesi (veya genellikle çömelmesi)
Case_Study_2.gif

Başka bir örnek vermek gerekirse, diyelim bir oyuncunun 50 ping'i var. Atışıyla düşman oyuncuyu omzundan vuruyor. Sunucunun bu vuruşu teyit etmesini beklememiz gerektiği için, vuruş görsel efekti vücudun vurulan konumunda belirmeden önce 100 ms geçiyor. Fakat geçen bu 100 ms sürede rakip oyuncu çömelmeye başlıyor ve karakterin kafası henüz yeni beliren vuruş görsel efektinin tam olarak arkasına geçiyor. Uzun menzilli savaşlarda ve çatışmanın tam ortasındayken gövdeden yapılan bir vuruşun görsel efekti, kafadan yapılan vuruşun görsel efektiyle karıştırılabiliyor.

case-study-2_cursor-on-body.jpg case-study-2_hit-VFX-on-body-correctly.jpg case-study-2_player-crouches-into-vfx.jpg

Bu durum betadaki 0.50 Yaması'nda kan efektlerini yanlışlıkla herkes için kapattığımızda çok kötü bir hal aldı. Kıvılcım efektlerimiz, kafadan ve gövdeden vuruşların görsel efektlerinin ayırt edilmesinde çok daha az netliğe sahipti. Gövdeden vuruşları ve kafadan vuruşları ayırt etmek için farklı görsel efektler en başından beri oyunda bulunuyor ama bunun savaş esnasında her zaman kolaylıkla ayırt edilemediğini fark ettik.

Bu, vuruş işleme netliğinin sorunu ve bunu iyileştirmenin yöntemlerini sürekli arıyoruz. Denemekte olduğumuz yöntemlerden biri, vuruş görsel efektini karakter üzerinde vuruşun gerçekleştiği vücut parçasına bağlayarak yüksek gecikmede bile daha fazla netlik sağlayabilmek.

Mevcut olan kansız kafadan vuruş görsel efekti ve gövdeden vuruş görsel efektinin karşılaştırması:

headshot-VFX.jpgbody-shot-VFX.jpg

PLANLANAN NETLİK İYİLEŞTİRMELERİ

İki vaka incelemesinde de mevcut vuruş doğrulama görsel efektimizin yeterli olmadığını görebiliyoruz. Gerçekleştirmeyi düşündüğümüz değişikliklerden biri de kan ve kıvılcım efektlerinin, vücudun neresinden vurulduğuna göre ve hareket ettikçe karakteri takip edecek şekilde karakterin mevcut pozisyonu üzerinde belirmesi. Bu, 2. vaka incelemesinde gördüğümüz gibi çömelen düşmanların olduğu durumlarda netliği büyük ölçüde arttırıyor çünkü görsel efekt de vücudun kısımlarıyla birlikte hareket ediyor.

Bu çözümün eksik kaldığı yön ise, vuruş doğrulama görsel efektinin de bağlı olduğu karakterle birlikte herhangi bir siperin arkasına geçebilmesi. 100 ms ping'e sahip bir oyuncunun köşeden ufak ufak bakan bir oyuncuya ateş ettiğini düşünün. Eğer atış düşmana çarparsa ve düşman, sunucudan vuruş teyidi gelmeden önce anında geri çekilirse, ateş eden oyuncu belirdiğinde vuruş doğrulama efektini göremeyebilir.

Bu soruna karşılık olarak, bir kısmı karakteri takip eden bir kısmı da istemci simülasyonuna göre anında vuruş konumunda beliren birden fazla parçacık efekti eklemeyi düşündük. Fakat bu, istemcinin ve sunucunun atışın sonucu hakkında ortak karara varamadığı durumlarda kafa karıştırıcı olabilir: Efektlerin neyin temsil ettiği çok açık olmalı ki bir atışın sonucunu anlamak kolay olsun.

Bu konu ve diğer netlik iyileştirmeleri üzerine çalışmaya devam ediyoruz. Yakın gelecekteki bir yamada yeni netlik iyileştirmelerini sizinle paylaşabileceğimizi umuyoruz.

VİDEO GÖNDERMEYE DEVAM EDİN

Umarız bu yazı VALORANT'taki vuruş işleme sisteminin nasıl çalıştığını ve atışların sonuçlarının nasıl belirlendiğini anlamanıza yardımcı olabilmiştir. Lütfen vuruş işlemenin düzgün çalışmadığını düşündüğünüz durumların videolarını bize göndermeye devam edin. Elimizden gelen en iyi şekilde hepsini incelemeye çalışıyoruz.

Şu anda genel olarak bir sorun bulunmasa da videolar gerçekleşen vuruş işleme doğruluğu hatalarını daha çabuk fark etmemizi sağlıyor. (Çok fazla oy almış bir Reddit gönderisinde "vuruş işleme" kelimelerini her gördüğümüzde tansiyonumuz yükseliyor.)

Reddit üzerinde bulunan ve vuruş işleme doğruluğu hatası gerçekleşen örnek bir video..