Toggle MSAA

  • Konuyu açan Konuyu açan otuzbiroglu
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 10
  • Gösterim Gösterim 512

otuzbiroglu

Üye
Üye
Mesaj
20
Beğeni
29
Puan
660
Ticaret Puanı
0
Merhaba,

Oyun içerisindeki sistem seçeneklerinden oyunu yeniden başlatmaya ya da herhangi bir işleme gerek kalmadan anlık olarak MSAA özelliğini açıp kapatabileceğim bir sistem arıyordum fakat bulamadım. Kendim yazmaya ve paylaşmaya karar verdim.

  • Dinamik ve kayıpsız olarak MSAA'i açıp kapatabilmek için minimum Direct3D 9Ex (DX9Ex) sürümü gereklidir.

Neden DX9Ex?

DX9 ve daha düşük versiyonlarda MSAA gibi bir ayar değiştirildikten sonra "IDirect3DDevice9::Reset" fonksiyonu çağırılmalı, tüm back buffer yapısı değiştirilmeli, tüm bağlılıklar VRAM'e yeniden yüklenmelidir. Bu da yeterince hızlı olmaz. Donmalar, siyah ekranlar, çökmeler yaşanabilir. DX9Ex ise bu sorunu VVM (sanal video belleği) özelliği ile birlikte video belleğini tıpkı RAM gibi sanallaştırarak ve buna binayen reset ihtiyacını ortadan kaldırarak çözer. Herhangi bir yeniden yapılandırma gerekiyorsa "IDirect3DDevice9Ex::ResetEx" fonksiyonu, VRAM'deki tüm kaynakları öldürmeden ya da yeniden yüklemeden sadece swap chain'i güncelleyebilir.

DX9'da çalıştırmak mümkün mü?

DX9'da ısrarcıysanız bunun gibi bir sistem her geçişte birkaç saniyelik donmalara, siyah ekran sorunlarına ya da teşhisi zor bellek sızıntılarına sebep olabilir ve henüz destek veremem.

Bu sistem yalnızca client source ve data üzerinde değişiklik yapar. Makrolar, önünde ve arkasındaki bağlamlarıyla birlikte verilmiştir. MSAA'in kaynak tüketimi çok düşük olduğu ve 4 kat örnekleme versiyonu bile sınırlı görsel performans verebildiği için 8 kat örnekleme versiyonu eğer mümkün değilse en düşük 4 kat örnekleme yapan versiyonu zorlanmıştır.

UserInterface\Locale_inc.h:
Genişlet Daralt Kopyala
#define ANTI_ALIASING

EterLib\GrpDevice.cpp:
Genişlet Daralt Kopyala
#include "EterBase/Debug.h"

#ifdef ANTI_ALIASING
#include "../UserInterface/PythonSystem.h"
#endif

#include <intrin.h>

EterLib\GrpDevice.cpp:
Genişlet Daralt Kopyala
bool CGraphicDevice::Reset()
{
    HRESULT hr;

#ifdef ANTI_ALIASING

    ms_d3dPresentParameter.MultiSampleType = D3DMULTISAMPLE_NONE;
    ms_d3dPresentParameter.MultiSampleQuality = 0;

    if (CPythonSystem::Instance().IsMSAAEnable())
    {

        D3DDISPLAYMODE d3dDisplayMode;
        ms_lpd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3dDisplayMode);
        D3DFORMAT msaaCheckFormat = ms_d3dPresentParameter.Windowed ? d3dDisplayMode.Format : ms_d3dPresentParameter.BackBufferFormat;

        if (SUCCEEDED(ms_lpd3d->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, msaaCheckFormat, ms_d3dPresentParameter.Windowed, D3DMULTISAMPLE_8_SAMPLES, &ms_d3dPresentParameter.MultiSampleQuality)))
        {
            ms_d3dPresentParameter.MultiSampleType = D3DMULTISAMPLE_8_SAMPLES;
            ms_d3dPresentParameter.MultiSampleQuality = 0;
        }
    }
#endif

    if (FAILED(hr = ms_lpd3dDevice->Reset(&ms_d3dPresentParameter)))
        return false;

    if (m_pStateManager)
        m_pStateManager->SetDefaultState();

    return true;
}

EterLib\GrpDevice.cpp için else bloğunu kendi kodlarınızla değiştirin.

EterLib\GrpDevice.cpp:
Genişlet Daralt Kopyala
    ms_d3dPresentParameter.EnableAutoDepthStencil            = TRUE;
    ms_d3dPresentParameter.AutoDepthStencilFormat            = D3DFMT_D24S8;

#ifdef ANTI_ALIASING
    if (CPythonSystem::Instance().IsMSAAEnable() && !disableMSAA)
    {
        D3DFORMAT msaaCheckFormat = Windowed ? d3dDisplayMode.Format : ms_d3dPresentParameter.BackBufferFormat;
       
        if (SUCCEEDED(ms_lpd3d->CheckDeviceMultiSampleType(
            D3DADAPTER_DEFAULT,
            D3DDEVTYPE_HAL,
            msaaCheckFormat,
            Windowed,
            D3DMULTISAMPLE_8_SAMPLES,
            &ms_d3dPresentParameter.MultiSampleQuality)))
        {
            ms_d3dPresentParameter.MultiSampleType = D3DMULTISAMPLE_8_SAMPLES;
            ms_d3dPresentParameter.MultiSampleQuality = 0;
        }
        else if (SUCCEEDED(ms_lpd3d->CheckDeviceMultiSampleType(
            D3DADAPTER_DEFAULT,
            D3DDEVTYPE_HAL,
            msaaCheckFormat,
            Windowed,
            D3DMULTISAMPLE_4_SAMPLES,
            &ms_d3dPresentParameter.MultiSampleQuality)))
        {
            ms_d3dPresentParameter.MultiSampleType = D3DMULTISAMPLE_4_SAMPLES;
            ms_d3dPresentParameter.MultiSampleQuality = 0;
        }
    }
#else
    if (!Windowed && !disableMSAA)
    {
        D3DFORMAT msaaCheckFormat = ms_d3dPresentParameter.BackBufferFormat;
        if (SUCCEEDED(ms_lpd3d->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, msaaCheckFormat, FALSE, D3DMULTISAMPLE_2_SAMPLES, &ms_d3dPresentParameter.MultiSampleQuality)))
        {
            ms_d3dPresentParameter.MultiSampleType = D3DMULTISAMPLE_2_SAMPLES;
            ms_d3dPresentParameter.MultiSampleQuality = 0;
        }
        if (SUCCEEDED(ms_lpd3d->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, msaaCheckFormat, FALSE, D3DMULTISAMPLE_4_SAMPLES, &ms_d3dPresentParameter.MultiSampleQuality)))
        {
            ms_d3dPresentParameter.MultiSampleType = D3DMULTISAMPLE_4_SAMPLES;
            ms_d3dPresentParameter.MultiSampleQuality = 0;
        }
    }
#endif

    D3DDISPLAYMODEEX displayModeEx;
    ZeroMemory(&displayModeEx, sizeof(displayModeEx));

EterLib\StateManager.cpp:
Genişlet Daralt Kopyala
CStateManager::CStateManager(LPDIRECT3DDEVICE9EX lpDevice) : m_lpD3DDev(NULL)
{
    m_bScene = false;

#ifdef ANTI_ALIASING
    m_bMSAAEnabled = true;
#endif

    m_dwBestMinFilter = D3DTEXF_ANISOTROPIC;
    m_dwBestMagFilter = D3DTEXF_ANISOTROPIC;

EterLib\StateManager.cpp:
Genişlet Daralt Kopyala
    SaveVertexProcessing(FALSE);
    SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);

#ifdef ANTI_ALIASING
    SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, m_bMSAAEnabled ? TRUE : FALSE);
#else
    SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE);
#endif

    SetRenderState(D3DRS_MULTISAMPLEMASK, 0xFFFFFFFF);
    SetRenderState(D3DRS_PATCHEDGESTYLE, D3DPATCHEDGE_CONTINUOUS);

EterLib\StateManager.cpp:
Genişlet Daralt Kopyala
    m_lpD3DDev->SetIndices(pIndexData);
    m_CurrentState.m_IndexData = kIndexData;
}

#ifdef ANTI_ALIASING
void CStateManager::SetMSAAOption(bool bEnable)
{
    m_bMSAAEnabled = bEnable;

    SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, bEnable ? TRUE : FALSE);
}
#endif

HRESULT CStateManager::DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount)
{

EterLib\StateManager.h:
Genişlet Daralt Kopyala
    void StateManager_Capture();
    void StateManager_Apply();

    LPDIRECT3DDEVICE9EX GetDevice();

#ifdef _DEBUG
    void ResetDrawCallCounter();
    int GetDrawCallCount() const;
#endif

#ifdef ANTI_ALIASING
    void SetMSAAOption(bool bEnable);
#endif

private:
    void SetDevice(LPDIRECT3DDEVICE9EX lpDevice);

EterLib\StateManager.h:
Genişlet Daralt Kopyala
    bool                m_bForce;
    bool                m_bScene;

#ifdef ANTI_ALIASING
    bool                m_bMSAAEnabled;
#endif

    DWORD                m_dwBestMinFilter;
    DWORD                m_dwBestMagFilter;

UserInterface\PythonApplication.cpp:
Genişlet Daralt Kopyala
void CPythonApplication::SetForceSightRange(int iRange)
{
    m_iForceSightRange = iRange;
}

#ifdef ANTI_ALIASING
void CPythonApplication::ResetDevice()
{
    m_grpDevice.Reset();
}
#endif

void CPythonApplication::Clear()
{
    m_pySystem.Clear();
}

UserInterface\PythonApplication.h:
Genişlet Daralt Kopyala
class CPythonApplication : public CMSApplication, public CInputKeyboard, public IAbstractApplication
{
    public:

    #ifdef ANTI_ALIASING
        void ResetDevice();
    #endif

        enum EDeviceState
        {
            DEVICE_STATE_FALSE,
            DEVICE_STATE_SKIP,
            DEVICE_STATE_OK,
        };

UserInterface\PythonSystem.cpp:
Genişlet Daralt Kopyala
    m_Config.bShowDamage        = true;
    m_Config.bShowSalesText        = true;

#ifdef ANTI_ALIASING
    m_Config.bMSAA = true;
#endif
}

bool CPythonSystem::IsWindowed()
{
    return m_Config.bWindowed;
}

UserInterface\PythonSystem.cpp:
Genişlet Daralt Kopyala
        else if (!stricmp(command, "SHOW_DAMAGE"))
            m_Config.bShowDamage = atoi(value) == 1 ? true : false;
        else if (!stricmp(command, "SHOW_SALESTEXT"))
            m_Config.bShowSalesText = atoi(value) == 1 ? true : false;

#ifdef ANTI_ALIASING
        else if (!stricmp(command, "MSAA"))
        {
            m_Config.bMSAA = atoi(value) == 1 ? true : false;
            continue;
        }
#endif
    }

    if (m_Config.bWindowed)
    {

UserInterface\PythonSystem.cpp:
Genişlet Daralt Kopyala
    fprintf(fp, "SHADOW_LEVEL            %d\n", m_Config.iShadowLevel);
    fprintf(fp, "FOG_LEVEL                %d\n", m_Config.iFogLevel);

#ifdef ANTI_ALIASING
    fprintf(fp, "MSAA\t\t%d\n", m_Config.bMSAA ? 1 : 0);
#endif

    fprintf(fp, "\n");

    fclose(fp);
    return true;
}

UserInterface\PythonSystem.cpp:
Genişlet Daralt Kopyala
void CPythonSystem::Clear()
{
    SetInterfaceHandler(NULL);
}

#ifdef ANTI_ALIASING
void CPythonSystem::SetMSAAState(bool bEnable)
{
    if (m_Config.bMSAA == bEnable)
        return;

    m_Config.bMSAA = bEnable;

    CPythonApplication::Instance().ResetDevice();
}

bool CPythonSystem::IsMSAAEnable()
{
    return m_Config.bMSAA;
}
#endif

CPythonSystem::CPythonSystem()
{

UserInterface\PythonSystem.h:
Genişlet Daralt Kopyala
            bool            bShowDamage;
            bool            bShowSalesText;

#ifdef ANTI_ALIASING
            bool            bMSAA;
#endif
        } TConfig;

    public:
        CPythonSystem();

UserInterface\PythonSystem.h:
Genişlet Daralt Kopyala
        TConfig *                        GetConfig();
        void                            ChangeSystem();

#ifdef ANTI_ALIASING
        void                            SetMSAAState(bool bEnable);
        bool                            IsMSAAEnable();
#endif

        bool                            LoadInterfaceStatus();
        void                            SaveInterfaceStatus();

UserInterface\PythonSystemModule.cpp:
Genişlet Daralt Kopyala
#include "StdAfx.h"
#include "PythonSystem.h"

#ifdef ANTI_ALIASING
#include "../EterLib/StateManager.h"
#endif

PyObject * systemGetWidth(PyObject* poSelf, PyObject* poArgs)
{
    return Py_BuildValue("i", CPythonSystem::Instance().GetWidth());
}

UserInterface\PythonSystemModule.cpp:
Genişlet Daralt Kopyala
    CPythonSystem::Instance().SetFogLevel(iLevel);
    return Py_BuildNone();
}

#ifdef ANTI_ALIASING
PyObject* systemSetMSAAState(PyObject* poSelf, PyObject* poArgs)
{
    int iEnable;
    if (!PyArg_ParseTuple(poArgs, "i", &iEnable))
        return Py_BuildException();

    CStateManager::Instance().SetMSAAOption(iEnable ? true : false);

    CPythonSystem::Instance().SetMSAAState(iEnable ? true : false);

    return Py_BuildNone();
}

PyObject* systemIsMSAAEnable(PyObject* poSelf, PyObject* poArgs)
{
    return Py_BuildValue("i", CPythonSystem::Instance().IsMSAAEnable() ? 1 : 0);
}
#endif

void initsystem()
{

UserInterface\PythonSystemModule.cpp:
Genişlet Daralt Kopyala
        { "GetShadowLevel",                systemGetShadowLevel,            METH_VARARGS },
        { "SetShadowLevel",                systemSetShadowLevel,            METH_VARARGS },

#ifdef ANTI_ALIASING
        { "SetMSAAState",               systemSetMSAAState,             METH_VARARGS },
        { "IsMSAAEnable",               systemIsMSAAEnable,             METH_VARARGS },
#endif

        { NULL,                            NULL,                            NULL }
    };

    PyObject * poModule = Py_InitModule("systemSetting", s_methods);

    PyModule_AddIntConstant(poModule, "WINDOW_STATUS",        CPythonSystem::WINDOW_STATUS);

root/uisystemoption.py:
Genişlet Daralt Kopyala
        self.tilingModeButtonList = []
        self.ctrlShadowQuality = 0
        self.msaaEnableButton = None
        self.msaaDisableButton = None

    def Destroy(self):
        self.ClearDictionary()

root/uisystemoption.py:
Genişlet Daralt Kopyala
            self.tilingModeButtonList.append(GetObject("tiling_gpu"))
            self.tilingApplyButton=GetObject("tiling_apply")
            self.msaaEnableButton = self.GetChild("msaa_enable_button")
            self.msaaDisableButton = self.GetChild("msaa_disable_button")
        except:
            import exception
            exception.Abort("OptionDialog.__Load_BindObject")

root/uisystemoption.py:
Genişlet Daralt Kopyala
        self.tilingApplyButton.SAFE_SetEvent(self.__OnClickTilingApplyButton)

        self.msaaEnableButton.SAFE_SetEvent(self.__OnClickMSAAEnable)
        self.msaaDisableButton.SAFE_SetEvent(self.__OnClickMSAADisable)

        self.__SetCurTilingMode()

root/uisystemoption.py:
Genişlet Daralt Kopyala
        self.__ClickRadioButton(self.cameraModeButtonList, constInfo.GET_CAMERA_MAX_DISTANCE_INDEX())

        if systemSetting.IsMSAAEnable():
            self.msaaEnableButton.Down()
            self.msaaDisableButton.SetUp()
        else:
            self.msaaEnableButton.SetUp()
            self.msaaDisableButton.Down()

        if musicInfo.fieldMusic==musicInfo.METIN2THEMA:
            self.selectMusicFile.SetText(uiSelectMusic.DEFAULT_THEMA)

root/uisystemoption.py:
Genişlet Daralt Kopyala
            background.EnableSoftwareTiling(0)

        net.ExitGame()

    def __OnClickMSAAEnable(self):
        systemSetting.SetMSAAState(1)
        self.msaaEnableButton.Down()
        self.msaaDisableButton.SetUp()

    def __OnClickMSAADisable(self):
        systemSetting.SetMSAAState(0)
        self.msaaEnableButton.SetUp()
        self.msaaDisableButton.Down()

    def __OnClickChangeMusicButton(self):
        if not self.musicListDlg:

uiscript/systemoptiondialog.py:
Genişlet Daralt Kopyala
                {
                    "name" : "tiling_apply",
                    "type" : "button",

                    "x" : 110+100,
                    "y" : 185,

                    "text" : uiScriptLocale.OPTION_TILING_APPLY,

                    "default_image" : ROOT_PATH + "middle_Button_01.sub",
                    "over_image" : ROOT_PATH + "middle_Button_02.sub",
                    "down_image" : ROOT_PATH + "middle_Button_03.sub",
                },

                {
                    "name" : "msaa_mode",
                    "type" : "text",

                    "x" : 40 + TEXT_TEMPORARY_X,
                    "y" : 210+2,

                    "text" : "MSAA",
                },

                {
                    "name" : "msaa_enable_button",
                    "type" : "radio_button",

                    "x" : 110,
                    "y" : 210,

                    "text" : "Açık",

                    "default_image" : ROOT_PATH + "small_Button_01.sub",
                    "over_image" : ROOT_PATH + "small_Button_02.sub",
                    "down_image" : ROOT_PATH + "small_Button_03.sub",
                },

                {
                    "name" : "msaa_disable_button",
                    "type" : "radio_button",

                    "x" : 110+50,
                    "y" : 210,

                    "text" : "Kapalı",

                    "default_image" : ROOT_PATH + "small_Button_01.sub",
                    "over_image" : ROOT_PATH + "small_Button_02.sub",
                    "down_image" : ROOT_PATH + "small_Button_03.sub",
                },

hcpo6qe.png

jwlzw28.png


Herhangi bir problemle karşılaşmanız durumunda iletişime geçebilirsiniz.​
 
Son düzenleme:
Hocsm açıp kapamalı yspmanın bir avantajı var mı
Metin2 AAA kalitesinde bir oyun olmadığı için çok da bir avantajı yok. Hatta hiç yok. Yanlış hatırlamıyorsam bir zamanlar test ettiğimde ortalama %1.5-2 kadar etkisi oluyordu GPU'ya.
CheckDeviceMultiSampleType ile 4x'e ayarlanıp sabit şekilde de kullanılabilir.
 
Hocsm açıp kapamalı yspmanın bir avantajı var mı
Sadece MSAA özelinde konuşmak gerekirse, kullanıcı deneyimini arttırmış olursunuz o kadar. Oyuncu istediği zaman açıp kapatabilir, başka da bir işe yaramaz. Lakin, geliştirdiğim projede HFRS (yüksek yenileme hızı desteği), MSAA, FXAA, HLSL gibi sistemler kullanıyorum. Bu sistemlerin birbirine müdahale etmeden ayrı ayrı sorunsuz çalıştırılıp sonlandırılabilmesi (örneğin msaa'nın ve fxaa'nın birbirlerini ezmemesi, hlsl post process efektlerinin msaa ve fxaa üzerine düzgünce uygulanabilmesi) için dinamik olarak açılıp kapanabilen şekilde eklenmesi şart. Aksi takdirde debugging eziyet olur. Benzer şekilde config.exe yerine, ayarlarım (çözünürlük, maksimum kare hızı, tam ekran/pencere, dil) oyun içerisinden dinamik olarak değiştiriliyor. Arayüzde fonksiyonel bütünlük sağlamak ve hata ayıklama sürecini hızlandırmak için eklediğim tüm iyileştirmeleri bu yüzden toggle ekliyorum, projeniz DX9Ex kullanıyor ise kesinlikle tavsiye ederim.


Metin2 AAA kalitesinde bir oyun olmadığı için çok da bir avantajı yok. Hatta hiç yok. Yanlış hatırlamıyorsam bir zamanlar test ettiğimde ortalama %1.5-2 kadar etkisi oluyordu GPU'ya.
CheckDeviceMultiSampleType ile 4x'e ayarlanıp sabit şekilde de kullanılabilir.
Saygı duymakla birlikte buna katılmıyorum. 3A bir oyun olmaması oyun deneyimini iyileştirmek için herhangi bir engel teşkil etmiyor.
 
Sadece MSAA özelinde konuşmak gerekirse, kullanıcı deneyimini arttırmış olursunuz o kadar. Oyuncu istediği zaman açıp kapatabilir, başka da bir işe yaramaz. Lakin, geliştirdiğim projede HFRS (yüksek yenileme hızı desteği), MSAA, FXAA, HLSL gibi sistemler kullanıyorum. Bu sistemlerin birbirine müdahale etmeden ayrı ayrı sorunsuz çalıştırılıp sonlandırılabilmesi (örneğin msaa'nın ve fxaa'nın birbirlerini ezmemesi, hlsl post process efektlerinin msaa ve fxaa üzerine düzgünce uygulanabilmesi) için dinamik olarak açılıp kapanabilen şekilde eklenmesi şart. Aksi takdirde debugging eziyet olur. Benzer şekilde config.exe yerine, ayarlarım (çözünürlük, maksimum kare hızı, tam ekran/pencere, dil) oyun içerisinden dinamik olarak değiştiriliyor. Arayüzde fonksiyonel bütünlük sağlamak ve hata ayıklama sürecini hızlandırmak için eklediğim tüm iyileştirmeleri bu yüzden toggle ekliyorum, projeniz DX9Ex kullanıyor ise kesinlikle tavsiye ederim.



Saygı duymakla birlikte buna katılmıyorum. 3A bir oyun olmaması oyun deneyimini iyileştirmek için herhangi bir engel teşkil etmiyor.
Bahsettiğin gibi farklı alternatifler de olacaksa (fxaa vb.) aç-kapa yapmak kullanıcı deneyimi için önemli olabilir. Ancak konuda sadece msaa ele alındığı için yorumum net bir şekilde doğru ve tek başına msaa nin oyun seçeneklerinde yer alması Metin2 açısından denizdeki kum tanesi kadar bile önem teşkil etmiyor. Çünkü oyunun ana grafikleri ve çizimleri zaten başlı başına çöp. Son 15-20 yıl içinde üretilen neredeyse bütün GPU'ların zaten 4x msaa'yı desteklediğini düşünürsek oyuncuya sabit şekilde kaliteli/msaa aktif şekilde görüntü sunmak çok daha mantıklıdır.

Dediğim gibi, Metin2 modern bir oyun olmadığı için tek başına msaa için ayar eklemeye gerek olduğunu düşünmüyorum çünkü bunun kullanıcı deneyimine bile etkisi yok denecek kadar azdır. Nihayetinde Gta5 de veya battlefield gibi oyunlarda açılan msaa ile Metin2 de açılan msaa her ne kadar dolaylı yoldan GPU'ya aynı mesajı verse de, Metin2 nin fosil ve FFP bağımlı yapısı sebebiyle deneyimin kendisi bile aşırı düşük kalıyor, dolayısıyla msaa burada tek başına deneyimi değiştirecek bir faktör değil. Çünkü bilindiği üzere Metin2 default olarak gpudan çok cpuyu sömüren bir oyun.
Msaa nın beraberinde harici özellikler olursa o zaman iş değişebilir tabi.

Yorumum şahsidir, isteyen istediği gibi yapabilir ama ben gereksiz kod kalabalığına girmezdim bunun için.
 
Bahsettiğin gibi farklı alternatifler de olacaksa (fxaa vb.) aç-kapa yapmak kullanıcı deneyimi için önemli olabilir. Ancak konuda sadece msaa ele alındığı için yorumum net bir şekilde doğru ve tek başına msaa nin oyun seçeneklerinde yer alması Metin2 açısından denizdeki kum tanesi kadar bile önem teşkil etmiyor. Çünkü oyunun ana grafikleri ve çizimleri zaten başlı başına çöp. Son 15-20 yıl içinde üretilen neredeyse bütün GPU'ların zaten 4x msaa'yı desteklediğini düşünürsek oyuncuya sabit şekilde kaliteli/msaa aktif şekilde görüntü sunmak çok daha mantıklıdır.

Dediğim gibi, Metin2 modern bir oyun olmadığı için tek başına msaa için ayar eklemeye gerek olduğunu düşünmüyorum çünkü bunun kullanıcı deneyimine bile etkisi yok denecek kadar azdır. Nihayetinde Gta5 de veya battlefield gibi oyunlarda açılan msaa ile Metin2 de açılan msaa her ne kadar dolaylı yoldan GPU'ya aynı mesajı verse de, Metin2 nin fosil ve FFP bağımlı yapısı sebebiyle deneyimin kendisi bile aşırı düşük kalıyor, dolayısıyla msaa burada tek başına deneyimi değiştirecek bir faktör değil. Çünkü bilindiği üzere Metin2 default olarak gpudan çok cpuyu sömüren bir oyun.
Msaa nın beraberinde harici özellikler olursa o zaman iş değişebilir tabi.

Yorumum şahsidir, isteyen istediği gibi yapabilir ama ben gereksiz kod kalabalığına girmezdim bunun için.
Tüm fikirlerinize saygı duyuyorum, sadece fikir alışverişi yapmak ve metin2 kaynak dosyalarını geliştiren arkadaşların zihninde ufuk açmak için kendimi daha net ifade etmek istiyorum. Sadece MSAA için dinamik bir sistem geliştirmeye gerek olmadığını söylediğiniz kısım %100 doğru ve tartışmaya kapalı. MSAA için özellikle bir ayar geliştirilmesine gerek olmadığı görüşünüze ise katılmıyorum böylesi donanım seviyesinde bir değişiklik kullanıcı inisiyatifinde olmalı. Benim yanıtım esasen metin2'nin 3A bir oyun olmaması sebebini sunduğunuz içindi. Oyunun sizin söyleminizle ana grafikleri ve çizimleri ile keskinlik yumuşatma teknolojisi arasında herhangi bir negatif korelasyon olmadığı kanaatindeyim. Metin2 için MSAA kusursuz çalışıyor ve tam olarak yapması gerekeni yapıyor, daha iyi yahut kötü olamaz. DOOM da oynasanız MSAA aynı işi yapıyor. Özellikle eski oyunlarda görsel kalite çok daha düşük olduğundan dolayı nesneler arasındaki keskin görünüm daha çok ön plana çıkıyor. Dolayısıyla, MSAA'nın eski oyunlar üzerindeki görsel etkisinin daha fazla olduğunu düşünüyorum. Daha iyi grafiklere sahip oyunlar bu kusurları görselliğiyle örtebilir. Metin2 özellikle cpu ya da gpu üzerinde yük oluşturmak üzere tasarlanmış bir oyun değil. Oyunun gpu gereksinimi günümüz donanımları nazarında çok düşük kaldığı için 60 fps motora bağlı kaldığınızda gpu kullanımı çok az görünebilir. İşlem sonrası efektleri, yüksek yenileme hızı, normal mapping, depth of field gibi etkenler işin içine girdiğinde 3A oyunları aratmayacak gpu kullanımıyla karşılaşabilirsiniz. CPU kullanımının fazla olmasının sebebi ise yanlış yazılmış bir düzine bağlılığın oluşturduğu darboğazdan ibaret. Zaman ayırdığınız için teşekkür ederim haklı olmadığımı düşündüğünüz her şey için dostluk çerçevesinde eleştiriye ve tartışmaya açığım.
 
Tüm fikirlerinize saygı duyuyorum, sadece fikir alışverişi yapmak ve metin2 kaynak dosyalarını geliştiren arkadaşların zihninde ufuk açmak için kendimi daha net ifade etmek istiyorum. Sadece MSAA için dinamik bir sistem geliştirmeye gerek olmadığını söylediğiniz kısım %100 doğru ve tartışmaya kapalı. MSAA için özellikle bir ayar geliştirilmesine gerek olmadığı görüşünüze ise katılmıyorum böylesi donanım seviyesinde bir değişiklik kullanıcı inisiyatifinde olmalı. Benim yanıtım esasen metin2'nin 3A bir oyun olmaması sebebini sunduğunuz içindi. Oyunun sizin söyleminizle ana grafikleri ve çizimleri ile keskinlik yumuşatma teknolojisi arasında herhangi bir negatif korelasyon olmadığı kanaatindeyim. Metin2 için MSAA kusursuz çalışıyor ve tam olarak yapması gerekeni yapıyor, daha iyi yahut kötü olamaz. DOOM da oynasanız MSAA aynı işi yapıyor. Özellikle eski oyunlarda görsel kalite çok daha düşük olduğundan dolayı nesneler arasındaki keskin görünüm daha çok ön plana çıkıyor. Dolayısıyla, MSAA'nın eski oyunlar üzerindeki görsel etkisinin daha fazla olduğunu düşünüyorum. Daha iyi grafiklere sahip oyunlar bu kusurları görselliğiyle örtebilir. Metin2 özellikle cpu ya da gpu üzerinde yük oluşturmak üzere tasarlanmış bir oyun değil. Oyunun gpu gereksinimi günümüz donanımları nazarında çok düşük kaldığı için 60 fps motora bağlı kaldığınızda gpu kullanımı çok az görünebilir. İşlem sonrası efektleri, yüksek yenileme hızı, normal mapping, depth of field gibi etkenler işin içine girdiğinde 3A oyunları aratmayacak gpu kullanımıyla karşılaşabilirsiniz. CPU kullanımının fazla olmasının sebebi ise yanlış yazılmış bir düzine bağlılığın oluşturduğu darboğazdan ibaret. Zaman ayırdığınız için teşekkür ederim haklı olmadığımı düşündüğünüz her şey için dostluk çerçevesinde eleştiriye ve tartışmaya açığım.
Yazdıklarının çoğu zaten benim de anlatmak istediğim şey ile örtüşüyor. Ben msaa kötü veya işini düzgün yapmıyor gibisinden bir fikir sunmadım Metin2 için. Aksine dediğin gibi işini layıkıyla yapıyor, benim asıl kastettigim şey şu; Metin2 de modern motor veya render yapısı olmadığı için, objeler, dokular ve diğer tüm grafiksel öğeler aşırı eski ve kalitesiz olduğu için msaa olsun veya olmasın zaten GPU'ya fazla yük bindirmiyor. Bunun bir diğer sebebi de (hatta en önemli sebebi) oyunun ffp yapıda olması. Yani en basit tabirle; Metin2 ekran kartına ne yapılacağını değil, ne çizileceğini söylüyor. Shader yok, özel gpu hesaplamaları yok, özel komutlar yok, efektler yok yani hiçbir harici emir yok. Bu sebeple gpu kullanımı çok düşük oluyor ve yine dediğin gibi bu sefer CPU tarafında hem genel kodlar yüzünden hem de eski dx9 mimarisi yüzünden darboğazlar oluşuyor. Draw call fazlalığı da tuzu biberi oluyor..

Bu noktadan bakıldığında; zaten çok düşük kullanıma sahip olan GPU'ya bir tane msaa komutu göndermek default Metin2 için üzerinde çok da durulmaya değer bir olay olmadığını düşünüyorum. Yorumlarımda kastettigim şey tam olarak buydu aslında. Yani sabit olarak aktif şekilde kullanılmasinda da hiçbir sakınca olmayacaktır. Son olarak yazdıklarım herhangi birine yönelik bir eleştiri değildir, sadece şahsi fikirlerimden ibaret. Yani haklı-haksız gibi bir durum söz konusu değil, dediğin gibi sadece fikir alışverişinden ibaret.
 
Geri
Üst