- Katılım
- 11 May 2023
- Konular
- 237
- Mesajlar
- 1,032
- Online süresi
- 1ay 23g
- Reaksiyon Skoru
- 678
- Altın Konu
- 1
- Başarım Puanı
- 176
- TM Yaşı
- 2 Yıl 11 Ay 15 Gün
- MmoLira
- 503
- 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.
version 2.1 daha az cpu
martysama v5.8 altyapı winmergeyle karsıalstırarak nereye ne keldim bakarsınız.
gamelib
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;
};
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
martysama v5.8 altyapı winmergeyle karsıalstırarak nereye ne keldim bakarsınız.
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
gamelib
Ekli dosyalar
Son düzenleme:
En Çok Reaksiyon Alan Mesajlar
Öğeyi görmek için üye olmalısınız.
Thanks for sharing... but this isn't rain, it looks more like a bombing.
- Katılım
- 1 Tem 2019
- Konular
- 1,953
- Mesajlar
- 5,201
- Online süresi
- 1ay 8g
- Reaksiyon Skoru
- 3,987
- Altın Konu
- 140
- Başarım Puanı
- 339
- TM Yaşı
- 6 Yıl 9 Ay 24 Gün
- MmoLira
- 39,465
- DevLira
- 150
PAYLAŞIM İÇİN TEŞEKKÜRLER,ELİNE SAĞLIK.
- Katılım
- 2 Ara 2024
- Konular
- 186
- Mesajlar
- 1,946
- Online süresi
- 5ay 13g
- Reaksiyon Skoru
- 1,478
- Altın Konu
- 1
- Başarım Puanı
- 206
- TM Yaşı
- 1 Yıl 4 Ay 18 Gün
- MmoLira
- 12,094
- DevLira
- 36
Eline saglik
Biraz yapmacik gibi duruyor varmi baska alternatifi
Biraz yapmacik gibi duruyor varmi baska alternatifi
- Katılım
- 25 Haz 2024
- Konular
- 6
- Mesajlar
- 52
- Online süresi
- 5g 5542s
- Reaksiyon Skoru
- 45
- Altın Konu
- 0
- Başarım Puanı
- 39
- TM Yaşı
- 1 Yıl 9 Ay 29 Gün
- MmoLira
- 4,165
- DevLira
- 18
Thanks for sharing... but this isn't rain, it looks more like a bombing.
Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)
Benzer konular
- Cevaplar
- 14
- Görüntüleme
- 1K
- Cevaplar
- 4
- Görüntüleme
- 505
- Cevaplar
- 3
- Görüntüleme
- 214
- Cevaplar
- 3
- Görüntüleme
- 187
- Cevaplar
- 4
- Görüntüleme
- 225









