OpenSesame
Rapunzel Code Editor
DataMatrix
Support forum
Python Tutorials
MindProbe
Supported by

Zeitsteuerung

Diese Seite beschreibt verschiedene Probleme im Zusammenhang mit der Zeitsteuerung und bietet Benchmark-Ergebnisse sowie Tipps zum Testen Ihres eigenen Systems. Wenn Sie Probleme mit der Zeitsteuerung feststellen, nehmen Sie sich bitte die Zeit, diese Seite zu lesen. Viele Probleme werden durch Berücksichtigung von Aspekten wie der Stimulusvorbereitung und den Eigenschaften Ihres Monitors behoben.

Ist OpenSesame in der Lage, Timing in Millisekunden-Präzision durchzuführen?

Die kurze Antwort ist: ja. Die lange Antwort ist der Rest dieser Seite.

Wichtige Überlegungen für zeitkritische Experimente

Überprüfen Sie Ihr Timing!

OpenSesame ermöglicht es Ihnen, die Zeitsteuerung Ihres Experiments sehr genau zu kontrollieren. Das garantiert jedoch nicht in jedem spezifischen Experiment eine genaue Zeitsteuerung! Aus verschiedenen Gründen, von denen viele auf dieser Seite beschrieben sind, können Sie Probleme mit der Zeitsteuerung haben. Daher sollten Sie in zeitkritischen Experimenten immer überprüfen, ob das Timing in Ihrem Experiment wie vorgesehen ist. Der einfachste Weg, dies zu tun, besteht darin, die von OpenSesame gemeldeten Bildschirmtimestamps zu überprüfen.

Jedes sketchpad-Element hat eine Variable namens time_[sketchpad name], die den Zeitstempel des letzten Moments enthält, in dem das sketchpad angezeigt wurde. Wenn Sie also möchten, dass das sketchpad Ziel (engl. "target") für 100 ms angezeigt wird, gefolgt von dem sketchpad Maske (engl. "mask"), sollten Sie überprüfen, ob time_mask - time_target tatsächlich 100 ist. Bei Verwendung von Python-Inline-Code können Sie die Tatsache nutzen, dass canvas.show() den Bildschirmtimestamp zurückgibt.

Ihren Monitor verstehen

Computermonitore aktualisieren sich periodisch. Wenn beispielsweise die Aktualisierungsrate Ihres Monitors 100 Hz beträgt, wird das Display alle 10 ms (1000 ms / 100 Hz) aktualisiert. Das bedeutet, dass ein visueller Reiz immer für eine Dauer präsentiert wird, die ein Vielfaches von 10 ms ist und Sie können einen Reiz nicht für z.B. 5 oder 37 ms darstellen. Die häufigste Aktualisierungsrate beträgt 60 Hz (= 16,67 ms Aktualisierungszyklus), obwohl Monitore mit wesentlich höheren Aktualisierungsraten manchmal für Experimentalsysteme verwendet werden.

In Video 1 können Sie sehen, wie ein Monitorupdate in Zeitlupe aussieht. Bei CRT-Monitoren (d. h. nicht-Flachbildschirm, Mitte) ist das Update ein einzelner Pixel, der sich von links nach rechts und von oben nach unten über den Monitor bewegt. Daher wird nur ein Pixel gleichzeitig beleuchtet, weshalb CRT-Monitore leicht flackern. Bei LCD- oder TFT-Monitoren (Flachbildschirm, links und rechts) erfolgt die Aktualisierung als "Flood Fill" von oben nach unten. Daher flackern LCD- und TFT-Monitore nicht. (Es sei denn, Sie präsentieren einen flackernden Reiz, natürlich.)

Video 1. Ein Zeitlupenvideo des Aktualisierungszyklus auf CRT (Mitte) und LCD/ TFT-Monitoren. Video mit freundlicher Genehmigung von Jarik den Hartog und dem technischen Support der VU University Amsterdam.

