Metin2 client’ında tüm arayüzler (UI) belirli katmanlar (layer) üzerinde çalışır. Bu katmanlar hem çizim sırasını hem de tıklama önceliğini belirler.

Temel layer yapısı:
- GAME: Oyun dünyası etkileşimi (harita tıklamaları vb.)
- UI_BOTTOM: Alt seviye UI elementleri (shop başlıkları gibi)
- UI: Ana UI katmanı (inventory, karakter, messenger, pencereler)
- TOP_MOST: Her zaman en üstte kalan UI (taskbar, sabit pencereler)
- CURTAIN: Geçiş ekranları (login–character select arası gibi)
Render işlemi aşağıdan yukarı doğru ilerler. Input (mouse tıklama) işlemi ise yukarıdan aşağıya çalışır. Yani üst katmanlar önce kontrol edilir.
UI Window Yapısı
Bir UI window iki parçadan oluşur:
- Python tarafı (
ui.py) - C++ tarafı (
wndMgr)
Window oluşturulduğunda önce Python objesi oluşturulur, ardından C++ tarafında karşılığı register edilir.
Bu iki yapı birbirine handle sistemi ile bağlanır:
- Python tarafı → C++ window handle tutar
- C++ tarafı → Python callback referansı tutar
Bu yapı sayesinde input ve render olayları iki tarafta senkron çalışır.
Parent – Child Sistemi
UI elementleri birbirine parent-child ilişkisi ile bağlanır.

SetParent() kullanıldığında:
- Window mevcut parent’ından çıkarılır
- Yeni parent’ın child listesine eklenir
Bu işlemin önemli sonucu şudur:
Child list sırası = Z-order (çizim önceliği)
Yani son eklenen child her zaman üstte render edilir.
Bu yüzden UI sıralama problemleri genellikle yanlış parent kullanımından kaynaklanır.
Window Picking (Tıklama Sistemi)
Mouse hareketi sırasında sistem hangi window’un seçileceğini belirler.

Bir window’un pick edilebilmesi için:
- Mouse pozisyonu window içinde olmalı
- Window visible olmalı
not_pickflag kapalı olmalı- Parent sınırları içinde bulunmalı
Önemli nokta:
Tüm UI elementleri mantıksal olarak dikdörtgen (square) kabul edilir. Görsel olarak yuvarlak olsa bile hitbox kare şeklindedir.
Bu nedenle UI tıklama hatalarının büyük kısmı hitbox ve parent sınırlarından kaynaklanır.
Memory Management ve Reference Count
Python tarafında tüm objeler reference count sistemi ile yönetilir.

Temel mantık:
- Obje oluşturulur → ref count = 1
- Başka bir değişkene atanır → ref count artar
- Referanslar silinirse → ref count azalır
- Ref count = 0 → garbage collector objeyi siler
UI tarafındaki kritik problem
UI sistemlerinde en sık görülen sorun reference cycle (döngüsel referans) oluşmasıdır.
Örnek senaryo:
- Window bir button oluşturur
- Button parent’a referans tutar
- Parent da button’a referans tutar
- Event sistemi self referansı ekler
Bu durumda:
Obje referans sayısı asla 0 olmaz → memory leak oluşur
Sonuç:
- Silinmeyen window’lar
- Warp sonrası biriken UI instance’ları
- RAM artışı
- Çift UI oluşumları (inventory, messenger vb.)
Weak Reference (Proxy Kullanımı)
Bu problemi çözmek için weak reference kullanılır.

Weak reference:
- Reference count artırmaz
- Döngüsel referansları kırar
- Objenin garbage collector tarafından silinmesine izin verir
Bu sistem özellikle event bağlamalarında kritik öneme sahiptir.
Metin2 client yapısında bu mantık __mem_func__ sistemi ile uygulanır.
OnUpdate ve OnRender Kullanımı
UI fonksiyonları iki ana döngüde çalışır:
OnUpdate
- Logic işlemleri
- Hesaplamalar
- Pozisyon güncellemeleri
- Veri senkronizasyonu
OnRender
- Ekrana çizim işlemleri
- DirectX render çağrıları
Kritik kural:
- Render işlemleri OnUpdate içine yazılmamalıdır
- Ağır hesaplamalar OnRender içinde yapılmamalıdır
Yanlış kullanım:
- FPS drop
- UI lag
- Client freeze
Event Callback Return Mantığı
Bazı event fonksiyonları return değeri bekler.

Örnek:
- ESC tuşu ile window kapatma
Eğer doğru return verilmezse:
- Event zinciri bozulur
- Alt layer’lara yanlış event geçebilir
- Beklenmeyen crash durumları oluşabilir
Bu nedenle event handler fonksiyonlarında return değerleri dikkatli yönetilmelidir.
UI sistemi Metin2 client yapısında en hassas alanlardan biridir.
En sık görülen problemler:
- Yanlış layer kullanımı
- Parent-child hataları
- Memory leak (reference cycle)
- Yanlış event binding
- Update/Render karışıklığı
Bu yapı doğru kurulduğunda client çok daha stabil ve performanslı çalışır.
Paylaş :



