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
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Horus« (19.02.2014, 20:37)
Administrator
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 |
class SoundTransducer { public: SoundTransducer() { LastIn = 0; Avg = 0; LastSample = 0; }; ~SoundTransducer() { }; double Process(double In) { const double Amp = 4000000.f; In *= Amp; double Sample = (Avg - In); if (Sample < -32767) Sample = -32767; if (Sample > 32767) Sample = 32767; Avg = Avg * 0.5f + In * 0.5f; Sample = Sample * 0.5 + LastSample * 0.5; LastSample = Sample; return Sample; }; private: double LastSample; double LastIn; double Avg; }; |
Administrator
3. __assume
http://msdn.microsoft.com/en-us/library/…w(v=vs.90).aspx
Wirkt bei den "heißen" Schleifen wahre Wunder.
Also vor der "for" schon festlegen wie groß der Wert maximal wird. Der Compiler von Visual Studio optimiert dann die Schleife erheblich.
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
__assume(Sector_ParticleCount[Sector] <= SECTOR_PARTICLE_MAXIMUM); for (uint8_t i = 0; i < Sector_ParticleCount[Sector]; ++i) { const StdIndex P2 = Sector_StoredParticle[Sector_GetParticleIndex(Sector, i)]; Particle_InteractCollisionDetect(P1, P2, ThreadCollisionCount, ThreadCollisionIndex); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
const StdIndex Count = Sector_ParticleCount[Sector]; if (Count > 0) { const StdIndex P2_1 = Sector_StoredParticle[Sector_GetParticleIndex(Sector, 0)]; Particle_InteractCollisionDetect(P1, P2_1, ThreadCollisionCount, ThreadCollisionIndex); if (Count > 1) { const StdIndex P2_2 = Sector_StoredParticle[Sector_GetParticleIndex(Sector, 1)]; Particle_InteractCollisionDetect(P1, P2_2, ThreadCollisionCount, ThreadCollisionIndex); if (Count > 2) { const StdIndex P2_3 = Sector_StoredParticle[Sector_GetParticleIndex(Sector, 2)]; Particle_InteractCollisionDetect(P1, P2_3, ThreadCollisionCount, ThreadCollisionIndex); } } } |
Zitat
Naja, von hand unrollen ist etwas meh (und falls du es doch machen willst, dreh es mal um und mach es aggressiver um branches zu sparen!).
Zitat
Der Compiler sollte dazu eigentlich selber in der Lage sein wenn du ihm sagst wie groß das maximal ist, und der Compiler hat auch kein Problem damit deinen Code zu nehmen und ein paar mal leicht verändert rum zu copy and pasten. Und eventuell kann der da auch noch was mit jump tables rausholen.
Zitat
Wo wir allerdings bei caching und SIMD sind, hast du mal mit cache-oblivious data-structures und AVX2 rumgespielt?
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Horus« (17.03.2014, 23:13)
Administrator
Werbeanzeige