Wenn ein neues Stimulus-Display präsentiert wird, während der Aktualisierungszyklus zur Hälfte durchlaufen ist, wird ein "Tearing" beobachtet. Das bedeutet, dass die obere Hälfte des Monitors das alte Display zeigt, während die untere Hälfte das neue Display zeigt. Dies wird im Allgemeinen als unerwünscht angesehen, und daher sollte ein neues Display genau in dem Moment präsentiert werden, in dem der Aktualisierungszyklus von oben beginnt. Dies wird als "Synchronisation mit der vertikalen Aktualisierung" oder einfach "V-Sync" bezeichnet. Wenn V-Sync aktiviert ist, ist Tearing nicht mehr sichtbar, da der Riss mit dem oberen Rand des Monitors zusammenfällt. V-Sync ändert jedoch nichts an der Tatsache, dass ein Monitor nicht sofort aktualisiert wird und daher immer für einige Zeit sowohl das alte als auch das neue Display zeigt.

Ein weiteres wichtiges Konzept ist das des "Blockierens beim vertikalen Retrace" oder des "blockierenden Flip". Normalerweise, wenn Sie einen Befehl senden, um eine neue Anzeige anzuzeigen, wird der Computer diesen Befehl sofort akzeptieren und die anzuzeigende Anzeige in eine Warteschlange stellen. Die Anzeige erscheint jedoch möglicherweise erst später auf dem Monitor, in der Regel erst zum Beginn des nächsten Aktualisierungszyklus (vorausgesetzt, die V-Sync ist aktiviert). Daher wissen Sie nicht genau, wann die Anzeige erschienen ist, da Ihre Zeitstempel den Moment widerspiegeln, in dem die Anzeige in die Warteschlange gestellt wurde, und nicht den Moment, in dem sie präsentiert wurde. Um dieses Problem zu umgehen, können Sie einen sogenannten "blockierenden Flip" verwenden. Dies bedeutet im Grunde, dass der Computer beim Senden eines Befehls zur Anzeige einer neuen Anzeige einfriert, bis die Anzeige tatsächlich erscheint. Dies ermöglicht Ihnen sehr genaue Anzeigezeitstempel, zu Lasten einer erheblichen Leistungseinbuße, da der Computer während des Wartens auf die Anzeige eines Displays zum großen Teil eingefroren ist. Für Experimentzwecke gilt der blockierende Flip jedoch im Allgemeinen als optimale Strategie.

Schließlich können LCD-Monitore unter "Eingangslatenz" leiden. Dies bedeutet, dass es eine zusätzliche und manchmal variable Verzögerung zwischen dem Moment gibt, in dem der Computer "denkt", dass eine Anzeige erscheint, und dem Moment, in dem die Anzeige tatsächlich erscheint. Diese Verzögerung resultiert aus verschiedenen Formen der digitalen Verarbeitung, die vom Monitor durchgeführt werden, wie beispielsweise Farbkorrektur oder Bildglättung. Soweit ich weiß, kann die Eingangslatenz nicht programmgesteuert gelöst werden, und Sie sollten Monitore mit einer signifikanten Eingangslatenz für zeitkritische Experimente vermeiden.

Für eine verwandte Diskussion siehe:

Die Aktualisierungsfrist einhalten

Stellen Sie sich vor, Sie kommen um 10:30 Uhr am Bahnhof an. Ihr Zug fährt um 11:00 Uhr ab, das gibt Ihnen genau 30 Minuten Zeit, um einen Kaffee zu holen. Wenn Sie jedoch genau 30 Minuten lang Kaffee trinken, erreichen Sie die Plattform genau rechtzeitig, um Ihren Zug abfahren zu sehen, und Sie müssen auf den nächsten Zug warten. Wenn Sie also 30 Minuten Zeit haben, sollten Sie etwas weniger als 30 Minuten lang Kaffee trinken, wie zum Beispiel 25 Minuten.

Die Situation ähnelt der Angabe von Intervallen für die Präsentation visueller Reize. Angenommen, Sie haben einen 100-Hz-Monitor (also 1 Aktualisierung alle 10 ms) und möchten einen Zielreiz für 100 ms darstellen, gefolgt von einer Maske. Ihre erste Neigung könnte sein, ein Intervall von genau 100 ms zwischen dem Ziel und der Maske anzugeben, denn das ist schließlich, was Sie wollen. Wenn Sie jedoch genau ein Intervall von 100 ms angeben, wird die Maske höchstwahrscheinlich die "Aktualisierungsfrist verpassen" und erst im nächsten Aktualisierungszyklus präsentiert, der 10 ms später ist (vorausgesetzt, V-Sync ist aktiviert). Wenn Sie also ein Intervall von 100 ms angeben, erhalten Sie in den meisten Fällen ein Intervall von 110 ms!

