SAĞANAK SAĞANAK YAĞMUR YAĞIYOR.
içerik amaçlı paylaşıyorum.
verison2
ses youtubeden eklendi.
version 2.1 daha az cpu
Kod:
Kod:
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.
- userinterface.cpp.rar 9.4 KB
ç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;
};
bandicam 2026-03-20 15-08-07-723
martysama v5.8 altyapı winmergeyle karsıalstırarak nereye ne keldim bakarsınız.
GameLib.tar - Jotti's malware scan
gamelib



