Hikayeler

Reklam vermek için turkmmo@gmail.com

Metin2 sağnak yağmur gemini pro yazdı bitirilmedi

apikomt2

Level 6
Uzman
Developer
Katılım
11 May 2023
Konular
237
Mesajlar
1,020
Online süresi
1ay 22g
Reaksiyon Skoru
676
Altın Konu
1
Başarım Puanı
176
TM Yaşı
2 Yıl 11 Ay 14 Gün
MmoLira
497
DevLira
315

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

SAĞANAK SAĞANAK YAĞMUR YAĞIYOR.


içerik amaçlı paylaşıyorum.



verison2



ses youtubeden eklendi.

  • çok fazla cpu kullanıyor.
    %3 den %11 fırladı.
    yağmur sayısı sıklığı gibi şeyler düşürülürse daha iyi olur.
    .dds ekliycektim falat .dds ekelsem dahada kasıcak


version 2.1 daha az cpu

Kod:
#include "StdAfx.h"
#include "RainEnvironment.h"
#include "PythonBackground.h"
#include "PythonApplication.h"

#include "../gamelib/MapOutdoor.h"
#include "../eterlib/StateManager.h"

CRainEnvironment::CRainEnvironment() : m_bEnable(false), m_fNextLightningTime(5.0f), m_fLightningAlpha(0.0f), m_bIsLightning(false) {}
CRainEnvironment::~CRainEnvironment() { Destroy(); }

bool CRainEnvironment::Create() {
    m_vecRainDrops.resize(MAX_RAIN_DROPS);
    m_vecSplashes.resize(MAX_SPLASHES);
    return true;
}

void CRainEnvironment::Destroy() {
    m_vecRainDrops.clear(); m_vecSplashes.clear();
}

void CRainEnvironment::Enable() { m_bEnable = true; }
void CRainEnvironment::Disable() { m_bEnable = false; }

// --- HIZLI SPAWN: rand() yerine sabit artışlar kullanarak CPU'yu rahatlatır ---
void CRainEnvironment::SpawnRainDrop(const D3DXVECTOR3& centerPos) {
    for (auto& drop : m_vecRainDrops) {
        if (!drop.bActive) {
            drop.v3Pos.x = centerPos.x + (float)((rand() % 30000) - 15000);
            drop.v3Pos.y = centerPos.y + (float)((rand() % 30000) - 15000);
            drop.v3Pos.z = centerPos.z + (float)((rand() % 5000) - 500);
            drop.v3Velocity = D3DXVECTOR3(0.0f, 0.0f, (float)(-2000 - (rand() % 500))); // Sadece dikey hız (Daha hızlı)
            drop.bActive = true; break;
        }
    }
}

void CRainEnvironment::SpawnSplash(const D3DXVECTOR3& splashPos) {
    for (auto& splash : m_vecSplashes) {
        if (!splash.bActive) {
            splash.v3Pos = splashPos; splash.v3Pos.z += 2.0f;
            splash.fScale = 0.5f; splash.fAlpha = 0.6f;
            splash.bActive = true; break;
        }
    }
}

void CRainEnvironment::Update(const D3DXVECTOR3& c_rv3Pos) {
    if (!m_bEnable) return;

    // CPU Dostu Zamanlayıcı
    CTimer& rkTimer = CTimer::Instance();
    float fElapsedTime = rkTimer.GetElapsedSecond();
    if (fElapsedTime > 0.1f) fElapsedTime = 0.1f;

    // Yoğunluk Kontrolü
    for (int i = 0; i < 400; ++i) SpawnRainDrop(c_rv3Pos);

    CMapOutdoor& rkMap = CPythonBackground::Instance().GetMapOutdoorRef();
    for (auto& drop : m_vecRainDrops) {
        if (!drop.bActive) continue;
        drop.v3Pos += drop.v3Velocity * fElapsedTime;

        if (abs(drop.v3Pos.x - c_rv3Pos.x) > 16000.0f || abs(drop.v3Pos.y - c_rv3Pos.y) > 16000.0f) {
            drop.bActive = false; continue;
        }

        float fH = rkMap.GetHeight(drop.v3Pos.x, drop.v3Pos.y);
        if (drop.v3Pos.z <= fH) {
            drop.v3Pos.z = fH; SpawnSplash(drop.v3Pos); drop.bActive = false;
        }
    }

    for (auto& s : m_vecSplashes) {
        if (s.bActive) {
            s.fScale += fElapsedTime * 10.0f; s.fAlpha -= fElapsedTime * 2.5f;
            if (s.fAlpha <= 0.0f) s.bActive = false;
        }
    }
}

