summaryrefslogtreecommitdiff
path: root/synth/OPTIMIZATIONS
blob: 4a0b8b96195d99817adc53f70bf9cf60d5d8d578 (plain)
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
Sinnlose Optimierungen
   o if(foo.fm_strength!=0) ...: kein effekt, höchstens leichter anstieg!
   o dauerndes nutzen von oscillator[i] durch einen curr_osc pointer
     ersetzen (um etwa eine standardabweichung schneller -> kein
     wirklicher effekt)
   o if (out>0) und tremolo-lfo: den if-check weglassen:
     bringt einen performanceverlust von einer respektive drei
     standardabweichungen
 
Mögliche Optimierungen
   o  1% noten kriegen direkten pointer auf ihre waves; (custom_wave-check entfällt)
   x 15% fm-liste (die nur die oscs mit fm[i]!=0 enthält) statt
         in O(n²) alle durchzutesten: bei 2 oszillatoren kein effekt,
         bei 9 oscs der form 1->2->3...->9 (also 9 mod-beziehungen)
         17% verbesserung
   o ??? Channel::get_sample() soll mehrere frames berechnen.
         soll außerdem das /ONE*VOL_FACTOR gleich mit einrechnen
         (kann einmalig gleich mit Channel::volume verrechnet werden)
   x 33% BOTTLENECKs in note.cpp fixen. actual_freq und abhängigkeiten
         nur dann berechnen, wenn sie sich auch ändert (set_freq, porta,
         pitchbend, freq-envelope)
   o ??? log_verbose sollte ggf. garnicht interpretiert werden?

   o 10% filter ganz auf fixed_t umstellen?
   o  5% envelope::get_level nur alle n frames arbeiten lassen, sonst cachen?
   o  2% bei LFOs: bei jedem LFO-update die werte für env-max, freqfactor
               und filter-offset aus orig berechnen
   o  2% beim filter: evtl nur mit floats statt mit doubles rechnen?
   o <2% in note::get_sample u.a.: pitch-bending effizienter lösen?
   o ??? Note's ctor kopiert viel unnötiges. besser:
         channels bekommen je. eine kopie aller programme
         noten bekommen nur noch pointer auf channeleigene kopie
         note->set_param wird unnötig
         pfactor-zeuch läuft extra: wird kopiert, und bei jeder
         pfactor-änderung mit dem pfactor verrechnet         
   o ??? seltener cleanup rufen, stattdessen als inaktiv markieren
          -> effekt: noten können wiederverwendet werden, seltenere ctor-aufrufe
   o ??? KSL mit powf und floats statt mit double umschreiben
   o ??? statt lfo-nummer direkten zugriff auf curr_lfo angeben?
   o ??? bei tremolo (und vibrato?): eventuell nicht prüfen, obs aktiviert
         ist, sondern zur not einfach *1 rechnen?
   o ??? beim default_program vielleicht auch ein optimiertes objekt benutzen?
   x  0% beim channel::get_sample: pro note immer mehrere samples auf
              einmal holen (iterator braucht recht viel leistung)
              wird von g++ automatisch wegoptimiert -> ok
              
Kein negativer Einfluss auf die Performance:
   o _virtual_ void Note::get_samples (mit time nicht erkennbar)