DirectPlay

**DirectPlay**, DirectX'in çok kullanıcı oyunlar başta olmak üzere birçok kişinin aynı anda birçok mesaj yolladığı ortamların yaratılmasını kolaylaştırmak için geliştirdiği bir iletişim protokolüdür. DirectPlay, sunucu-istemci (server-client) veya peer to peer tipi bir organizasyonda asenkron mesajlaşma, mesaj öncelikleri, paket birleştirme, kayıpsız gönderim veya paket şifreleme gibi olanaklar sunar ve DirectPlay Voice modülü sayesinde ses iletimini de mümkün kılar.

## Sunucu-istemci ve peer to peer arasında seçim

**Sunucu-istemci** tipi bir ağda birçok istemci (kullanıcı) bir sunucuya bağlanır. Burada her kullanıcı sunucuya diğer kullancılara yollamak istediği mesajları bir kez verir, sunucu ise bu mesajı gerekli kullanıcılara yollamakla yükümlüdür. Dolayısıyla, sunucunun büyük miktarda ağ kaynağına sahip olması gerekmektedir.

**Peer to peer** tipi bir ağda ise, her kullanıcı her istediği kullanıcıya mesajını teker teker yollar. Her ne kadar bu kullanıcı başına düşen ağ yükünü artırsa da, sistemin paylaştırılmış olması ve dolayısıyla çökmesinin çok daha zorlaşmış olması bir avantaj kabul edilmektedir, üstelik bu oyun yazarını bir oyun sunucusu kurma derdinden de kurtarır.

Programcı, DCOM arayüzünü kullanarak **IDirectPlayClient**, **IDirectPlayServer** veya **IDirectPlayPeer** neslerinden kendi uygulamasına uygun olanları yaratır.

## Servis sağlayıcılar

DirectPlay, mesajlaşma hizmetlerini muhtelif servis sağlayıcıları (service provider) kullanarak yapabilir. Genelde servis sağlayıcı TCP/IP olsa da bazı kullanıcıların ihtiyaçlarına göre Bluetooth veya modem de olabilir. Buna ek olarak, programcı isterse Microsoft'un sunduğu ayarlanabilir başarımlı TCP/IP servis sağlayıcısını kullanarak yazılımın değişik ağ koşullarında nasıl çalıştığını görebilir.

## Bağlantı

Kontrol nesnesinin yaratılması, servis sağlayıcı ve ona bağlı adres nesnesinin de ona eklenmesiyle bağlantıya hazır hale gelinir. Bağlantı sırasında, DirectPlay nesnesi yaratırken belirttiğiniz mesaj alma fonksiyonuna çağrılarda bulunur ki bu çağrılardan en önemlileri:

* **DPN_MSGID_ENUM_HOSTS_RESPONSE** mesajı bağlanma isteğinin kabul olduğuna işaret olarak gelir. Bağlantı bilgilerini içerir.
* **DPN_MSGID_CREATE_PLAYER** ve **DPN_MSGID_DESTROY_PLAYER** mesajları oyuncular bağlandığında ve bağlantıyı koparttığında gelir.
* **DPN_MSGID_RECEIVE** kullanıcıya mesaj gelince gelir (mesajlar **SendTo** metodu ile yollanır). Tartışmasız bir oyundaki en önemli mesaj da budur.
* **DPN_MSGID_TERMINATE_SESSION** bağlantı kopunca gelir.

Unutulmaması gereken önemli noktalardan biri: DirectPlay, kullanıcı yaratılışı için kendi iç mesajlaşma sistemini kullanır. Dolayısıyla, yüksek öncelikli mesajlar yollandığında bu mesajlar o kullanıcıya "ilgili kullanıcı bağlandı" mesajından daha önce gelebilir.

## Ses bağlantısı

"Normal" nesne bağlantısı kuruluduğunda, **DirectPlayVoiceClient** ve gerekiyorsa **DirectPlayVoiceServer** nesnelerini DCOM aracılığı ile yaratıp "normal" bağlantı nesnesine eklediğiniz anda ses bağlantısı kurulur. DirectPlay Voice, 1.2 kbit'den 64 kbit'e kadar değişik bant genişlikleri kullanan codecler ile birlikte gelir, ama maalesef dış codec kullanımı mümkün değildir. Sesin hangi kullanıcılara yollanacağı **SetTransmitTargets** metodu ile seçilir.

Son olarak, **DirectPlayVoiceClient** nesnesinin **Create3DSoundBuffer** metodu kullanılarak her oyuncuya özel bir üç boyutlu ses kanalı verilebilir!

## Sonuç

Görüldüğü üzere, DirectPlay ile çok hızlı bir şekilde NAT ve UPnP desteğine sahip, gerekiyorsa şifreleme kullanabilen ve hatta üç boyutlu ses alış verişi yapabilen uygulamalar yapılması mümkündür.