Die Lösung ist einfach: Sie sollten ein Intervall angeben, das etwas kürzer ist als das, was Sie erreichen möchten, beispielsweise 95 ms. Machen Sie sich keine Sorgen, dass das Intervall zu kurz ist, denn auf einem 100-Hz-Monitor ist das Intervall zwischen zwei Reizanzeigen zwangsläufig ein Vielfaches von 10 ms. Daher werden 95 ms zu 100 ms (10 Frames), 1 ms werden zu 10 ms (1 Frame) usw. Anders ausgedrückt, Intervalle werden aufgerundet (niemals abgerundet!) zum nächstgelegenen Intervall, das mit der Bildwiederholfrequenz Ihres Monitors vereinbar ist.

Deaktivieren von Desktop-Effekten

Viele moderne Betriebssysteme nutzen grafische Desktop-Effekte. Diese bieten beispielsweise die Transparenzeffekte und die sanften Minimierungs- und Maximierungseffekte von Fenstern, die Sie auf den meisten modernen Betriebssystemen sehen. Obwohl die Software, aus denen diese Effekte bestehen, von System zu System variiert, bilden sie im Allgemeinen eine zusätzliche Schicht zwischen Ihrer Anwendung und der Anzeige. Diese zusätzliche Schicht kann verhindern, dass OpenSesame sich mit dem vertikalen Neuaufbau synchronisiert und / oder einen blockierenden Flip implementiert.

Obwohl Desktop-Effekte möglicherweise Probleme verursachen, tun sie dies normalerweise nicht. Dies scheint von System zu System und von Grafikkarte zu Grafikkarte unterschiedlich zu sein. Trotzdem ist es am besten, Desktop-Effekte auf Systemen, die für experimentelle Tests verwendet werden, zu deaktivieren, wenn das Betriebssystem dies zulässt.

Einige Tipps zu Desktop-Effekten für die verschiedenen Betriebssysteme:

  • Unter Windows XP gibt es überhaupt keine Desktop-Effekte.
  • Unter Windows 7 können Desktop-Effekte deaktiviert werden, indem eines der unter "Einfache und hoher Kontrast Designs" aufgeführten Designs in der "Personalisierung" ausgewählt wird.
  • Unter Windows 10 gibt es keine Möglichkeit, Desktop-Effekte vollständig zu deaktivieren.
  • Unter Ubuntu und anderen Linux-Distributionen, die Gnome 3 verwenden, gibt es keine Möglichkeit, Desktop-Effekte vollständig zu deaktivieren.
  • Unter Linux-Distributionen, die KDE verwenden, können Sie Desktop-Effekte im Abschnitt "Desktop-Effekte" der Systemeinstellungen deaktivieren.
  • Unter Mac OS gibt es anscheinend keine Möglichkeit, Desktop-Effekte vollständig zu deaktivieren.

Stimulus-Vorbereitungszeit / die Prepare-Run-Struktur berücksichtigen

Wenn Ihnen genaues Timing während der visuellen Stimuluspräsentation wichtig ist, sollten Sie Ihre Stimuli im Voraus vorbereiten. Auf diese Weise erhalten Sie während der zeitkritischen Teile Ihres Experiments keine unvorhersehbaren Verzögerungen durch die Stimulusvorbereitung.

Betrachten wir zunächst ein Skript (Sie können dies in ein inline_script-Element einfügen), das die Stimulus-Vorbereitungszeit im Intervall zwischen canvas1 und canvas2 einschließt (% LstStimPrepBad). Das angegebene Intervall beträgt 95 ms, so dass - unter Berücksichtigung der in [Making the refresh deadline] beschriebenen 'Aufrundungsregel' - ein Intervall von 100 ms auf meinem 60-Hz-Monitor zu erwarten wäre. Auf meinem Testsystem führt das unten stehende Skript jedoch zu einem Intervall von 150 ms, was 9 Frames auf einem 60-Hz-Monitor entspricht. Dies ist eine unerwartete Verzögerung von 50 ms oder 3 Frames aufgrund der Vorbereitung von canvas2.

