Gönderen Konu: Multiplayergame Server/Client Synchronization  (Okunma sayısı 10333 defa)

Multiplayergame Server/Client Synchronization

« : 10.11.2010 13:10:23 »
Hızlı düğmeleri aç

macir

İleti: 4

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
Selamlar;

ınternette uzun araştırmalar sonucunda konuyla ilgili bana yardımcı olabilecek arkadaşların bu forumda olabileceğini düşündüm.

2 senedir vb6 da 2d online bir futbol oyunu yazıyorum. En başlarda multiplayer işini en son yaparım diyerek baya bir ilerledim. %60 a gelince belki işin içinden çıkamam oyun o yüzden kalır düşüncesiyle multiplayerı test etmeye başladım ve gerçekten de çıkamadım.
:(
Basit olarak clientlar birbirlerine futbolcuların ve topun gidecekleri xyleri gönderiyordu. Tabii arada bir gecikme olduğu için, clientlar rakiplerinin yeni hamlelerini bir süre sonra farkediyordu. Ve iki clientta da aynı görüntü oluşmuyordu.

Bunu önlemek içi bir server yazılımı hazırladım. Clientlardan sadece basılan tuşları alıp servera gönderdim. Serverda oyunu oynattıktan sonra clientlara futbolcuların ve topun xylerini gönderdim. Bu sefer her iki clientta da aynı görüntü oluşur gibi oldu. Ama asıl sıkıntı, client klavyede örneğin sağ tuşa bastığında futbolcunun anında değilde biraz daha sonra ilerlemesi oldu. Bu da oynanabilirliği düşürdüğü için vazgeçtim.

Daha önce skatein açtığı konuyu incelediğimde aklımda yeni bişeyler şekillendi.
Oyunu max 2 kişi oynayacağı için servera gerek yok. clientlar birbirlerine veri gönderecek.

1)ılk oyun başlarken time-a.nist.gov dan iki clientda saati alacaklar. Bu şekilde saatlerimizi ayarlayalım olayı gerçekleşecek.

2)Sonra ilk client futbolcuların ve topun o anda olduğu xy, hızları ve gideceği x ve yleri bir stringe yazacak ve başına saati ekleyecek.Bunu karşıya gönderecek.

3)ıkinci Client bu veriyi aldığında kendi saatiyle gelen paketteki saati karşılaştıracak.Aradaki gecikmeyi alıp futbolcuların gitmesi gereken yerden şuanki yerini çıkarıp bir futbolcunun katedeceği toplam mesafeyi bulacak. Mesafeyi hıza bölüp 1milisaniyede ne kadar hareket eder bulacak. ve bunu gecikme zamanıyla çarptığında paket gelene kadar futbolcu ne kadarlık bir hareket etmiş hesaplayıp yerini değiştirecek.

Bu mantık doğrumudur veya daha kullanışlı bir yol bulabilir miyim daha önce bu konuda kod yazan arkadaşlara danışmak istedim.

Teşekkürler:)

Multiplayergame Server/Client Synchronization

« Yanıtla #1 : 10.11.2010 13:30:21 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
bence mantığın doğru, ancak timer'ı time-a.nist.gov gibi bir yerden de alsan unutmaman gereken birşey var. iki farklı client, iki farklı internet connection'ı ya da anlık hız değişimleri yüzünden timer'ı alırken ufak da olsa (~100 milisaniye) timerları aralarında fark oluşabilir. bunu önlemenin çok da basit bir yolu yok, paketlerin ne kadar delayle elimize ulaştığını çok kolay ölçemiyoruz.
 
aslında bence time-a.nist.gov kullanmana gerek yok. 2 client da olsa her zaman bir server'ın olsun, gerekirse clientlardan biri server olabilsin. tüm clientlar servera birkaç saniye boyunca test paketleri gönderip alsınlar ve gönderdikleri paketlerin geri gelme sürelerini hesaplasınlar ve diyelim ki 50 kere paket gönderip aldık, bu paketlerin geri dönme süresinin ortalamasını hesaplayıp, bu değeri ikiye böldüğümüzde yaklaşık olarak server/client arası iletişimin latency değeri ortaya çıkmış oluyor. ancak bununla da kalmayıp bundan sonra gönderilen her pakette bu ortalama değişirse uzun vadede oluşabilecek hızlanma / yavaşlamalara göre latency dinamik olarak hesaplanmaya devam edecektir.
 
