Merhaba;
Bir süredir oyuncularımı rahatsız eden client kapanma sorunları hakkında çalışmalar yapıyorum.
Bu sorunların kökeni; herhangi bir client crashı değil, clientin server tarafından yollanan paketleri düzgün bir şekilde yakalayamamasında yatıyor.
Paket yapısında oynama yapılmamış server fileslerde ve daha fazlasında, bu başarısızlık sonrasında client çözümü, kendini
PostQuitMessage(0) kullanarak kapamakta buluyor:
Çözüm her ne kadar ilk bakışta gereksiz görünse de, clientteki paket buffer yapısının bu noktadan sonra bozulduğu ve kendisini hali hazırda düzeltemeyecek yapıda olduğu için, bu çözümü şuanlık en iyi çözüm olarak yorumladım.
Bu çözüme benzer olarak, P2P yoluyla iletişim kuran gameler arasında da herhangi bir tanımlanamayan header bulunduğunda, yani game syserr lerimize UNKNOWN HEADER düştüğünde, gameler çözümü birbiri arasındaki soketlerini kapatmakta buluyor.
Fakat buradaki fark; P2P konusunda yaşanan header tanımsızlığı, en basitinde packet_info.cpp'de tanımlanmayan headerlar ya da büyük paketli buffered paketler sayesınde oluşuyor olmasıdır.
Zaman zaman yaşadığımız P2P kopmaları da tam olarak gamelerimize düşen UNKOWN HEADER syserrlerinden sonra yaşanıyor. Neyseki P2P kopmalarının analizi konusunda çözüm genelde basit. En son yollanan yüksek boyutlu paketleri loglamak ve boyutu indirgemek bu iş için yeterli bir çözüm.
Clientim için yaptığım çalışmalarda, kapanma sorunu yaşayan oyuncular için, serverden teslim aldıkları son paketleri loglayacak bir sistem yazdım.
Bu konuyu açmamdaki amaç, konuyla ilgilenenlerle analizlerimi paylaşıp çözüm için sizlerle bilgi paylaşımı yapmaktır.
Oluşturduğum log sistemindeki amaç, kapanmadan hemen önce servere bilgi gönderilip, oyuncunun soketine son yollanan 10 paketin server tarafında loglanmasındır:
Server tarafında saklanan bazı logları paylaşıyorum:
Sorunu yaşayan son oyuncuların aldığı headerler gösteriyorki, spesifk olarak son yollanan header bu soruna sebep olmuyor. Başka bir deyişle spesifik bir header bu soruna sebep olmuyor, ya da oluyor mu?
Bu gözlemlerden sonra, hatayı clientlere yollanan büyük boyutlu paketlerde aradım. Bu paketlerin en büyüğü 15814 byte ile offline shop sistemimdeki bir yapıydı.
Ve bu boyutun gerçekten sorun yaratacağını düşünmeyerek farklı bir yorum aramaya başladım. Bir şey veya bir şeyler, clientteki paket sequence yapısını sekteye uğratıyor olmalı diye düşündüm. Yani aslında sorun dolaylı olarak gerçekleşiyor gibi görünüyor.
Ekstra olarak, code base'mde herhangi spesifik bir paket yapısının yanlış tanımlandığını düşünmüyorum. Bu düşüncemin sebebi de bu sorunu yaşayan kitlenin tüm oyuncularım değil yaklaşık %15'lik bir dilimin olması. Client rapor loglarında ismi geçen birkaç oyuncuma ulaştım ve bu sorunu oyunda herhangi bir aksiyom yaşamadan yani ilk girişte login ekranında bile yaşadıklarını söylediler.
Bu biraz kafa karıştıcı. Hala sorunun kaynağını aramaktayım. Herhangi bir tecrübesi olan, bir şeyler paylaşmak isteyenleri konuya katkı yapmaya davet ediyorum.
Bir süredir oyuncularımı rahatsız eden client kapanma sorunları hakkında çalışmalar yapıyorum.
Bu sorunların kökeni; herhangi bir client crashı değil, clientin server tarafından yollanan paketleri düzgün bir şekilde yakalayamamasında yatıyor.
Paket yapısında oynama yapılmamış server fileslerde ve daha fazlasında, bu başarısızlık sonrasında client çözümü, kendini
PostQuitMessage(0) kullanarak kapamakta buluyor:
Çözüm her ne kadar ilk bakışta gereksiz görünse de, clientteki paket buffer yapısının bu noktadan sonra bozulduğu ve kendisini hali hazırda düzeltemeyecek yapıda olduğu için, bu çözümü şuanlık en iyi çözüm olarak yorumladım.
Bu çözüme benzer olarak, P2P yoluyla iletişim kuran gameler arasında da herhangi bir tanımlanamayan header bulunduğunda, yani game syserr lerimize UNKNOWN HEADER düştüğünde, gameler çözümü birbiri arasındaki soketlerini kapatmakta buluyor.
Fakat buradaki fark; P2P konusunda yaşanan header tanımsızlığı, en basitinde packet_info.cpp'de tanımlanmayan headerlar ya da büyük paketli buffered paketler sayesınde oluşuyor olmasıdır.
Zaman zaman yaşadığımız P2P kopmaları da tam olarak gamelerimize düşen UNKOWN HEADER syserrlerinden sonra yaşanıyor. Neyseki P2P kopmalarının analizi konusunda çözüm genelde basit. En son yollanan yüksek boyutlu paketleri loglamak ve boyutu indirgemek bu iş için yeterli bir çözüm.
Clientim için yaptığım çalışmalarda, kapanma sorunu yaşayan oyuncular için, serverden teslim aldıkları son paketleri loglayacak bir sistem yazdım.
Bu konuyu açmamdaki amaç, konuyla ilgilenenlerle analizlerimi paylaşıp çözüm için sizlerle bilgi paylaşımı yapmaktır.
Oluşturduğum log sistemindeki amaç, kapanmadan hemen önce servere bilgi gönderilip, oyuncunun soketine son yollanan 10 paketin server tarafında loglanmasındır:
Server tarafında saklanan bazı logları paylaşıyorum:
Sorunu yaşayan son oyuncuların aldığı headerler gösteriyorki, spesifk olarak son yollanan header bu soruna sebep olmuyor. Başka bir deyişle spesifik bir header bu soruna sebep olmuyor, ya da oluyor mu?
Bu gözlemlerden sonra, hatayı clientlere yollanan büyük boyutlu paketlerde aradım. Bu paketlerin en büyüğü 15814 byte ile offline shop sistemimdeki bir yapıydı.
Ve bu boyutun gerçekten sorun yaratacağını düşünmeyerek farklı bir yorum aramaya başladım. Bir şey veya bir şeyler, clientteki paket sequence yapısını sekteye uğratıyor olmalı diye düşündüm. Yani aslında sorun dolaylı olarak gerçekleşiyor gibi görünüyor.
Ekstra olarak, code base'mde herhangi spesifik bir paket yapısının yanlış tanımlandığını düşünmüyorum. Bu düşüncemin sebebi de bu sorunu yaşayan kitlenin tüm oyuncularım değil yaklaşık %15'lik bir dilimin olması. Client rapor loglarında ismi geçen birkaç oyuncuma ulaştım ve bu sorunu oyunda herhangi bir aksiyom yaşamadan yani ilk girişte login ekranında bile yaşadıklarını söylediler.
Bu biraz kafa karıştıcı. Hala sorunun kaynağını aramaktayım. Herhangi bir tecrübesi olan, bir şeyler paylaşmak isteyenleri konuya katkı yapmaya davet ediyorum.