# Warning: This is an example of how you should *not*
# implement stimulus presentation in time-critical
# experiments.
#
# Prepare canvas 1 and show it
canvas1 = Canvas()
canvas1 += Text('This is the first canvas')
t1 = canvas1.show()
# Sleep for 95 ms to get a 100 ms delay
clock.sleep(95)
# Prepare canvas 2 and show it
canvas2 = Canvas()
canvas2 += Text('This is the second canvas')
t2 = canvas2.show()
# The actual delay will be more than 100 ms, because
# stimulus preparation time is included. This is bad!
print('Actual delay: %s' % (t2-t1))

Betrachten wir nun eine einfache Variation des oben genannten Skripts (Listing 2). Dieses Mal bereiten wir zunächst sowohl canvas1 als auch canvas2 vor und präsentieren sie erst danach. Auf meinem Testsystem ergibt dies ein konstantes Intervall von 100 ms, genau wie es sein sollte!

# Prepare canvas 1 and 2
canvas1 = Canvas()
canvas1 += Text('This is the first canvas')
canvas2 = Canvas()
canvas2 += Text('This is the second canvas')
# Show canvas 1
t1 = canvas1.show()
# Sleep for 95 ms to get a 100 ms delay
clock.sleep(95)
# Show canvas 2
t2 = canvas2.show()
# The actual delay will be 100 ms, because stimulus
# preparation time is not included. This is good!
print('Actual delay: %s' % (t2-t1))

Bei Verwendung der grafischen Benutzeroberfläche gelten die gleichen Überlegungen, aber OpenSesame hilft Ihnen, indem es die meiste Stimulus-Vorbereitung automatisch im Voraus behandelt. Sie müssen jedoch berücksichtigen, dass diese Vorbereitung auf Ebene der sequence-Elemente und nicht auf Ebene der loop-Elemente erfolgt. Praktisch gesehen bedeutet dies, dass das Timing * innerhalb * einer sequence nicht durch die Stimulus-Vorbereitungszeit beeinträchtigt wird. Das Timing * zwischen * sequences jedoch schon.

Um dies konkreter zu machen, betrachten wir die unten gezeigte Struktur (Figure 1). Nehmen wir an, die Dauer des sketchpad-Elements ist auf 95 ms eingestellt, um eine Dauer von 100 ms anzustreben, oder 6 Frames auf einem 60-Hz-Monitor. Auf meinem Testsystem beträgt die tatsächliche Dauer 133 ms oder 8 Bilder, weil das Timing durch die Vorbereitung des sketchpad-Elements beeinträchtigt wird, das jedes Mal ausgeführt wird, wenn die Sequenz ausgeführt wird. Dies ist also ein Beispiel dafür, wie Sie zeitkritische Teile Ihres Experiments nicht implementieren sollten.

/pages/de/manual/img/timing/stimulus-preparation-incorrect.png

Figure 1.

Betrachten wir jetzt die unten gezeigte Struktur (Figure 2). Angenommen, die Dauer von sketchpad1 beträgt 95 ms, mit dem Ziel, ein 100 ms Intervall zwischen sketchpad1 und sketchpad2 zu erreichen. In diesem Fall werden beide Elemente als Teil derselben sequence angezeigt, und das Timing wird nicht durch Stimulus-Vorbereitungszeit beeinflusst. Auf meinem Testsystem beträgt das tatsächliche Intervall zwischen sketchpad1 und sketchpad2 daher tatsächlich 100 ms oder 6 Frames auf einem 60-Hz-Monitor.

Beachten Sie, dass dies nur für das Intervall zwischen sketchpad1 und sketchpad2 gilt, da sie in dieser Reihenfolge als Teil derselben Sequenz ausgeführt werden. Das Intervall zwischen sketchpad2 beim Durchlauf i und sketchpad1 beim Durchlauf i+1 wird wieder durch Stimulus-Vorbereitungszeit beeinflusst.

/pages/de/manual/img/timing/stimulus-preparation-correct.png

Figure 2.

Für weitere Informationen siehe:

Unterschiede zwischen Backends

OpenSesame ist nicht an eine bestimmte Art der Steuerung von Display, System-Timer usw. gebunden. Daher hat OpenSesame per se keine spezifischen Timing-Eigenschaften, da diese vom verwendeten Backend abhängen. Die Leistungsmerkmale der verschiedenen Backends sind nicht perfekt korreliert: Es ist möglich, dass auf einem System das psycho-Backend am besten funktioniert, während auf einem anderen System das xpyriment- Backend am besten funktioniert. Eine der großen Vorteile von OpenSesame ist daher, dass Sie auswählen können, welches Backend für Sie am besten funktioniert!