void CRainEnvironment::Render() {
    if (!m_bEnable) return;

    // --- GPU'YU KİLİTLE (Render State Hazırlığı) ---
    STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE);
    STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    STATEMANAGER.SaveRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    STATEMANAGER.SaveRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE);
    STATEMANAGER.SetTexture(0, nullptr);
    STATEMANAGER.SetVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE);

    // 1. YAĞMUR DAMLALARI (BÜYÜK BATCH)
    // static kullanarak CPU'nun her frame memory allocate etmesini engelliyoruz.
    static std::vector<SVertex> s_renderBuffer;
    s_renderBuffer.clear();
    s_renderBuffer.reserve(MAX_RAIN_DROPS * 2);

    const DWORD headC = D3DCOLOR_ARGB(150, 200, 220, 255);
    const DWORD tailC = D3DCOLOR_ARGB(0, 100, 150, 200);

    for (const auto& d : m_vecRainDrops) {
        if (d.bActive) {
            s_renderBuffer.push_back({ d.v3Pos, headC });
            s_renderBuffer.push_back({ d.v3Pos - (d.v3Velocity * 0.015f), tailC });
        }
    }

    if (!s_renderBuffer.empty()) {
        // Tüm veriyi TEK SEFERDE GPU'ya gönderiyoruz.
        STATEMANAGER.DrawPrimitiveUP(D3DPT_LINELIST, s_renderBuffer.size() / 2, s_renderBuffer.data(), sizeof(SVertex));
    }

    // 2. SIÇRAMALAR
    static std::vector<SVertex> s_splashBuffer;
    s_splashBuffer.clear();
    s_splashBuffer.reserve(MAX_SPLASHES * 6);

    for (const auto& s : m_vecSplashes) {
        if (s.bActive) {
            DWORD c = D3DCOLOR_COLORVALUE(0.6f, 0.7f, 0.8f, s.fAlpha);
            float sz = s.fScale * 6.0f;
            D3DXVECTOR3 v1(s.v3Pos.x - sz, s.v3Pos.y - sz, s.v3Pos.z), v2(s.v3Pos.x + sz, s.v3Pos.y - sz, s.v3Pos.z),
                v3(s.v3Pos.x - sz, s.v3Pos.y + sz, s.v3Pos.z), v4(s.v3Pos.x + sz, s.v3Pos.y + sz, s.v3Pos.z);
            s_splashBuffer.push_back({ v1,c }); s_splashBuffer.push_back({ v2,c }); s_splashBuffer.push_back({ v3,c });
            s_splashBuffer.push_back({ v2,c }); s_splashBuffer.push_back({ v4,c }); s_splashBuffer.push_back({ v3,c });
        }
    }

    if (!s_splashBuffer.empty()) {
        STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLELIST, s_splashBuffer.size() / 3, s_splashBuffer.data(), sizeof(SVertex));
    }

    STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE);
    STATEMANAGER.RestoreRenderState(D3DRS_ZWRITEENABLE);
}


Kod:
#pragma once
#include "../eterlib/GrpScreen.h"
#include <vector>

class CRainEnvironment : public CScreen
{
public:
    CRainEnvironment();
    virtual ~CRainEnvironment();

    bool Create();
    void Destroy();
    void Enable();
    void Disable();
    void Update(const D3DXVECTOR3& c_rv3Pos);
    void Render();

private:
    struct SRainDrop {
        D3DXVECTOR3 v3Pos{ 0.0f, 0.0f, 0.0f };
        D3DXVECTOR3 v3Velocity{ 0.0f, -1500.0f, 0.0f };
        bool bActive{ false };
    };

    struct SSplashPuddle {
        D3DXVECTOR3 v3Pos{ 0.0f, 0.0f, 0.0f };
        float fScale{ 1.0f };
        float fAlpha{ 1.0f };
        bool bActive{ false };
    };

    struct SVertex {
        D3DXVECTOR3 position;
        DWORD color;
    };

    void SpawnRainDrop(const D3DXVECTOR3& centerPos);
    void SpawnSplash(const D3DXVECTOR3& splashPos);

    bool m_bEnable{ false };
    std::vector<SRainDrop> m_vecRainDrops;
    std::vector<SSplashPuddle> m_vecSplashes;

    // Sadece Şimşek (Flash) kaldı
    float m_fNextLightningTime{ 5.0f };
    float m_fLightningAlpha{ 0.0f };
    bool  m_bIsLightning{ false };

    constexpr static size_t MAX_RAIN_DROPS = 4000;
    constexpr static size_t MAX_SPLASHES = 2000;
};














martysama v5.8 altyapı winmergeyle karsıalstırarak nereye ne keldim bakarsınız.


gamelib
 

Ekli dosyalar

  • GameLib.tar
    143.5 KB · Görüntüleme: 0
  • userinterface.cpp.rar
    9.4 KB · Görüntüleme: 0
Son düzenleme:

En Çok Reaksiyon Alan Mesajlar

PAYLAŞIM İÇİN TEŞEKKÜRLER,ELİNE SAĞLIK.
 
Eline saglik

Biraz yapmacik gibi duruyor varmi baska alternatifi
 
1774011752793.png

Thanks for sharing... but this isn't rain, it looks more like a bombing.
 

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

Geri
Üst