Hallo zusammen,
ich möchte berichten, dass nun V1.1.10 online ist.
In der letzten Woche war ich arg eingespannt mit dem Thema. Um das Optimum herauszuholen muss man doch tief einsteigen. Und es gibt einen Haufen Fallstricke.
Nun, was hat sich getan:
Das Wichtigste ist eine saubere Verkettung und Abstufung aller beteiligten Threads in dem Programm unter Berücksichtigung von Prozess- und Threadprioritäten. Dabei kann man nicht beliebig die Prioritäten hochschrauben (wozu man mit Programmen wie Pocess Lasso schnell mal in Versuchung gerät), es kann sogar kontraproduktiv sein.
Generell sollte die Ein-/Ausgabe in Richtung Soundkarte möglichst ohne Unterbrechungen laufen. Hierzu hat der Soundkartentreiber bereits eine hohe Priorität (wobei der Treiber immer noch mit anderen Treibern im System in Konkurrenz steht. Man will ja auch nicht, dass die Grafik flackert etc.). Wenn man nun dem Anwenderprogramm die höchsten Prios verpasst, dann unterbricht u.U. das eigene Programm den Treiber, weil es gleichberechtigt ist und damit auch mal an die Reihe kommt. Also genügend darunter bleiben.
Bei ASIO ist ein Bufferswitch-Thread für den Datenaustausch mit dem Treiberprogramm zuständig. Dieser läuft ebenfalls mit THREAD_PRIORITY_TIME_CRITICAL. Nun sind die Puffer nicht allzugroß, üblich sind z.B. 512, 1024 oder 2048 Samples. Bei mehreren Kanälen und langen Filtern kann man die CPU richtig ins Schwitzen bringen. Ergo werden die ASIO-Puffer ihrerseits wiederum in größeren Puffern zwischengepuffert. Wenn dann ein Zwischenpuffer voll ist, wird auf einen zweiten umgeschaltet und zur Bearbeitung des ersten Zwischenpuffers ein weiterer Thread gestartet.
In diesem Thread finden nun die rechenintensiven Prozesse statt. Diese müssen fertig sein, bevor der nächste Zwischenpuffer fertig ist. Aus der Bearbeitungzeit und der Pufferzeit ergibt sich der Echtzeitindex. Welcher einerseits nicht zu groß werden darf, damit der CPU auch noch Zeit für andere Aufgaben zur Verfügung steht (das sind interne Prozesse aber auch andere vom Anwender aufgerufene Programme). Die Filterung darf ihrerseits ebenfalls nicht gestoppt werden, insofern ist hier wiederum eine abgestufte Priorität festzulegen. Die aber immer noch höher als bei anderen Programmen sein sollte.
Zuletzt gibt es auch noch Anzeigen auf der Benutzeroberfläche und Reaktionen auf Benutzereingaben. Was mit einer normalen Priorität erfolgt.
Was sich nun so einfach liest, ist aber doch tricky. Man wünscht sich ja auch, dass bei Mehrkern-CPUs die Filterung von Kanälen parallel auf den Kernen in eigenen Threads läuft. Ausnutzung aller Ressourcen eben. Weiterhin gibt es diverse Möglichkeiten der grundsätzlichen Gestaltung der Filterung. Auch, wie man auf eine Filterumschaltung reagiert.
Und daher folgen nach 5% Inspiration eben 95% Transpiration.
So. Und nun hoffe ich, dass bis zur nächsten Version eine gewisse Ruhezeit einkehrt. Es gibt ja noch viel anderes zu tun.
Grüsse
Uli
PS: es bleibt noch anzumerken, dass es natürlich Sinn macht, unnötige Programme oder Dienste zu dekativieren, so sie denn auch wirklich laufen bzw. wirklich aktiv werden könnten. Ebenfalls sollte man Systembremsen wie Energieoptionen oder Aero rausnehmen (Anpassung auf optimale Leistung). Leider kann man Windows nicht dahingehend konfigurieren, dass es alle restlichen Aufgaben dann erledigt, wenn dafür auch Zeit verfügbar wäre. So verbleibt einem zumeist nur das Abschalten unnötiger Prozesse. Oder vielleicht auch das Herabsenken von Prioritäten mit Process Lasso.