NovaLst 1
NovaLst
SLyFeLLowTR 1
SLyFeLLowTR
xranzei 1
xranzei
InfernoShade 1
InfernoShade
shrpnl 1
shrpnl
D 1
delimuratt
noisiv 1
noisiv
Manwe Work 1
Manwe Work
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Cannn6161 1
Cannn6161
onur akbaş 1
onur akbaş
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Metin2'yi özgür bırakın!

  • Konuyu başlatan Konuyu başlatan dormammu
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 43
  • Görüntüleme Görüntüleme 5K

dormammu

Level 4
TM Üye
Üye
Katılım
6 Eyl 2017
Konular
53
Mesajlar
358
Çözüm
1
Online süresi
1mo 8d
Reaksiyon Skoru
169
Altın Konu
1
TM Yaşı
8 Yıl 9 Ay 7 Gün
Başarım Puanı
129
Yaş
32
MmoLira
6,475
DevLira
78
Ticaret - 100%
1   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

common/singleton.h güncelle;

#ifndef __INC_SINGLETON_H__
#define __INC_SINGLETON_H__

#include <memory>
#include <cassert>
#include <mutex>

template <typename T>
class singleton {
public:
// Singleton örneğini tutan static pointer
static std::unique_ptr<T> ms_singleton;
static std::mutex mtx; // Lock için mutex

// Constructor
singleton() {
std::lock_guard<std::mutex> lock(mtx); // Thread-safe başlatma
assert(!ms_singleton); // Eğer zaten bir örnek varsa hata ver
ms_singleton.reset(static_cast<T*>(this)); // Nesneyi başlat
}

// Destructor
virtual ~singleton() {
std::lock_guard<std::mutex> lock(mtx);
assert(ms_singleton); // Eğer singleton örneği yoksa hata ver
ms_singleton.reset(nullptr); // Örneği null yap
}

// Singleton örneğini döner
static T& instance() {
assert(ms_singleton); // Eğer örnek yoksa hata ver
return *ms_singleton;
}

// Singleton örneğini pointer olarak döner
static T* instance_ptr() {
return ms_singleton.get();
}
};

// Static üyeler
template <typename T> std::unique_ptr<T> singleton<T>::ms_singleton = nullptr;
template <typename T> std::mutex singleton<T>::mtx;

#endif


kanal başına 41613(atıyorum) karakter, mob a kadar sınırlarken bunu uçuruyor. Zamanında bellek koruma amaçlı yapılmış ama günümüzde gerek yok böyle şeylere ayıptır yani.

Bonus:

channeleri ch1_1 ch1_2 diye ayırmanıza gerek kalmaz artık.

Kanıt;
1745785327626.png


Mesela burada 5k+ yabani köpke var normalde yapamazsınız kanal çöker ama düzeltmeden sonra 500k+ da çağırabilirsiniz. TAbi bu sefer client pert olur.
 
Son düzenleme:

En Çok Reaksiyon Alan Mesajlar

Metin2'nin single-theard yapısı için oldukça gereksiz ve maliyetli bir refactoring olmuş maalesef, konunun açılışından çok süre geçmiş ama gözden kaçırmışım, şimdi görünce yorum yapmadan geçmek istemedim, hala bu konuyu görüp uygulamaya çalışan birileri olabilir. Oyun çoğu senaryoda single-theard garanti ettiği için mutex kullanımı gereksiz yük ve anlamsız bir maliyet, oyunun belki de en çok kullanılan header dosyası, performansın en kritik oldu dosya dolayısıyla buna uygun şekilde yazılmalı ve kullanılmalı. Kendi projemde kullandığım versiyonu paylaşıyorum belki birilerinin işine yarar;

C++:
#ifndef __INC_SINGLETON_H__
#define __INC_SINGLETON_H__

#include <cassert>
#include "service.h"
#include "../libthecore/include/log.h"

// After a critic ASan (-fsantinizer) warning, i've made a full rework for this header.
// It's now fully compatible with modern C++ and also much more faster/optimized. - [MT2Dev Note] - 20/06/2025

#ifdef __WIN32__
#define FORCE_INLINE [[nodiscard]] __forceinline
#else
#define FORCE_INLINE [[gnu::always_inline]] [[nodiscard]]
#endif //__WIN32__

