Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
struct particle { enum Type { fire, typeCount }; sf::Vector2f position; sf::Time leftLifetime; }; class particleSystem : public sf::Drawable { public: particleSystem(particle::Type mType); void update(sf::Time timePerFrame); void addParticle(sf::Vector2f position); private: virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override; void updateVertices() const; void addVertex(sf::Vector2f worldPos, sf::Vector2f texCoords, float alphaValue) const; particle::Type mType; sf::Time particleLifetime; const sf::Texture* mTexture; std::deque<particle> particles; mutable sf::VertexArray vertices; }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
particleSystem::particleSystem(particle::Type mType) : mType(mType), mTexture(nullptr), vertices(sf::PrimitiveType::Quads) { switch (mType) { case particle::fire: { mTexture = &Resources::get()->getResource(Holder::particles, Texture::fire); particleLifetime = sf::seconds(1.25f); break; } } } void particleSystem::update(sf::Time timePerFrame) { for (auto& particle : particles) { particle.leftLifetime -= timePerFrame; } while (!particles.empty() && particles.front().leftLifetime <= sf::Time::Zero) particles.pop_front(); } void particleSystem::addParticle(sf::Vector2f position) { particle newParticle; newParticle.position = position; switch (mType) { case particle::fire: newParticle.leftLifetime = particleLifetime; break; } particles.push_back(newParticle); } void particleSystem::draw(sf::RenderTarget& target, sf::RenderStates states) const { updateVertices(); states.texture = mTexture; target.draw(vertices, states); } void particleSystem::updateVertices() const { sf::Vector2f textureSize(mTexture->getSize()); sf::Vector2f halfTextureSize(textureSize / 2.f); vertices.clear(); for (auto& particle : particles) { sf::Vector2f pos = particle.position; float alphaValue = va::max(0.f, 255.f * particle.leftLifetime.asSeconds() / particleLifetime.asSeconds()); addVertex(sf::Vector2f(pos.x - halfTextureSize.x, pos.y - halfTextureSize.y), sf::Vector2f(0, 0), alphaValue); addVertex(sf::Vector2f(pos.x + halfTextureSize.x, pos.y - halfTextureSize.y), sf::Vector2f(textureSize.x, 0), alphaValue); addVertex(sf::Vector2f(pos.x + halfTextureSize.x, pos.y + halfTextureSize.y), sf::Vector2f(textureSize.x, textureSize.y), alphaValue); addVertex(sf::Vector2f(pos.x - halfTextureSize.x, pos.y + halfTextureSize.y), sf::Vector2f(0, textureSize.y), alphaValue); } } void particleSystem::addVertex(sf::Vector2f worldPos, sf::Vector2f texCoords, float alphaValue) const { sf::Vertex newVertex; newVertex.color = sf::Color(255, 255, 255, alphaValue); newVertex.position = worldPos; newVertex.texCoords = texCoords; vertices.append(newVertex); } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »anti-freak« (07.04.2016, 19:37)
Ich vermutete, updateVerticed würde pro Frame aufgerufen.
Zitat
Dein Befüllen des Vectors in updateVertices ist sehr ineffizient. Dieser muss sehr viele mal realloziieren, daher rate ich zu einem reserve bzw rezize davor.
C-/C++-Quelltext |
|
1 |
vertices.resize(4 * particles.size()); |
Zitat
4) Optimiere deine Partikelsystem auf Cachefreundlichkeit.
Zitat
3) Lagere die Berechnungen auf die GPU aus. Da habe ich allerdings wenig Erfahrung.
Zitat
Statt die absolute Zeit der Partikel zu errechnen und im update jeden Einzelnen zu verringern, würde ich die Differenz zum letzt erstellten speichern und somit nur die ersten x Partikel updaten, deren Zeit < FrameTime ist
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »sw1« (07.04.2016, 22:08)
Zitat
Was genau bedeutet Cachefreundlichkeit?
Zitat
Habe ich auch schonmal was von gelesen, bisher aber nichts zu gefunden.
Zitat
Statt die absolute Zeit der Partikel zu errechnen und im update jeden Einzelnen zu verringern, würde ich die Differenz zum letzt erstellten speichern und somit nur die ersten x Partikel updaten, deren Zeit < FrameTime ist
Ich verstehe nicht was du genau meinst, kannst du das nochmal etwas ausführlicher aufschreiben?
Werbeanzeige