Im Allgemeinen sind die xpyriment und psycho Backends für zeitkritische Experimente vorzuziehen, da sie einen blockierenden Flip verwenden. Auf der anderen Seite ist das legacy Backend etwas stabiler und auch deutlich schneller bei der Verwendung von forms.

Unter normalen Umständen haben die drei aktuellen OpenSesame-Backends die in %TblBackendInfo gezeigten Eigenschaften.

%-- Tabelle: id: TblBackendInfo source: backend-info.csv Beschriftung: Eigenschaften der Backends. --%

Siehe auch:

Benchmark-Ergebnisse und Tipps für das Testen Ihres eigenen Systems

Überprüfung, ob V-Sync aktiviert ist

Wie unter [Verständnis für Ihren Monitor] beschrieben, sollte die Präsentation eines neuen Displays idealerweise mit dem Beginn eines neuen Aktualisierungszyklus (d. h. 'V-Sync') übereinstimmen. Sie können testen, ob dies der Fall ist, indem Sie Displays unterschiedlicher Farben in schneller Abfolge präsentieren. Wenn V-Sync nicht aktiviert ist, werden Sie deutlich horizontale Linien sehen, die über den Monitor laufen (d. h. 'Tearing'). Um diesen Test durchzuführen, führen Sie ein Experiment mit dem folgenden Skript in einem inline_script- Element aus (Listing 3):

# Create a blue and a yellow canvas
blue_canvas = Canvas(bgcolor='blue')
yellow_canvas = Canvas(bgcolor='yellow')
# Create a keyboard object
my_keyboard = Keyboard(timeout=0)
# Alternately present the blue and yellow canvas until
# a key is pressed.
while my_keyboard.get_key()[0] is None:
    blue_canvas.show()
    clock.sleep(95)
    yellow_canvas.show()
    clock.sleep(95)

Präzision und Genauigkeit der Zeitmessung testen

Die Zeitmessung ist präzise oder konsistent, wenn Sie visuelle Reize immer wieder mit der gleichen Zeit präsentieren können. Zeitstempel sind genau, wenn sie genau widerspiegeln, wann visuelle Reize auf dem Monitor erscheinen. Das untenstehende Skript zeigt, wie Sie die Präzision und Genauigkeit der Zeitmessung überprüfen können. Dieser Test kann sowohl mit als auch ohne eine externe Fotodiode durchgeführt werden, obwohl die Verwendung einer Fotodiode eine zusätzliche Überprüfung bietet.

Um die Dinge einfach zu halten, nehmen wir an, dass Ihr Monitor mit 100 Hz arbeitet, was bedeutet, dass eine einzelne Bildwiederholung 10 ms dauert. Das Skript präsentiert dann eine weiße Leinwand für 1 Bildwiederholung (10 ms). Als nächstes präsentiert das Skript eine schwarze Leinwand für 9 Bildwiederholungen (90 ms). Beachten Sie, dass wir eine Dauer von 85 angegeben haben, die aufgerundet wird, wie unter [Making the refresh deadline] erklärt. Daher erwarten wir, dass das Intervall zwischen dem Beginn von zwei aufeinanderfolgenden weißen Anzeigen 10 Bildwiederholungen oder 100 ms beträgt (= 10 ms + 90 ms).

Wir können zwei Methoden verwenden, um zu überprüfen, ob das Intervall zwischen zwei weißen Anzeigen tatsächlich 100 ms beträgt:

  1. Mit den von OpenSesame gemeldeten Zeitstempeln. Dies ist der einfachste Weg und im Allgemeinen genau, wenn das Backend ein blockierendes Flip verwendet.
  2. Mit einer Fotodiode, die auf den Beginn der weißen Anzeigen reagiert und die Zeitstempel dieser Anfänge auf einem externen Computer protokolliert. Dies ist der beste Weg, um die Zeitmessung zu überprüfen, da er nicht auf die Selbstbeobachtung der Software angewiesen ist. Bestimmte Probleme, wie z. B. TFT-Input-Lag, die oben diskutiert wurden, treten nur mit der externen Fotodiodenmessung auf.
# The numbers in this script assume a 100 Hz refresh rate! Adjust the numbers
# according to your monitor.
import numpy as np
# The interval for the black canvas. This will be 'rounded up' to 90 ms, or 9
# frames.
interval = 85
# The number of presentation cycles to test.
N = 100
# Create a black and a white canvas.
white_canvas = Canvas(bgcolor='white')
black_canvas = Canvas(bgcolor='black')
# Create an array to store the timestamps for the white display.
a_white = np.empty(N)
# Loop through the presentation cycles.
for i in range(N):
    # Present a white canvas for a single frame. I.e. do not wait at all after
    # the presentation.
    a_white[i] = white_canvas.show()
    # Present a black canvas for 9 frames. I.e. wait for 85 ms after the
    # presentation.
    black_canvas.show()
    clock.sleep(interval)
# Write the timestamps of the white displays to a file.
np.savetxt('timestamps.txt', a_white)
# For convenience, summarize the intervals between the white displays and print
# this to the debug window.
d_white = a_white[1:]-a_white[:-1]
print('M = %.2f, SD = %.2f' % (d_white.mean(), d_white.std()))

Ich habe Listing 4 unter Windows XP mit allen drei Backends ausgeführt. Ich habe auch die Beginn der weißen Anzeigen mit einer Fotodiode aufgenommen, die an einen zweiten Computer angeschlossen war. Die Ergebnisse sind in Table 1 zusammengefasst.

backend Session Source M (ms) SD (ms)
xpyriment 1.0000 OpenSesame 100.0000 0.6200
    Photodiode 100.0100 0.0200
  2.0000 OpenSesame 100.0100 0.7900
    Photodiode 100.0100 0.0200
psycho 1.0000 OpenSesame 100.0000 0.0100
    Photodiode 100.0100 0.0200
  2.0000 OpenSesame 100.0000 0.0100
    Photodiode 100.0100 0.0200
legacy 1.0000 OpenSesame 90.0000 0.5200
    Photodiode 90.0000 0.0300
  2.0000 OpenSesame 90.0000 0.4900
    Photodiode 90.0000 0.0200

Table 1. Benchmark-Ergebnisse für Listing 4. Getestet mit Windows XP, HP Compaq dc7900, Intel Core 2 Quad Q9400 @ 2.66Ghz, 3GB, 21" ViewSonic P227f CRT. Jeder Test wurde zweimal durchgeführt (d. h. zwei Sitzungen). Die Spalte Session entspricht verschiedenen Testläufen. Die Spalte Source zeigt an, ob die Messungen von einer externen Fotiodiode stammen oder auf den internen Zeitstempeln von OpenSesame basieren.

Wie Sie sehen können, zeigen die xpyriment und psycho Backends konsistent ein 100 ms Intervall. Das ist gut und entspricht unseren Erwartungen. Das legacy Backend zeigt jedoch ein 90 ms Intervall. Diese Diskrepanz ist darauf zurückzuführen, dass das legacy Backend kein blockierendes Flip verwendet (siehe [Understanding your monitor]), was zu einer gewissen Unvorhersehbarkeit in der Anzeigezeit führt. Beachten Sie auch, dass die Zeitstempel, die von der externen Fotodiode aufgezeichnet wurden, und die von OpenSesame gemeldeten Zeitstempel eng übereinstimmen. Diese Übereinstimmung zeigt, dass OpenSesame's Zeitstempel zuverlässig sind, obwohl sie für das legacy Backend aufgrund des fehlenden blockierenden Flips etwas weniger zuverlässig sind.

Expyriment Benchmarks und Test-Suite

Ein sehr schönes Set von Benchmarks ist auf der Expyriment-Website verfügbar. Diese Informationen sind anwendbar auf OpenSesame-Experimente mit dem xpyriment Backend.

Expyriment enthält eine sehr nützliche Test-Suite. Sie können diese Test-Suite starten, indem Sie das Beispiel-Experiment test_suite.opensesame ausführen oder Ihrem Experiment ein einfaches inline_script mit den folgenden Codezeilen hinzufügen (Listing 5):

import expyriment
expyriment.control.run_test_suite()

For more information, please visit:

PsychoPy Benchmarks und zeitbezogene Informationen

Einige Informationen über die Zeitsteuerung finden Sie auf der PsychoPy-Dokumentationsseite. Diese Informationen gelten für OpenSesame Experimente, die das psycho Backend verwenden.

Supported by