elimizde bir latency değeri olduğu durumda ise senin yazmış olduğun geri kalan mantık aynen işleyecektir.
 
aklına gelecek diğer soruları da paylaşmaktan çekinme. çok faydalı tartışmalar çıkıyor ortaya ve hepimiz birşeyler öğreniyoruz birbirimizin yorumlarından.
 
kolay gelsin.

Multiplayergame Server/Client Synchronization

« Yanıtla #2 : 10.11.2010 14:16:18 »
Hızlı düğmeleri aç

macir

İleti: 4

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
Skate tavsiye için sağol.

Muhtemelen 9 günlük bayram tatilinde dediğimiz gibi yazmış olurum. Bir de kafamı kurcalayan başka konu var.

8 senedir vb6 da yazdığım için dili vb6 seçmiştim. Gerçi son 2 senedir c# ta yazıyorum. Belki vb6 ileride bir problem çıkarır diye bir ara c++ la yazmaya çalıştım ama çok zorlandım. 2d olduğu için bugüne kadar vb6 da sorun çıkmadı. Ama bu çıkmayacağı anlamına gelmiyor.

Hem C++ hem de vb6 bilen birinin galiba yardımcı olması gerekiyor.

Multiplayergame Server/Client Synchronization

« Yanıtla #3 : 11.11.2010 11:05:23 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
bizler sana yardımcı oluruz, problem değil. vb6 artık demode oldu elbette ki ancak hala Windows 7 gibi sistemler destekliyor visual basic runtimelarını. bence Native C++, C++/CLI (eski adıyla Managed C++) ya da C# en iyi seçimler olacaktır. 2d bir oyun yaptığına göre SDL library'si ve SDL'in extension librarylerini kullanabilirsin, böylece gerekirse Linux, MacOS gibi platformlara da daha az uğraşla port edebilirsin oyununu. yine de istersen projene VB6'dan da devam edebilirsin. sonuçta yapmaya çalıştığın iş gerçekten zor bir iş ve VB6'ya diğer dillere göre daha çok hakimsen bu dilden devam etmen de doğru karar olabilir. VB6'dan bitmiş bir proje, diğer dillerden yarım kalmış bir projeye göre sonsuz kat daha değerlidir. bitmemiş projelerin değerinin "0" olması dolayısıyla... :)

Multiplayergame Server/Client Synchronization

« Yanıtla #4 : 12.11.2010 15:46:25 »
Hızlı düğmeleri aç

devreci

İleti: 75

Çevrimdışı
  • **
  • Jr. Member
    • Profili Görüntüle
    • http://www.devreci.com
sadece topun xy konumunu gönderirsen olamaz galiba, futbolcuların konumunu da göndermelisin sadece kendi konumunu değil karşıdaki oyuncunun senin ekranındaki konumunuda gönder, bu sayede topun konumunuda hesaba katarak hesaplayabilirsin. ve ayrıca topun hızını futblcuların yönü ve hızını gönderirsen ve bu hızları çalıştırırsan smooth bir görüntü oluşturabilirsin

Multiplayergame Server/Client Synchronization

« Yanıtla #5 : 12.11.2010 22:14:00 »
Hızlı düğmeleri aç

Ragnor

İleti: 901

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://ozanemirhan.blogspot.com
Ufak bi not düşeyim, son zamanlarda linux için visual basic 6 ile bayağı uyumlu çeşitli basic versiyonları yazıldı. Gambas ve Hbasic miydi diğerinin adı, neyse araştırırsanız bulabilirsiniz. VB6 ile uyumlulukları bayağı üst düzeydeymiş diye duymuştum.

Multiplayergame Server/Client Synchronization

« Yanıtla #6 : 14.11.2010 11:20:54 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
@Ragnor: aklımın ucundan geçmemişti VB6'nın linux portu ancak bunca yıl sonunda ve bunca geliştirilmiş uygulamayı düşünürsek çok da mantıksız değil. sadece Win API'a ulaşan uygulamalarda sorun çıkabilir gibi geldi bana. ama sonuçta windows emülasyonu gibi şeyler de vardı linux'ta, bir şekilde çözmüş olabilirler elbette ki.