template <typename T>
class singleton
{
    private:
        static inline T* ms_singleton = nullptr;
        #ifdef TEST_SINGLETON_MODE
        static inline bool ms_destroying = false;  // Debugging - Lifecycle tracking. - [MT2Dev Note]
        #endif //TEST_SINGLETON_MODE

    public:
        singleton()
        {
            // Debugging - Double initialization control. - [MT2Dev Note]
            #ifdef TEST_SINGLETON_MODE
            #ifdef __WIN32__
            assert (!ms_singleton  && "Singleton already exists! Multiple instances not allowed!");
            assert (!ms_destroying && "Cannot create singleton during destruction phase!");
            #else
            if (ms_singleton)
            {
                sys_err ("<FATAL ERROR> Singleton already exists! Multiple instances not allowed!");
            }

            if (ms_destroying)
            {
                sys_err ("<FATAL ERROR> Cannot create singleton during destruction phase!");
            }
            #endif //__WIN32__
            #endif //TEST_SINGLETON_MODE
            ms_singleton = static_cast<T*> (this);
        }

        virtual ~singleton()
        {
            #ifdef TEST_SINGLETON_MODE
            #ifdef __WIN32__
            assert (ms_singleton && "Singleton destructor called but instance is nullptr!");
            #else
            if (!ms_singleton)
            {
                sys_err ("<FATAL ERROR> Singleton destructor called but instance is nullptr!");
            }
            #endif //__WIN32__
            ms_destroying = true;
            #endif //TEST_SINGLETON_MODE
            ms_singleton = nullptr;
            #ifdef TEST_SINGLETON_MODE
            ms_destroying = false;
            #endif //TEST_SINGLETON_MODE
        }

        FORCE_INLINE static T& Instance()
        {
            #ifdef TEST_SINGLETON_MODE
            #ifdef __WIN32__
            assert (ms_singleton   && "Singleton not initialized! Create instance first!");
            assert (!ms_destroying && "Accessing singleton during destruction!");
            #else
            if (!ms_singleton)
            {
                sys_err ("<FATAL ERROR> Singleton not initialized! Create instance first!");
            }

            if (ms_destroying)
            {
                sys_err ("<FATAL ERROR> Accessing singleton during destruction!");
            }
            #endif //__WIN32__
            #endif //TEST_SINGLETON_MODE
            return *ms_singleton;
        }

        FORCE_INLINE static T& instance()  // For old compatibility support. - [MT2Dev Note]
        {
            return Instance();
        }

        // Copy/Move semantics. - [MT2Dev Note]
        singleton (const singleton&) = delete;
        singleton& operator= (const singleton&) = delete;
        singleton (singleton&&) = delete;
        singleton& operator= (singleton&&) = delete;
};
#endif //__INC_SINGLETON_H__

// MT2DevCore Project | Modern Base SF by MT2Dev | 2025
Yapay zekaya yazdırılmış kod, Stack ile heap arasındaki farkı bilmeyen paylaşımcı..

o kadar yazılımcı var burda, 1 kişide çıkıp dememiş bu singleton sınıfı kalıtım alan sınıfın dinamik bellek ile oluşturulmasını beklerken CHARACTER_MANAGER stack'te oluşturuluyor bunun sahipliğini neden unique_ptr ye veriyorsun ?

Multi thread kullanılmayan yerde mutex in getirdiği performans kaybını anlatmaya gerek bile yok.

Örnek kod double free hatasını açıkça görebilirsiniz (çift destructor)

Öğeyi görmek için üye olmalısınız.
 
Kod:
#ifndef __INC_SINGLETON_H__
#define __INC_SINGLETON_H__

#include <assert.h>

template <typename T>
class singleton
{
protected:
    static T* ms_singleton;

public:
    singleton()
    {
        assert(!ms_singleton && "Singleton instance already exists.");
        ms_singleton = static_cast<T*>(this);
    }

    virtual ~singleton()
    {
        assert(ms_singleton && "Singleton instance does not exist.");
        ms_singleton = NULL;
    }

    static T& instance()
    {
        assert(ms_singleton && "Singleton instance is not created yet.");
        return *ms_singleton;
    }

    static T* instance_ptr()
    {
        return ms_singleton;
    }
};

template <typename T>
T* singleton<T>::ms_singleton = NULL;

#endif // __INC_SINGLETON_H__
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst