Âşık der inci tenden,
İncinme incitenden,
Kemâlde noksân imiş,
İncinen incitenden...
Lûtfî (Alvarlı Efe)
Bu projenin büyük bir kısmı Gemini'nin ai yardımıyla geliştirildi.
MSAA harika bir özellik olsa da, aynı zamanda sistem üzerinde büyük bir yük oluşturur. Özellikle dahili bir ekran kartı kullanıyorsanız, GPU kullanımını %99 seviyesine kadar çıkarabilir.
Normalde oyunlar 2x MSAA veya 4x MSAA gibi seçenekler sunar ve bu özellik yalnızca siz manuel olarak etkinleştirdiğinizde devreye girer.
Ancak MartySama bunu otomatik hale getirdi; yani ekran kartı MSAA'yı destekliyorsa, oyun bu özelliği otomatik olarak etkinleştiriyor.
Bu durum nedeniyle, ekran kartı teknik olarak MSAA'yı desteklese bile GPU kullanımı %99'a fırlayabilir (özellikle Intel dahili GPU'larında).
Metin2 gibi bir oyunda bu özelliği kaldırmanızı şiddetle tavsiye ederim.
gtx 1060 6 gb
intel hd 4600
statemanager.cpp
grpdevice.cpp
İncinme incitenden,
Kemâlde noksân imiş,
İncinen incitenden...
Lûtfî (Alvarlı Efe)
Bu projenin büyük bir kısmı Gemini'nin ai yardımıyla geliştirildi.
MSAA harika bir özellik olsa da, aynı zamanda sistem üzerinde büyük bir yük oluşturur. Özellikle dahili bir ekran kartı kullanıyorsanız, GPU kullanımını %99 seviyesine kadar çıkarabilir.
Normalde oyunlar 2x MSAA veya 4x MSAA gibi seçenekler sunar ve bu özellik yalnızca siz manuel olarak etkinleştirdiğinizde devreye girer.
Ancak MartySama bunu otomatik hale getirdi; yani ekran kartı MSAA'yı destekliyorsa, oyun bu özelliği otomatik olarak etkinleştiriyor.
Bu durum nedeniyle, ekran kartı teknik olarak MSAA'yı desteklese bile GPU kullanımı %99'a fırlayabilir (özellikle Intel dahili GPU'larında).
Metin2 gibi bir oyunda bu özelliği kaldırmanızı şiddetle tavsiye ederim.
gtx 1060 6 gb
intel hd 4600
statemanager.cpp
Kod:
void CStateManager::SetDefaultState()
{
D3DCAPS9 d3dCaps;
m_lpD3DDev->GetDeviceCaps(&d3dCaps);
// Anizotropik Filtreleme Desteği Kontrolleri
if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
m_dwBestMagFilter = D3DTEXF_ANISOTROPIC;
else
m_dwBestMagFilter = D3DTEXF_LINEAR;
if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC)
m_dwBestMinFilter = D3DTEXF_ANISOTROPIC;
else
m_dwBestMinFilter = D3DTEXF_LINEAR;
// [DÜZELTME 1] Modern sistemler için Anisotropy limitini 16'ya yükseltiyoruz (Görsel kaliteyi tavan yaptırır)
// YENİ HALİ:
DWORD dwMax = d3dCaps.MaxAnisotropy;
// Maksimum 4x ile sınırla (Performans ve görüntü kalitesi dengesi için en ideali)
dwMax = dwMax > 4 ? 4 : dwMax;
for (int i = 0; i < 8; ++i)
m_lpD3DDev->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, dwMax);
m_CurrentState.ResetState();
m_CopyState.ResetState();
m_ChipState.ResetState();
m_bScene = false;
m_bForce = true;
D3DXMATRIX Identity;
D3DXMatrixIdentity(&Identity);
SetTransform(D3DTS_WORLD, &Identity);
SetTransform(D3DTS_VIEW, &Identity);
SetTransform(D3DTS_PROJECTION, &Identity);
D3DMATERIAL9 DefaultMat;
ZeroMemory(&DefaultMat, sizeof(D3DMATERIAL9));
DefaultMat.Diffuse.r = 1.0f;
DefaultMat.Diffuse.g = 1.0f;
DefaultMat.Diffuse.b = 1.0f;
DefaultMat.Diffuse.a = 1.0f;
DefaultMat.Ambient.r = 1.0f;
DefaultMat.Ambient.g = 1.0f;
DefaultMat.Ambient.b = 1.0f;
DefaultMat.Ambient.a = 1.0f;
DefaultMat.Emissive.r = 0.0f;
DefaultMat.Emissive.g = 0.0f;
DefaultMat.Emissive.b = 0.0f;
DefaultMat.Emissive.a = 0.0f;
DefaultMat.Specular.r = 0.0f;
DefaultMat.Specular.g = 0.0f;
DefaultMat.Specular.b = 0.0f;
DefaultMat.Specular.a = 0.0f;
DefaultMat.Power = 0.0f;
SetMaterial(&DefaultMat);
SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);
SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);
SetRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL);
SetRenderState(D3DRS_LASTPIXEL, FALSE);
SetRenderState(D3DRS_ALPHAREF, 1);
SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
SetRenderState(D3DRS_FOGSTART, 0);
SetRenderState(D3DRS_FOGEND, 0);
SetRenderState(D3DRS_FOGDENSITY, 0);
SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF);
SetRenderState(D3DRS_AMBIENT, 0x00000000);
SetRenderState(D3DRS_LOCALVIEWER, FALSE);
SetRenderState(D3DRS_NORMALIZENORMALS, FALSE);
SetRenderState(D3DRS_VERTEXBLEND, D3DVBF_DISABLE);
SetRenderState(D3DRS_CLIPPLANEENABLE, 0);
// [DÜZELTME 2] Pure Device aktifken bu fonksiyonu çağırmak driver hatasına yol açar.
// Donanımsal köşe işleme (Hardware Vertex Processing) kullanıldığı için devre dışı bırakıldı.
// m_lpD3DDev->SetSoftwareVertexProcessing(false);
// [DÜZELTME 3] MSAA kapalı olduğu için bunu da FALSE yapıyoruz. Sürücünün boşa çalışmasını engeller.
SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, FALSE);
SetRenderState(D3DRS_MULTISAMPLEMASK, 0xFFFFFFFF);
SetRenderState(D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE);
SetRenderState(D3DRS_COLORWRITEENABLE, 0xFFFFFFFF);
SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
SetRenderState(D3DRS_FOGENABLE, FALSE);
SetRenderState(D3DRS_FOGCOLOR, 0xFF000000);
SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_NONE);
SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR);
SetRenderState(D3DRS_RANGEFOGENABLE, FALSE);
SetRenderState(D3DRS_ZENABLE, TRUE);
SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
SetRenderState(D3DRS_DITHERENABLE, TRUE);
SetRenderState(D3DRS_STENCILENABLE, FALSE);
SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
SetRenderState(D3DRS_CLIPPING, TRUE);
SetRenderState(D3DRS_LIGHTING, FALSE);
SetRenderState(D3DRS_SPECULARENABLE, FALSE);
SetRenderState(D3DRS_COLORVERTEX, FALSE);
SetRenderState(D3DRS_WRAP0, 0);
SetRenderState(D3DRS_WRAP1, 0);
SetRenderState(D3DRS_WRAP2, 0);
SetRenderState(D3DRS_WRAP3, 0);
SetRenderState(D3DRS_WRAP4, 0);
SetRenderState(D3DRS_WRAP5, 0);
SetRenderState(D3DRS_WRAP6, 0);
SetRenderState(D3DRS_WRAP7, 0);
SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);
SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
for (DWORD i = 1; i < 8; ++i)
{
SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_DISABLE);
SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE);
SetTextureStageState(i, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
SetTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
SetTextureStageState(i, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
SetTextureStageState(i, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
}
for (DWORD i = 0; i < 8; ++i)
{
SetTextureStageState(i, D3DTSS_TEXCOORDINDEX, i);
}
// [DÜZELTME 4] Büyük Filtreleme Hatası Düzeltildi!
for (DWORD i = 0; i < 8; ++i)
{
SetSamplerState(i, D3DSAMP_MINFILTER, m_dwBestMinFilter); // LINEAR yerine hesaplanan anizotropik değer verildi.
SetSamplerState(i, D3DSAMP_MAGFILTER, m_dwBestMagFilter); // LINEAR yerine hesaplanan anizotropik değer verildi.
SetSamplerState(i, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); // MIPFILTER asla ANISOTROPIC olamaz, LINEAR yapıldı.
SetSamplerState(i, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
SetSamplerState(i, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
SetTextureStageState(i, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
SetTexture(i, nullptr);
}
SetPixelShader(0);
SetFVF(D3DFVF_XYZ);
// [DÜZELTME 5] Gereksiz GPU veri transferi (Stall/Darboğaz engelleme)
// Shader sabitlerini (Constants) her default state çağrısında tamamen sıfırlamak (özellikle yüzlerce vector4 verisini)
// GPU pipeline'ında tıkanmaya (stall) sebep olur. Sadece ilk 4 register gibi kritik alanlar sıfırlanabilir
// veya modern sistemlerde bu işlem tamamen kaldırılabilir. Performans için bu ağır blok hafifletildi.
D3DXVECTOR4 av4Null[4]{};
SetVertexShaderConstant(0, av4Null, 4);
SetPixelShaderConstant(0, av4Null, 4);
m_bForce = false;
#ifdef _DEBUG
int i, j;
for (i = 0; i < STATEMANAGER_MAX_RENDERSTATES; i++)
m_bRenderStateSavingFlag[i] = FALSE;
for (j = 0; j < STATEMANAGER_MAX_TRANSFORMSTATES; j++)
m_bTransformSavingFlag[j] = FALSE;
for (j = 0; j < STATEMANAGER_MAX_STAGES; ++j)
for (i = 0; i < STATEMANAGER_MAX_TEXTURESTATES; ++i)
m_bTextureStageStateSavingFlag[j][i] = FALSE;
for (j = 0; j < STATEMANAGER_MAX_STAGES; ++j)
for (i = 0; i < STATEMANAGER_MAX_SAMPLERSTATES; ++i)
m_bSamplerStateSavingFlag[j][i] = FALSE;
#endif _DEBUG
}
grpdevice.cpp
Kod:
int CGraphicDevice::Create(HWND hWnd, int iHres, int iVres, bool Windowed, int /*iBit*/, int iReflashRate, int /*Antialiasing*/)
{
int iRet = CREATE_OK;
Destroy();
ms_iWidth = iHres;
ms_iHeight = iVres;
ms_hWnd = hWnd;
ms_hDC = GetDC(hWnd);
ms_lpd3d = nullptr;
// D3D9Ex başlatılıyor
HRESULT hrEx = Direct3DCreate9Ex(D3D_SDK_VERSION, &ms_lpd3d);
if (FAILED(hrEx) || !ms_lpd3d)
return CREATE_NO_DIRECTX;
if (!ms_kD3DDetector.Build(*ms_lpd3d, EL3D_ConfirmDevice))
return CREATE_ENUM;
std::string stDevList;
ms_kD3DDetector.GetString(&stDevList);
D3D_CAdapterInfo * pkD3DAdapterInfo = ms_kD3DDetector.GetD3DAdapterInfop(ms_iD3DAdapterInfo);
if (!pkD3DAdapterInfo)
{
Tracenf("adapter %d is EMPTY", ms_iD3DAdapterInfo);
return CREATE_DETECT;
}
if (__IsInDriverBlackList(*pkD3DAdapterInfo))
{
iRet |= CREATE_BAD_DRIVER;
__WarningMessage(hWnd, CREATE_BAD_DRIVER);
}
const D3D_SModeInfo * pkD3DModeInfo = pkD3DAdapterInfo->GetD3DModeInfop(ms_iD3DDevInfo, ms_iD3DModeInfo);
if (!pkD3DModeInfo)
{
Tracenf("device %d, mode %d is EMPTY", ms_iD3DDevInfo, ms_iD3DModeInfo);
return CREATE_DETECT;
}
const D3DADAPTER_IDENTIFIER9& rkD3DAdapterId = pkD3DAdapterInfo->GetIdentifier();
if (Windowed &&
strnicmp(rkD3DAdapterId.Driver, "3dfx", 4)==0 &&
22 == pkD3DAdapterInfo->GetDesktopD3DDisplayModer().Format)
{
return CREATE_FORMAT;
}
if (pkD3DModeInfo->m_dwD3DBehavior == D3DCREATE_SOFTWARE_VERTEXPROCESSING)
{
iRet |= CREATE_NO_TNL;
}
std::string stModeInfo;
pkD3DModeInfo->GetString(&stModeInfo);
int ErrorCorrection = 0;
RETRY:
ZeroMemory(&ms_d3dPresentParameter, sizeof(ms_d3dPresentParameter));
ms_d3dPresentParameter.Windowed = Windowed;
ms_d3dPresentParameter.BackBufferWidth = iHres;
ms_d3dPresentParameter.BackBufferHeight = iVres;
ms_d3dPresentParameter.hDeviceWindow = hWnd;
// [OPTİMİZASYON 1] Modern SwapEffect ve D3DPRESENTFLAG_DONOTWAIT
if (Windowed)
{
ms_d3dPresentParameter.BackBufferCount = max(2U, m_uBackBufferCount);
ms_d3dPresentParameter.SwapEffect = D3DSWAPEFFECT_FLIPEX;
}
else
{
ms_d3dPresentParameter.BackBufferCount = max(1U, m_uBackBufferCount);
ms_d3dPresentParameter.SwapEffect = D3DSWAPEFFECT_DISCARD;
}
if (Windowed)
{
ms_d3dPresentParameter.BackBufferFormat = pkD3DAdapterInfo->GetDesktopD3DDisplayModer().Format;
}
else
{
ms_d3dPresentParameter.BackBufferFormat = pkD3DModeInfo->m_eD3DFmtPixel;
ms_d3dPresentParameter.FullScreen_RefreshRateInHz = iReflashRate;
}
// [OPTİMİZASYON 2] VSync Kapatıldı ve GPU Bekleme Süresi Minimize Edildi
ms_d3dPresentParameter.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
// D3DPRESENTFLAG_DONOTWAIT: Eğer GPU meşgulse, CPU'nun kilitlenip beklemesini engeller.
// Bu, özellikle zayıf ekran kartlarında ekran takılmalarını (lag spike) büyük oranda önler.
// ms_d3dPresentParameter.Flags = D3DPRESENTFLAG_DONOTWAIT;
ms_d3dPresentParameter.EnableAutoDepthStencil = TRUE;
ms_d3dPresentParameter.AutoDepthStencilFormat = pkD3DModeInfo->m_eD3DFmtDepthStencil;
// MSAA (Multisampling) tamamen devre dışı (Düşük donanım için mükemmel tercih)
ms_d3dPresentParameter.MultiSampleType = D3DMULTISAMPLE_NONE;
ms_d3dPresentParameter.MultiSampleQuality = 0;
// [OPTİMİZASYON 3] Cihaz Davranış Bayrakları (Device Behavior Flags)
DWORD dwBehavior = pkD3DModeInfo->m_dwD3DBehavior;
// Pure Device: İşlemciyi (CPU) Direct3D API yükünden kurtarır.
if (dwBehavior & D3DCREATE_HARDWARE_VERTEXPROCESSING)
{
dwBehavior |= D3DCREATE_PUREDEVICE;
}
// 9Ex VRAM Yönetimi: Ekran kartı belleği temizlenirken oluşan dropları tamamen keser.
dwBehavior |= D3DCREATE_DISABLE_DRIVER_MANAGEMENT_EX;
// Çok Çekirdek (Multi-threading) uyumsuzluklarını önlemek için güvenli bayrak
dwBehavior |= D3DCREATE_NOWINDOWCHANGES;
ms_dwD3DBehavior = dwBehavior;
D3DDISPLAYMODEEX fmEx;
ZeroMemory(&fmEx, sizeof(fmEx));
if (!Windowed)
{
fmEx.Size = sizeof(D3DDISPLAYMODEEX);
fmEx.Width = iHres;
fmEx.Height = iVres;
fmEx.RefreshRate = iReflashRate;
fmEx.Format = pkD3DModeInfo->m_eD3DFmtPixel;
fmEx.ScanLineOrdering = D3DSCANLINEORDERING_PROGRESSIVE;
}
// [OPTİMİZASYON 4] D3D9Ex Cihazını Oluşturma
if (FAILED(ms_hLastResult = ms_lpd3d->CreateDeviceEx(
ms_iD3DAdapterInfo,
D3DDEVTYPE_HAL,
hWnd,
dwBehavior,
&ms_d3dPresentParameter,
Windowed ? nullptr : &fmEx,
&ms_lpd3dDevice)))
{
switch (ms_hLastResult)
{
case D3DERR_INVALIDCALL:
Tracen("IDirect3DDevice.CreateDeviceEx - ERROR D3DERR_INVALIDCALL");
break;
case D3DERR_NOTAVAILABLE:
Tracen("IDirect3DDevice.CreateDeviceEx - ERROR D3DERR_NOTAVAILABLE");
break;
case D3DERR_OUTOFVIDEOMEMORY:
Tracen("IDirect3DDevice.CreateDeviceEx - ERROR D3DERR_OUTOFVIDEOMEMORY");
break;
default:
Tracenf("IDirect3DDevice.CreateDeviceEx - ERROR %d", ms_hLastResult);
break;
}
if (ErrorCorrection)
return CREATE_DEVICE;
iReflashRate = 0;
++ErrorCorrection;
iRet = CREATE_REFRESHRATE;
goto RETRY;
}
if(ms_lpd3d->CheckDeviceFormat(ms_iD3DAdapterInfo, D3DDEVTYPE_HAL, ms_d3dPresentParameter.BackBufferFormat, 0, D3DRTYPE_TEXTURE, D3DFMT_DXT1) == D3DERR_NOTAVAILABLE)
ms_bSupportDXT = false;
if(ms_lpd3d->CheckDeviceFormat(ms_iD3DAdapterInfo, D3DDEVTYPE_HAL, ms_d3dPresentParameter.BackBufferFormat, 0, D3DRTYPE_TEXTURE, D3DFMT_DXT3) == D3DERR_NOTAVAILABLE)
ms_bSupportDXT = false;
if(ms_lpd3d->CheckDeviceFormat(ms_iD3DAdapterInfo, D3DDEVTYPE_HAL, ms_d3dPresentParameter.BackBufferFormat, 0, D3DRTYPE_TEXTURE, D3DFMT_DXT5) == D3DERR_NOTAVAILABLE)
ms_bSupportDXT = false;
if (FAILED((ms_hLastResult = ms_lpd3dDevice->GetDeviceCaps(&ms_d3dCaps))))
{
Tracenf("IDirect3DDevice.GetDeviceCaps - ERROR %d", ms_hLastResult);
return CREATE_GET_DEVICE_CAPS2;
}
// [OPTİMİZASYON 5] Maksimum Kare Gecikmesi (Frame Pacing) Ayarı
// Düşük donanımlı sistemlerde 1 yapmak droplara sebep olabilir.
// 2 veya 3 değeri CPU ve GPU arasındaki nefes alma payını artırır ve takılmaları önler.
if (Windowed)
{
ms_lpd3dDevice->SetMaximumFrameLatency(1);
}
if (!Windowed)
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, iHres, iVres, SWP_SHOWWINDOW);
ms_lpd3dDevice->GetViewport(&ms_Viewport);
m_pStateManager = new CStateManager(ms_lpd3dDevice);
D3DXCreateMatrixStack(0, &ms_lpd3dMatStack);
ms_lpd3dMatStack->LoadIdentity();
ms_pntVS = CreatePNTStreamVertexShader();
ms_pnt2VS = CreatePNT2StreamVertexShader();
D3DXMatrixIdentity(&ms_matIdentity);
D3DXMatrixIdentity(&ms_matView);
D3DXMatrixIdentity(&ms_matProj);
D3DXMatrixIdentity(&ms_matInverseView);
D3DXMatrixIdentity(&ms_matInverseViewYAxis);
D3DXMatrixIdentity(&ms_matScreen0);
D3DXMatrixIdentity(&ms_matScreen1);
D3DXMatrixIdentity(&ms_matScreen2);
ms_matScreen0._11 = 1;
ms_matScreen0._22 = -1;
ms_matScreen1._41 = 1;
ms_matScreen1._42 = 1;
ms_matScreen2._11 = (float) iHres / 2;
ms_matScreen2._22 = (float) iVres / 2;
D3DXCreateSphere(ms_lpd3dDevice, 1.0f, 32, 32, &ms_lpSphereMesh, nullptr);
D3DXCreateCylinder(ms_lpd3dDevice, 1.0f, 1.0f, 1.0f, 8, 8, &ms_lpCylinderMesh, nullptr);
ms_lpd3dDevice->Clear(0L, nullptr, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xff000000, 1.0f, 0);
if (!__CreateDefaultIndexBufferList())
return false;
if (!__CreatePDTVertexBufferList())
return false;
if (strnicmp(rkD3DAdapterId.Driver, "SIS", 3) == 0)
{
GRAPHICS_CAPS_CAN_NOT_DRAW_LINE = true;
GRAPHICS_CAPS_CAN_NOT_DRAW_SHADOW = true;
}
else if (strnicmp(rkD3DAdapterId.Driver, "3dfx", 4) == 0)
{
GRAPHICS_CAPS_CAN_NOT_DRAW_SHADOW = true;
}
return (iRet);
}
Son düzenleme:
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 1
- Görüntüleme
- 242
- Cevaplar
- 18
- Görüntüleme
- 2K
- Cevaplar
- 4
- Görüntüleme
- 552
- Cevaplar
- 14
- Görüntüleme
- 744
