;
Şimdi Ara

Multiplayer oyunda server-client işleyişi

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
21
Cevap
3
Favori
2.445
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
Öne Çıkar
0 oy
Sayfa: 12
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • Merhabalar,
    Basit bir strateji oyunu (iki kişilik) yapmayı planlıyorum. Girişmeden önce server-client'ı biraz anlamak için bir server-client programı yazdım (XOX oyunu). Server-client kısmı şöyle işliyordu;
    Thread ile oyuna katılan clientlar dinleniyor,
    Hamle sırası olan clienttan gelen cevap halinde, oyundaki değişiklik yapılıyor, oyun bitmemişse clientlara geri dönülüyor (birine sıra sende, oyunun yeni hali şu, diğerine de sıra rakipte, oyunun yeni hali şu şeklinde).
    Sıralı bir oyunda rakip ile aynı anda değişiklik yapmak imkansız olduğu için her iki client'ta tutulan oyun değişkenim aynıydı (oyun değişkeninden kastım, oyundan oyuna değişen ve oyunun oynanılışı ile ilgili herhangi birşey, örneğin kimi oyunlarda harita, XOX oyunu için bu değişken oyun tahtası idi.) Ama sıra ile oynanmayan bir oyunda işler biraz değişiyor. Mesela xox oyunundaki gibi bir sistem yapmış olsam bu oyuna, muhtemelen şu şekilde bir çıkmaza girecektim;

    Client 1 servera haritayı gönderir (örneğin haritada birinci oyuncunun 2 askeri olsun, 2. oyuncunun 1 askeri)
    Client 2 de o sırada yapmış olduğu askerin de eklendiği yeni haritayı gönderir (oyuncu 1: 2 asker, oyuncu 2: 2 asker)
    Ve server'da şuan 2 farklı harita var. Ve böyle bir durumda ne yapacağımı bilmiyorum.

    Dolayısıyla server 2 clienttan aynı anda mesaj almamalı. Ve ilk mesajı aldığı anda o mesajla ilgili işlemi anında yapıp clientlara göndermesi, ardından diğer mesajı işlemesi gerekir. Bu durumda şöyle olur;
    Client 1 servera oyuncu 1'in 2 askeri, oyuncu 2'nin 1 askeri olan haritayı gönderir,
    Server haritayı clientlara gönderir
    Client 2 o sırada 2. askerini yapmış olmasına rağmen, serverdan gelen haritayı kendi haritası ile değiştireceği için, kendisinde tekrardan 1 asker görünür.

    Bu sorunu çözmek için şu şekilde bir yol izlenebilir;
    1-Client, servera haritada bulunan kendi nesnelerini bildirir.
    2-Server her iki clienttan da cevap aldığında clientlara gönderilmesi gereken bilgiyi gönderir, ki örneğim için bu bilgi haritadaki tüm nesneler olacak. Client bu mesajdan, kendi nesneleri dışındaki tüm nesneleri kendi haritasında güncelleyecek.
    Bu yolda da şöyle bir soru çıkıyor karşıma;
    Örneğin 1. oyuncunun bir askeri, 2. oyuncunun bir askerine saldırmak üzere gönderildi ve gerekli mesafeye ulaştı.
    Savaşma işlemi nerede yapılır?
    Server'da? Client 1'de? Client 2'de?

    En mantıklı cevap server gibi geliyor bana.

    Peki her iki clientı etkilemeyen bir işlem nerede yapılır?
    Örneğin, bir oyuncu bir bina yapmak istedi (ve oyunumun işleyişi gereği, age of empires'ın aksine, bina tamamlanana kadar haritada görünmeyecek). Bu binanın yapılması işlemi server tarafından mı takip edilmelidir? (binaların yapılışı her oyunda olduğu gibi süreye bağlı), yoksa client binayı tamamlayınca haritaya ekleyeceği için otomatik olarak servera iletmiş mi olmalıdır?

    Mümkün olduğunca soruları kalın yazmaya çalıştım, ekstra olarak şöyle bir soru sorabilirim;
    Düşündüğüm yolların dışında, bu işte kullanılan yol nedir? (Varsa algoritma ismi olur, işleyişinin anlatımı olur, link olur)
    Düşündüklerimle yapmam ne derece saçma olur? (Var olan yolu kullanmak, ticari amaçlı bir projede kullanılır elbet ama şimdilik kendi yollarımı deneyip ders almayı tercih ederim, tabii denenmeyecek kadar saçma değilse)

    Teşekkürler, kolay gelsin.



    _____________________________
  • Tüm sorularının tek ve basit bir cevabı var. sen işlemleri clientler üzerinde yapmayacaksınki, serverde yapacaksın.Yani yok client1 1 askerim var demiş client2 de olmaz askeri yok demiş .... bu işler böyle yürümez, böyle yaparsan oyun teknolojisine çok kolay müdahale edip hilede yaparlar.Yapman gereken şu; client 1 askermi basmak istiyor, eşyamı almak istiyor, bunları almak için önce serverdan izin alacak yani servere diyecekki bak ben asker basıyorum kontrol et yeterli param var mı gerekli özellikler tamammı, serverde kabul ederse asker basması için gereken süreyi kendi üzerinde işleme koyacak ve süre bitince cliente mesaj yollacayacak artık askerin görünebilir şeklinde askerde görünecek.Yani hayati işlemler clientler üzerinde değil server üzerinde yapılır, server çoğu hesaplamayı yapıp clientlere sonuçları gönderir böylece tüm clientlerde ortak bilgi olur.
    _____________________________
  • quote:

    Orijinalden alıntı: CatchFire

    Tüm sorularının tek ve basit bir cevabı var. sen işlemleri clientler üzerinde yapmayacaksınki, serverde yapacaksın.Yani yok client1 1 askerim var demiş client2 de olmaz askeri yok demiş .... bu işler böyle yürümez, böyle yaparsan oyun teknolojisine çok kolay müdahale edip hilede yaparlar.Yapman gereken şu; client 1 askermi basmak istiyor, eşyamı almak istiyor, bunları almak için önce serverdan izin alacak yani servere diyecekki bak ben asker basıyorum kontrol et yeterli param var mı gerekli özellikler tamammı, serverde kabul ederse asker basması için gereken süreyi kendi üzerinde işleme koyacak ve süre bitince cliente mesaj yollacayacak artık askerin görünebilir şeklinde askerde görünecek.Yani hayati işlemler clientler üzerinde değil server üzerinde yapılır, server çoğu hesaplamayı yapıp clientlere sonuçları gönderir böylece tüm clientlerde ortak bilgi olur.

    Teşekkürler cevap için, şöyle bir soru daha eklesem;
    Server client arası mesajlaşmada StreamWriter, StreamReader (C# için) veya benzeri dosyaya yazma üzerinden işleyen yöntemler dışında kullanılan birşey var mıdır?
    Neden soruyorum, çünkü o yöntemle örneğin haritayı serverdan clienta göndermek istesem şu şekilde bir string hazırlamam gerekecek;
    [NesneTürü(Asker, Bina vs.), Nesne ile ilgili özellikler (Oyuncu1'in askeri, seviye 3 vs.), Pozisyon (x, y)]
    Daha sonra bunu clienttan ayrıştırmam gerekecek ki çok zor olmasa da uğraşmamayı tercih ederim açıkçası.
    Dediim gibi çok yeniyim server-client işine, TcpClient ve listener kullanarak yaptım, mesajlaşmayı da streamreader ve writerları kullanarak yaptım öyle gördüğüm için örneklerde. Kolay gelsin.
    _____________________________




  • mvc olayi burada da var esasinda. model tarafi tamamen serverin isi. oyunun controller ve view. tum mantik islemlerini sunucu yapmali.
    _____________________________
  • quote:

    Orijinalden alıntı: ertanunver

    mvc olayi burada da var esasinda. model tarafi tamamen serverin isi. oyunun controller ve view. tum mantik islemlerini sunucu yapmali.

    Şöyle bir tasarım yapsam;
    Server'da asker;
    Asker
    {
    özellikler vs.

    pozisyon

    id
    }

    Client'da asker;
    view;
    CizilebilirNesne
    {
    nesneturu

    pozisyon
    }

    control;
    KontrolNesnesi
    {
    nesneturu
    pozisyon
    id

    varsa ekstra gerekli özellikler
    }

    Böyle bir tasarımda aklıma takılan birşey var;

    Server'da harita;
    List<Asker> (askerin base'ini belirtmediğim için asker yazdım, asker, bina, doğal kaynak gibi tüm sınıfları bir base sınıfa oturtabilirsem onun türünden bir liste yapmayı planlıyorum)

    Client'da harita;
    Control için;
    List<KontrolNesnesi>

    Server tarafında sabit bir harita değişkeni çalıştırmam mümkünken, client tarafındaki listemin her an değişmesi mümkün. Dolayısıyla serverdan gelen her harita bilgisi ile clientdaki listeyi temizleyip, tüm nesneleri tekrar mı ekleme liyim? Yoksa id'yi kullanıp, var olan objeleri güncelleme, yok olan objeleri silme ve yeni objeleri ekleme yöntemi mi kullanmalıyım? Aslında düşününce 2. daha mantıklı fakat tecrübem olmadığı için her ikisinin de artı eksilerini bilemiyorum.
    _____________________________




  • Hangi platform için yapacağını ve hangi oyun motorunu kullandığını belirtmemişsin yada ben kaçırdım. Mobil için Unity3d kullanarak yapıyorsan Google Play Games Realtime Multiplayer eklentisini kullanabilirsin, kullanışlı, yada MasterServer. Onun dışında Photon, Appwarp, PubNub gibi realtime multiplayer ücretli hizmetler var.

    Dediklerim Unity3d için ama photon, pubnubi appwarp bir çok platform/oyun motoru destekliyor.

    < Bu ileti mini sürüm kullanılarak atıldı >
    _____________________________
  • Server ayrı bir program veya thread olmalıdır. Namı diğer, Dedicated
    Yani sen oyun kurduğunda serveri çalıştıracaksın ve clientin ile kurdugun servere gireceksin.
    Server her bilgi aldığında bilginin zamanı geçtiyse veya bilgi geçersizse işlemeyecek.
    Client sadece komut gönderir. Serverde nesnelerin x,y,z kordinatlarını vx,vy,vx hızlarını gönderir. Yani bütün fiziksel ve mantıksal ola serverda.Server kesinlikle bir RENDER kulanmaz sayılarla ilgilenir.
    Clientlerde serverden alınan bilgiyi işler, görüntü oluşturur.

    edit: catcfire cevaplamış



    < Bu mesaj bu kişi tarafından değiştirildi Perceptron -- 12 Temmuz 2014; 11:11:18 >
    _____________________________
  • Yapay Zeka’dan İlgili Konular
    Counter-Strike Server Lütfen
    21 yıl önce açıldı
    wow private server önerisi
    3 yıl önce açıldı
    Daha Fazla Göster
  • quote:

    Orijinalden alıntı: -w K-

    Hangi platform için yapacağını ve hangi oyun motorunu kullandığını belirtmemişsin yada ben kaçırdım. Mobil için Unity3d kullanarak yapıyorsan Google Play Games Realtime Multiplayer eklentisini kullanabilirsin, kullanışlı, yada MasterServer. Onun dışında Photon, Appwarp, PubNub gibi realtime multiplayer ücretli hizmetler var.

    Dediklerim Unity3d için ama photon, pubnubi appwarp bir çok platform/oyun motoru destekliyor.

    Platform PC, oyun motoru kullanmıyorum. Bu yüzden kendi serverımı yazmaya çalışıyorum.

    @.fcan
    Oyunumda hız yok, yalnızca pozisyon var. Serverın komut alma olayını da anladım sanırsam.
    _____________________________
  • Bence bu cok güzel bir soru.
    Eger client sayısı fazla olmayacaksa, server side da daha fazla is yapılabilir.
    Ancak client sayısı fazlalasmaya baslayınca "thick client" adı verilen yol izlenip, server,da yalnızca state bilgisi tutulmalı.
    Haritadaki konum bilgisi tutulduğuna göre, bu konum herkes için ortak olmalı, yani en yavaş client güncellemesini bitirdikten sonra son durum tüm client'lara paylasilmali.
    Age of Empires oynayanlar bilirler, yavas baglantisi olan bir oyuncu yuzunden tum oyun yavas akardi. Sonuc olarak bir sistemin hizi, en yavas parcanin hizina gore belirleniyor, bu da boyle. En azindan RTS icin.
    _____________________________
  • Peki oyunun içine fizik girerse nasıl bir yol izlenmeli sizce? 2 kişilik bir futbol oyunu yapıyorum, biri server biri client olarak bağlanıyor, fizik olayları serverda işlenip pozisyonlar client'e aktarılıyor. ama bu yolu izlediğimde çok fazla lag oluyor ve çözümünü bulamıyorum projeyi dondurmak zorunda kaldım çözüm bulamıyorumç
    _____________________________
  • quote:

    Orijinalden alıntı: Mephalay

    Bence bu cok güzel bir soru.
    Eger client sayısı fazla olmayacaksa, server side da daha fazla is yapılabilir.
    Ancak client sayısı fazlalasmaya baslayınca "thick client" adı verilen yol izlenip, server,da yalnızca state bilgisi tutulmalı.
    Haritadaki konum bilgisi tutulduğuna göre, bu konum herkes için ortak olmalı, yani en yavaş client güncellemesini bitirdikten sonra son durum tüm client'lara paylasilmali.
    Age of Empires oynayanlar bilirler, yavas baglantisi olan bir oyuncu yuzunden tum oyun yavas akardi. Sonuc olarak bir sistemin hizi, en yavas parcanin hizina gore belirleniyor, bu da boyle. En azindan RTS icin.

    Sanırım oyunumun boyutunun ufak olduğunu düşünürsek benim oyunumda yavaşlama sorunu olmaz, çok ufak hafıza yiyecek işlemler yapacak serverım çünkü. En son gecikme sorunu ile ilgili yazan arkadaşa kimse cevap vermemiş sanırım.
    Benim düşünceme göre gecikme iki nedenden kaynaklanabilir;
    1-Server-Client arası bilgi alışverişinin hızı (bağlantı hızı)
    2-Server'da yapılan işlemlerin uzun sürmesi

    Bağlantı hızı ile ilgili sorunu nasıl çözersin bilmiyorum (sanırım şöyle birşey vardı futbol oyununa uygulayabileceğin; gelecek frame'deki pozisyonlar üzerinden işlemi yapıyorsun (client cevap beklemezken, multithreading kullanarak), daha sonra client'a bunu gönderiyorsun. Kısaca şöyle anlatayım;
    Diyelim ki top x,y pozisyonunda ve vx,vy hızı ile gidiyor.
    Şu anda t1 zamanında olalım, server'a bu bilgileri vermiş olayım.
    Server bu bilgiyi aldıktan sonra, topu x+vx, y+vy pozisyonunda varsayıp (bunun gibi tüm nesneleri) fizik işlemlerini gerçekleştirsin.
    t2 anına geldiğimizde client yeni bilgileri gönderdiğinde eğer oyuncu herhangi bir değişiklik yapmadıysa (serverın varsaydığı birşeyin aksini yapmadıysa, ki 22 futbolcunun hızları için bunu kontrol etmek çok ufak bir işlem gücü gerektirir, fizik işlemlerine kıyasla), t2'de server client'a aslında t1'de hesaplamış olduğu ve aslında tahmin ettiği bilgiler üzerinden yaptığı işlemlerin sonucunu gönderir. Eğer oyuncu bir değişiklik yaptıysa, değişikliğin yapıldığı nesneler hariç yine t1'de yapılan işlemlerin sonucu gönderilirken, değişiklik yapılan nesneler için fiziksel işlemler tekrardan yapılarak zamandan ve işlemden kısma yapılabilir.

    Böyle bir yöntemin var olduğundan emin değilim ama sanki bi yerde duymuştum. Üzerinden düşünülüp mantıklı gelirse yapılabilir.
    _____________________________




  • Just Smile kullanıcısına yanıt
    Fizik motoru client'da olmali.
    Diyelim ki kaleci degaj atti. Client1 ' kalecinin degaj atmasi ile ilgili parametreleri gonderdikten sonra, server tum clientlara ayni parametreleri gonderir, her client kendi fizik motorunca goruntuyu isler. Boylece tum clientlarda top ayni yere dusmus olur. Top havadayken her client kendi hareketlerini server'a gondermeye devam edebilir fakat hareketlerin yol acacagi sonuclar yine client'ta hesaplanmali.
    Hesaplama isini servera yikmak lag yapar. Ayrica fizik motoru ciddi CPU kullanan bir motor. Bilmiyorum oyundaki motor ne kadar detayli ama basit bir Android uygulamasinda bile biz ciddi CPU hareketi gormustuk. Server, yalnizca state bilgisini tutup, bu bilgiyi diger client'lara passlamali, en temizi bu.
    _____________________________
  • Mephalay M kullanıcısına yanıt
    oyuncular ayrı ayrı kendi fizik motoruyla hesaplama yaparsa parametreler aynı bile olsa top farklı yere düşer hocam bu konuda yanılıyorsun, deneyebilirsin istersen :) denedim yani dediğin gibi lag sıfıra iniyor o zaman ama birinde gol oluyor birinde top oyunda...
    _____________________________
  • quote:

    Orijinalden alıntı: Just Smile

    oyuncular ayrı ayrı kendi fizik motoruyla hesaplama yaparsa parametreler aynı bile olsa top farklı yere düşer hocam bu konuda yanılıyorsun, deneyebilirsin istersen :) denedim yani dediğin gibi lag sıfıra iniyor o zaman ama birinde gol oluyor birinde top oyunda...

    F = m a formulunde clientler ayni m ve ayni a degerleri ile hesaplama yapinca farkli F nasil bulurlar ? Ayni parametreler ayni metodlardan ayni sonucu donmek zorundalar. Muhtemelen eksik ya da farkli bir parametre vardir gozden kacan.
    _____________________________
  • Mephalay M kullanıcısına yanıt
    Gerçek hayat gibi düşünemezsin farklı cihazlar farklı fps'ler, aynı cihaz bile olsa aynı anda aynı fpsleri vermezler. iki frame arasında F değişmez elbette ama biri 30 fps biri 60 fps diye düşün, birinde tek framede 1mt yol giderken diğerinde 2m yol gidecektir. Gitsin ne olacak diyebilirsin sonuçta durdukları nokta aynı olacaktır diyebilirsin ama eğer yolculuk tamamlanmadan bi çarpışma vs olursa tüm konum ve hareket değişir :)
    _____________________________
  • Just Smile kullanıcısına yanıt
    Client'taki FPS Server'i ilgilendirmez. Bir tanesi carptigini gorecek, oteki gormeyecek yalnizca olay bu.
    _____________________________
  • Mephalay M kullanıcısına yanıt
    Client'taki FPS Serveri ilgilendirmiyor zaten, diğer clientları ilgilendiriyor, fizik motoru çalışan bi sistemde elbet fps etkilidir.

    Edit: ben problemi çözdüm bu arada projeye devam ediyorum hocam, teşekkürler yine de fikirleriniz için deneme yanılmayla buldum doğru yolu :)



    < Bu mesaj bu kişi tarafından değiştirildi Just Smile -- 20 Temmuz 2014; 11:59:52 >
    _____________________________
  • quote:

    Orijinalden alıntı: Just Smile

    Client'taki FPS Serveri ilgilendirmiyor zaten, diğer clientları ilgilendiriyor, fizik motoru çalışan bi sistemde elbet fps etkilidir.

    Edit: ben problemi çözdüm bu arada projeye devam ediyorum hocam, teşekkürler yine de fikirleriniz için deneme yanılmayla buldum doğru yolu :)

    Hocam keşke nasıl çözdüğünüzü anlatsaydınız Başına gelen olursa buradan bakıp çözerdi.
    _____________________________
  • Yazayım hocam :)

    Fizikle ilgili tüm bileşenler yalnızca server'daki nesnelere ekleniyor kodla. Client tarafında fizik motorunu çalıştıracak hiç bir şey yok. Server pozisyon ve dönüş'ü client'e gönderiyor. Lag veya titremeyi önlemek için client, aldığı yeni pozisyona giderken eski pozisyondan yeni pozisyona hareket yumuşatma kullanarak gidiyor, yani 1/15 saniyede(Server'ın pozisyonları gönderme sıklığı) tamamlıyor eski pozisyondan yeni pozisyona olan yolu.

    Peki clientlerin hareketi nasıl sağlanıyor, nasıl kuvvet uygulanıyor fizik motoru clientte çalışmıyorsa? Bunu yapmak için de, client tuşa bastığı zaman server'a örneğin zıplamak istediğini söylüyor, server tarafında clienti zıplatacak kuvvet uygulanıyor, bu sırada pozisyon gönderilmeye devam ettiği için client kendisinin zıpladığını görüyor.

    Fiziğin dışında eşzamanlı yürümesi gereken şeyler (sayaç mesela) için de, server cliente yalnızca bir mesaj gönderiyor ben sayacı başlattım sen de başlat gibi... Tabelaların güncellenmesi, oyunun bitmesi vs olaylar da iki tarafta bağımsız olarak yapılıyor.
    _____________________________




  • quote:

    Orijinalden alıntı: Just Smile

    Yazayım hocam :)

    Fizikle ilgili tüm bileşenler yalnızca server'daki nesnelere ekleniyor kodla. Client tarafında fizik motorunu çalıştıracak hiç bir şey yok. Server pozisyon ve dönüş'ü client'e gönderiyor. Lag veya titremeyi önlemek için client, aldığı yeni pozisyona giderken eski pozisyondan yeni pozisyona hareket yumuşatma kullanarak gidiyor, yani 1/15 saniyede(Server'ın pozisyonları gönderme sıklığı) tamamlıyor eski pozisyondan yeni pozisyona olan yolu.

    Peki clientlerin hareketi nasıl sağlanıyor, nasıl kuvvet uygulanıyor fizik motoru clientte çalışmıyorsa? Bunu yapmak için de, client tuşa bastığı zaman server'a örneğin zıplamak istediğini söylüyor, server tarafında clienti zıplatacak kuvvet uygulanıyor, bu sırada pozisyon gönderilmeye devam ettiği için client kendisinin zıpladığını görüyor.

    Fiziğin dışında eşzamanlı yürümesi gereken şeyler (sayaç mesela) için de, server cliente yalnızca bir mesaj gönderiyor ben sayacı başlattım sen de başlat gibi... Tabelaların güncellenmesi, oyunun bitmesi vs olaylar da iki tarafta bağımsız olarak yapılıyor.

    hocam siz çok bilgili birine benziyorsunuz bu konuda.
    server - client arasında iş bölümü yapma hakkında bilginiz var mı? yani clientlerin belli yerlerde microserver gibi davranması.
    Devasa oyunculu FPS oyunlarda kullanılıyor. Serverlere fazla yük binmesini engellemek için, clientler kısmi server olarak kullanılıyor.
    tabi güvenliğide gayet iyi sağlıyorlar

    < Bu ileti mini sürüm kullanılarak atıldı >
    _____________________________




  • 
Sayfa: 12
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.