Multiplayergame Server/Client Synchronization

« Yanıtla #7 : 28.11.2010 22:47:38 »
Hızlı düğmeleri aç

macir

İleti: 4

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
Tekrar selam.
Uzun bayram tatilinde uygulamayı yazıp sonuçları paylaşıcam demiştim. Bir kısmını yazdım fakat deniyemiyorum.
Sebep şudurki; modemden açtığım porta localden bağlanabiliyorum fakat wandan bağlantı kurulmuyor. Modem kaliteli değil. Yeni bir modem almalıyım:)

Multiplayergame Server/Client Synchronization

« Yanıtla #8 : 29.11.2010 11:55:38 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
@macir: eğer kendi localinden açtığın porta dış IP adresinden erişmeye çalışıyorsan bunu zaten yapamazsın. ancak senin haricindeki herkes yapabilir. bunu kendi telefon numaranı arayıp meşgul sesi duymak gibi düşünebilirsin. modeminde sorun yok bence. sen portu açtıktan sonra dış bir IP'den clientı çalıştırırsan o port üzerinden erişebilecektir.

Multiplayergame Server/Client Synchronization

« Yanıtla #9 : 29.11.2010 21:30:45 »
Hızlı düğmeleri aç

macir

İleti: 4

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
@skate:Ama neden meşgul çalsınki:) Aynı anda 2 uygulama aynı portu açıp dinlemeye kalkarsa o olabilir. Benim eski airties modemde gayet iyi çalışıyordu. Açtığım porta 1.client localden, 2.client wandan erişiyordu. 2 bilgisayara gerek kalmadan test edebiliyordum.

Multiplayergame Server/Client Synchronization

« Yanıtla #10 : 30.11.2010 15:06:40 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
@macir: şöyle bir örnekle anlatabilirim demek istediğimi.
 
örnek local PC IPsi: 192.168.1.100
örnek dış IP: 89.106.82.50
örnek başka bir dış IP: 88.74.102.70
 
* ADSL üzerinde NAT/PAT ayarlarından 7000 TCP portunu 192.168.1.100'e address translation yapıyorsun.
* 192.168.1.100 üzerinde 7000 portunda bir TCP listener çalıştırıyorsun.
* 192.168.1.* IP ailesinden ya da 89.106.82.50 IP'sinin arkasındaki herhangi bir makineden 89.106.82.50 IP'sine 7000 portundan TCP bağlantı yapmayı deniyorsun ve başarısız oluyor.
* Başka bir dış IP'den, örneğin 88.74.102.70 IP'sinden 7000 portuna TCP bağlantı atıyorsun ve bu defa doğrudan 192.168.1.100 local IP'li makineye başarıyla bağlantı kurabiliyorsun.
 
Özetle tek bir dış IP söz konusu olduğunda ben sadece local IP'ler üzerinden test yapabildim bu güne kadar. Dış IP'den bir yönlendirme yaptığımda ise test için başka bir dış IP'ye ihtiyaç duydum. Bunun için de evdeysem şirket networkünden bir server'a, şirketteysem evdeki makineme remote atıp bu şekilde testlerimi yaptım. Elbette ki proxy tarzı bir çözüm daha da kolay olabilir.

Multiplayergame Server/Client Synchronization

« Yanıtla #11 : 20.12.2010 18:08:47 »
Hızlı düğmeleri aç

neurosys

İleti: 12

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
Selam,

Konuyla cok ilgili degil ama, bildigim kadariyla local'den, NAT yapılmış dış IP'ye erişildiğinde ne olacağı, router'ın arkaplanda nasıl bir NAT rule tanımladığına bağlı.
Daha dogrusu simdi netten biraz okudugum uzere, local'den dis ip ile icerdeki bir porta erismek icin router'in "Hairpinning" veya "Split Horizon DNS" denen bazi taklalar atmasi gerekiyormus.

Eski modeminde olup da simdi olmamasi bundan kaynaklaniyor olabilir. Networking ayri bir derya hakkaten.

Ayni sorunu yasayan birisine soyle bir cozum sunmuslar:
http://forum.mikrotik.com/viewtopic.php?f=2&t=40038
« Son Düzenleme: 20.12.2010 18:18:51 Gönderen: neurosys »