# Değişken Replikasyonu Nedir

**Değişken Replikasyonu**, Unreal Engine'de sunucu ve istemciler arasında veri senkronizasyonu sağlayan bir mekanizmadır. Sunucuda bir değişkenin değeri değiştiğinde, bu değişiklik zamanla tüm ilgili istemcilere iletilir ve böylece oyun dünyasının tutarlı bir görüntüsü sağlanır.

Değişken replikasyonu, özellikle çok oyunculu oyunlarda oyun dünyasındaki nesnelerin durumunun güncel kalmasını sağlar. Ancak bu süreç, anında gerçekleşmez; ağ koşulları ve öncelikler göz önüne alınarak optimize edilmiş bir şekilde gerçekleştirilir.

***

#### **Değişken Replikasyonunun Temelleri**

* **"Eventually" (Nihayetinde):**\
  Değişken replikasyonu, verinin bir istemciye ulaşmasını garanti eder, ancak bunun ne zaman gerçekleşeceği ağın durumuna ve replikasyon kurallarına bağlıdır. Bu, değişikliklerin zaman içinde istemcilere iletilmesi anlamına gelir ve işlemler öncelik sırasına göre optimize edilir.

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2FUcqblvs0gZWzYosBqeeH%2Fimage.png?alt=media&#x26;token=cefb6941-f493-4841-b0ec-134de61d486b" alt=""><figcaption></figcaption></figure>

* **İlgililik (Relevancy):**\
  Eğer bir aktör, oyuncunun ilgililik alanı dışında (örneğin, çok uzakta) ise, replikasyon gerçekleşmez. Ancak oyuncu aktöre yeniden yaklaştığında, aktörle ilgili güncellenmiş değişken değerleri istemciye iletilir. Bu, ağ bant genişliğinin gereksiz yere harcanmasını önler.

{% tabs %}
{% tab title="Relevant Değil" %}

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2F5fD4mAz1kLCimAXWAMm4%2Fimage.png?alt=media&#x26;token=402ba8dc-943f-49f6-b1ce-a57685c487c6" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Relevant" %}

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2F5GMA8Ns3QzmNMB1GtJZO%2Fimage.png?alt=media&#x26;token=bc128ed2-c088-4474-a67d-aa84be6df911" alt=""><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

* **Son Güncellenmiş Değer:**\
  Sunucu, bir değişkeni her karede güncelleyebilir, ancak istemciler yalnızca en son değeri alır. Aradaki tüm değerler gönderilmez. Bu, bant genişliğini koruyarak performansı artırır.

***

#### **Değişken Replikasyonu Nasıl Aktif Edilir?**

* **Blueprint'te:**\
  Bir değişkeni replikasyonlu hale getirmek için **Replicated** özelliğini aktif etmeniz yeterlidir. Sunucuda yapılan değişiklikler otomatik olarak istemcilere senkronize edilir.

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2FJbhp1DHJz8JJY7wVstbY%2Fimage.png?alt=media&#x26;token=b25f0231-89e3-49be-b629-557db6123dff" alt=""><figcaption></figcaption></figure>

* **C++'ta:**\
  C++ projelerinde, replikasyonu etkinleştirmek için **GetLifetimeReplicatedProps** işlevini tanımlamanız gerekir. Bu işlevde, hangi özelliklerin replikasyona tabi olacağını ve bu replikasyonun hangi koşullarda yapılacağını belirtirsiniz.

  Örneğin;

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2F2m2J8DA8zyWRlOfrPCHz%2Fimage.png?alt=media&#x26;token=350e4885-7fe2-450a-b984-0685acf303a8" alt=""><figcaption></figcaption></figure>

**Replikasyon koşulları da belirlenebilir, örneğin;**

* Yalnızca sahibi olan istemciye replikasyon.

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2FesS94as0B3bBe2dMk8kd%2Fimage.png?alt=media&#x26;token=c01b113f-fcfc-4e7a-984e-a58f76400fe4" alt="" width="563"><figcaption></figcaption></figure>

* Sahip olmayan istemciler için replikasyon.

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2F0kSAsg0VDbDTYssSmLKA%2Fimage.png?alt=media&#x26;token=498078ef-d85a-4376-9a48-25ac3537cce0" alt="" width="563"><figcaption></figcaption></figure>

* Oyun başlangıcında ayarlanıp, oyun sırasında değişmeyen değişkenler.

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2FZElUDtaRsBsgbKKZIQNt%2Fimage.png?alt=media&#x26;token=5c32b1da-4a14-48c6-8d8d-939accd2838d" alt="" width="563"><figcaption></figcaption></figure>

***

#### **RepNotify Kullanımı**

Bir değişkenin replikasyonu sırasında belirli bir işlev çalıştırmak için **RepNotify** kullanılabilir:

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2F4uDme5p4BAYAlmvMUwPv%2Fimage.png?alt=media&#x26;token=c7e90fac-4e53-40d2-844c-c99f32b426f4" alt=""><figcaption></figcaption></figure>

* **Blueprint'te:**\
  RepNotify özelliği aktif edildiğinde, sunucuda değişkenin değeri değiştiğinde otomatik olarak ilişkilendirilmiş işlev çalıştırılır.

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2FoZYr7dP0guqzpft7s9Gp%2Fimage.png?alt=media&#x26;token=46d0d9ac-88ca-41d9-b584-3a022bfd54ef" alt=""><figcaption></figcaption></figure>

* **C++'ta:**\
  C++ için, RepNotify işlevinin istemcide ve sunucuda çalışmasını istiyorsanız, değişkenin değeri güncellendiğinde bu işlevi manuel olarak çağırmanız gerekir.

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2FyoRsFGKJo1tCUWjHtm0w%2Fimage.png?alt=media&#x26;token=8cb0b231-e861-46a0-b947-5d36e76855f5" alt=""><figcaption></figcaption></figure>

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2FbTpgjc4FLPoAueFD6BQb%2Fimage.png?alt=media&#x26;token=c1049805-1b06-4b14-b89a-b812267ebe80" alt=""><figcaption></figcaption></figure>

***

#### **Performans ve Optimizasyon**

* **Update Frequency (Güncelleme Sıklığı):**\
  Replikasyon sistemi, aktörlerin güncelleme sıklığına ve ağ bant genişliği limitlerine uygun şekilde çalışır. Önemli olmayan veriler daha düşük bir sıklıkta replikasyona tabi tutulabilir.
* **Bandwidth Optimization (Bant Genişliği Optimizasyonu):**\
  Gereksiz veri iletimini önlemek için yalnızca gerekli veriler aktarılır. Bu, çok oyunculu oyunların performansını artırır ve oyuncular için akıcı bir deneyim sunar.

<figure><img src="https://499018633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZiZeirBAvbtaBiMPpunl%2Fuploads%2FWkdl8P7UUVeC0O81BzPe%2Fimage.png?alt=media&#x26;token=5521a876-e693-4bc9-a21c-9b0bad3b00cd" alt=""><figcaption></figcaption></figure>
