/usr/share/psychtoolbox-3/PsychDocumentation/ProgrammingTips.html is in psychtoolbox-3-common 3.0.9+svn2579.dfsg1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!--Converted with jLaTeX2HTML 2002 (1.62) JA patch-1.4
patched version by: Kenshi Muto, Debian Project.
LaTeX2HTML 2002 (1.62),
original version by: Nikos Drakos, CBLU, University of Leeds
* revised and updated by: Marcus Hennecke, Ross Moore, Herb Swan
* with significant contributions from:
Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
<HTML>
<HEAD>
<TITLE>Performance & Timing - HOWTO for Psychtoolbox on OS-X
Draft - Version 0.1 - PTB 1.0.5-MK4 and later</TITLE>
<META NAME="description" CONTENT="Performance & Timing - HOWTO for Psychtoolbox on OS-X
Draft - Version 0.1 - PTB 1.0.5-MK4 and later">
<META NAME="keywords" CONTENT="PTB2005">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="jLaTeX2HTML v2002 JA patch-1.4">
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
<LINK REL="STYLESHEET" HREF="PTB2005.css">
</HEAD>
<BODY >
<!--Navigation Panel-->
<IMG WIDTH="81" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next_inactive"
SRC="file:/usr/share/latex2html/icons/nx_grp_g.png">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up"
SRC="file:/usr/share/latex2html/icons/up_g.png">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous"
SRC="file:/usr/share/latex2html/icons/prev_g.png">
<BR>
<BR>
<BR>
<!--End of Navigation Panel-->
<P>
<P>
<P>
<H1 ALIGN="CENTER">Performance & Timing - HOWTO for Psychtoolbox on OS-X
<BR><I>Draft - Version 0.1 - PTB 1.0.5-MK4 and later</I></H1>
<P ALIGN="CENTER"><STRONG>Mario Kleiner</STRONG></P>
<H3>Abstract:</H3>
<DIV>
This document is a collection of tips and explanation on how to achieve
high drawing performance, accurate visual stimulus presentation timing
and accurate presentation timestamps under Psychtoolbox for Mac OS-X,
Versions 1.0.5-MK4, 1.0.6 and later. It explains on how to setup your
machine for a well running experiment, how to structure your code
for maximum performance, how to achieve timed presentation of stimuli
and how to check for proper presentation timing. A short introduction
into how PTB works internally is also provided. This document is not
meant as a comprehensive manual about the Psychtoolbox - Look at the
demos and examples provided with PTB or ask your colleagues for a
basic introduction.
<P>
This document was "hacked together" in a hurry by
a person who doesn't like writing user-manuals and is not a native
english speaker, so please apologize the bad english and poor structure
of this document - after all, it's free.
</DIV>
<P>
<BR>
<H2><A NAME="SECTION00010000000000000000">
Contents</A>
</H2>
<!--Table of Contents-->
<UL>
<LI><A NAME="tex2html21"
HREF="PTB2005.html">1 Introduction</A>
<LI><A NAME="tex2html22"
HREF="PTB2005.html#SECTION00030000000000000000">2 System design</A>
<UL>
<LI><A NAME="tex2html23"
HREF="PTB2005.html#SECTION00031000000000000000">2.1 MacOS-X is not a realtime operating system</A>
<LI><A NAME="tex2html24"
HREF="PTB2005.html#SECTION00032000000000000000">2.2 Screen's use of OpenGL and why you should care...</A>
</UL>
<BR>
<LI><A NAME="tex2html25"
HREF="PTB2005.html#SECTION00040000000000000000">3 Optimal machine setup for experiments</A>
<LI><A NAME="tex2html26"
HREF="PTB2005.html#SECTION00050000000000000000">4 Programming tips</A>
<UL>
<LI><A NAME="tex2html27"
HREF="PTB2005.html#SECTION00051000000000000000">4.1 Optimal structure of the code</A>
<LI><A NAME="tex2html28"
HREF="PTB2005.html#SECTION00052000000000000000">4.2 Special commands and their usage</A>
<LI><A NAME="tex2html29"
HREF="PTB2005.html#SECTION00053000000000000000">To be continued - Stay tuned...</A>
</UL>
<BR>
<LI><A NAME="tex2html30"
HREF="PTB2005.html#SECTION00060000000000000000">About this document ...</A>
</UL>
<!--End of Table of Contents-->
<P>
<H1><A NAME="SECTION00020000000000000000">
1 Introduction</A>
</H1>
<P>
The explanations in this document only apply to the Psychtoolbox for
MacOS-X version 1.0.5 with the updated Screen.mexmac file from Mario
Kleiner et al. (Version "Build-1.0.5-MK4R1" or later)
and all official Psychtoolbox Versions starting at release 1.0.6 or
later. The document is in a <I>Draft</I> state, not finished or polished
at all and subject to updates in the future, but it should be already
useful for your daily work.
<P>
The rest of the document is structured as follows: Section <A HREF="PTB2005.html#sec:System-design-and">2</A>
gives a brief overview about technical details of the implementation
of MacOS-X and of Psychtoolbox and the consequences this will have
for your experiments. Section <A HREF="PTB2005.html#sec:Optimal-machine-setup">3</A> describes
how to setup your machine for optimal presentation timing. Section
<A HREF="PTB2005.html#sub:Optimal-structure">4.1</A> describes how you should structure your
code for maximum performance and timing accuracy. Section <A HREF="PTB2005.html#sub:Special-commands">4.2</A>
describes commands that have been added to PTB 1.0.6 and section <A HREF="PTB2005.html#sub:Screen_Flip_">4.2.3</A>
finally explains how to do timed stimulus presentation and how to
use the various timestamps returned for proper checking of presentation
timing.
<P>
Limitation of liability: This document is provided <I>"as
is"</I> without any implicit or explicit guarantees for correctness.
I made the best effort to summarize what i believe to know (from the
internal design of PTB's relevant routines and OS-X, as well as from
my own testing) about the optimal way to do things, but in the end
you never know what kind of bugs, changes in implementation and side-effects
in Psychtoolbox itself, Matlab, MacOS-X and your specific graphics
card will interact with each other and the bugs of your experiment
to screw up things. So, check your presentation timing carefully and
ask at the forum if you get stuck. Good luck!
<P>
<H1><A NAME="SECTION00030000000000000000"></A><A NAME="sec:System-design-and"></A>
<BR>
2 System design
</H1>
<P>
<H2><A NAME="SECTION00031000000000000000">
2.1 MacOS-X is not a realtime operating system</A>
</H2>
<P>
MacOS-X is designed by Apple as a <I>general purpose operating
system (GP-OS).</I> All existing GP-OS'es have two things in common:
<P>
<UL>
<LI>They are easy to use by the user, allow relatively pain-free, easy
and fast development of very powerful applications by software developers
and provide a wide range of functionality and hardware support.
</LI>
<LI>They are *not* capable of hard-realtime operation by design!
</LI>
</UL>
While the first item is a big advantage for users and programmers,
item two is a problem if you try to perform visual psychophysics with
highly controlled presentation timing at millisecond accuracy. A modern
multitasking OS always executes multiple tasks in parallel to your
Matlab experiment script: e-mail clients periodically check for -
or receive e-mails for you, iTunes has to fetch data over the network
or from your harddisk and feed it into the sound driver to play your
mp3's or to stream them to other users on the network if "Music
sharing" is enabled, virus scanners scan for viruses in the
background, the system software update process checks for new updates
on the Apple website, the desktop interface has to update the digital
clock display every second, any mouse movement triggers the graphics
server in order to move the mouse cursor accordingly, Matlab has to
blink its cursor, check the current working directory for changed
files and check its license if you have a license server installed
at your place. And there are multiple internal system processes that
have to do background work to keep your system running, e.g., check
keyboard and mouse for activity, process network data packets from
other computers, manage the virtual memory, write out data to disk
so it doesn't get lost on a power failure or system crash. All these
processes run in parallel to your experiment and compete for system
ressources like memory, processor time and also ressources on your
graphics adaptor. If some of these processes win the race for system
ressources shortly before the scheduled time of your stimulus onset,
it will delay execution of your code and the system will miss the
presentation deadline, which leads to skipped frames or screwed up
timing, finally to a spoiled trial.
<P>
Psychtoolbox tries to reduce interruptions of your Matlab script by
other processes as much as possible by switching the Matlab process
to <I>realtime priority scheduling -</I> It asks the operating system
to give your code as much processing time as it needs, immediately
whenever it needs it, prioritizing the needs for processing time of
your experiment over the needs of <I>all other</I> system processes.
While this mechanism (enabled by use of the <I>Priority() and Rush()</I>
commands) significantly reduces the amount of timing jitter and unwanted
interruptions, the protection of your script is not perfect - that's
why this mode of operation is called <I>soft-realtime</I> in engineering
terms. There are multiple ways how the timing of a realtime-script
can be screwed up. If your script either <I>voluntarily pauses</I>,
e.g., by use of the <I>WaitSecs()</I> command, or if it <I>has
to pause</I> because it has to wait for some specific event or activity
to happen or complete, e.g., reading of data from harddisk, waiting
for the vertical retrace of the display until stimulus-onset can happen,
responses from keyboard or mouse, the system will give other processes
a bit of processing time, so they can execute while your application
is "sleeping". During this slice of time, they can
perform actions that will interfere with the execution timing of your
script, as soon as it "wakes up" again:
<P>
<UL>
<LI>Other applications can allocate large amounts of system memory while
your application sleeps: If more memory is needed than is free, the
OS will move out bits of your scripts memory to the disk drive (so
called "paging" or "swapping")
to free up memory for the application that requests memory. If your
application wakes up, it has to reclaim its data by reading it back
from disk. This can takes multiple dozen milliseconds of time.
</LI>
<LI>Other applications can <I>lock</I> internal system ressources. If
your script (or Matlab itself) happens to need these ressources, it
will be delayed until "the other application" voluntarily
releases the lock.
</LI>
<LI>Other applications can trigger complex graphics operations on the
graphics hardware GPU: They steal GPU computation ressources and video
RAM that is urgently needed by your script for stimulus drawing and
display.
</LI>
</UL>
Another problem of the <I>soft-realtime</I> mode: If your script doesn't
give up the CPU sometimes for some milliseconds, releasing it to other
applications and the operating system, you can interfere with low
level system functions that are <I>needed</I> by your script to work
properly. E.g., if you don't sleep enough via Screen('Flip') or WaitSecs(),
you will prevent the mouse- and keyboard handling routines of the
OS from running, so subjects mouse or keyboard responses don't get
reported to your script - or they get reported with <I>large random
delay</I>, screwing up reaction time measurements!
<P>
There is no easy and automatic way that would allow PTB to protect
you from any of these sources of timing delays<A NAME="tex2html1"
HREF="#foot369"><SUP>1</SUP></A>. Only <I>careful setup and preparation</I> of your computer and Matlab
before the experiment and sticking to some <I>programming rules</I>
when writing your experiment can reduce these effects to a minimum,
minimizing the number of trials that need to be rejected due to messed
up presentation timing.
<P>
<H2><A NAME="SECTION00032000000000000000">
2.2 Screen's use of OpenGL and why you should care...</A>
</H2>
<P>
The "old" Psychtoolboxes for <I>MacOS9</I> and <I>Windows</I>
don't utilize modern graphics hardware. All drawing routines are mostly
implemented in code written in the programming language C, that is
executing on the computer's main processor (<I>CPU</I>), so the speed
of drawing operations is mostly determined by the speed of your computers
CPU. The <I>Screen</I> command of the new Psychtoolbox for OS-X (<I>PTB</I>)
uses the plattform independent graphics library <I>OpenGL</I> for
all drawing operations and for control of stimulus onset. This has
three advantages compared to the old implementations:
<P>
<UL>
<LI><I>Portability</I>: As OpenGL is available and well supported as a
"built-in" feature for all major operating systems
(MacOS-X, GNU/Linux, FreeBSD, Unix'es in general, Microsoft Windows)
it will be easier and therefore faster to create versions of the new
Psychtoolbox for other operating systems, as soon as the OS-X version
has stabilized and reached a level of maturity as the old MacOS-9
version.
</LI>
<LI><I>Performance:</I> OpenGL is a 3D computer graphics API used by 3D
applications like 3D graphics design packages, Scientifc data visualization,
virtual reality simulators - and most importantly, as they are the
driving market forces - video games. Most OpenGL functions are directly
implemented in the graphics processing units (<I>GPU's</I>) of modern
graphics adaptors by highly specialized and extremely fast electronic
circuitry. Using OpenGL for drawing allows PTB to make optimal use
of the fast GPU's of modern graphics cards. This allows for much faster
drawing speeds compared to the old PTB's as well as a lot of new drawing
functions that weren't available in the old PTB's
</LI>
<LI><I>Parallelism:</I> The GPU executes most drawing commands <I>independently</I>
and <I>in parallel</I> to the execution of other PTB functions and
your MATLAB code on the CPU. This allows your MATLAB script to execute
commands other than the SCREEN drawing commands, e.g., checking for
keyboard presses, mouse button presses, taking of timestamps, execution
of your experiment code, while the GPU is drawing your stimulus in
the background. So more work can be done in each iteration of your
experiment loop.
</LI>
</UL>
This technical advantages should allow you to:
<P>
<UL>
<LI>Draw the same stimuli at higher monitor refresh rates without skipping
presentation deadlines.
</LI>
<LI>Draw more complex stimuli and bigger images at a given monitor refresh
rate.
</LI>
<LI>Create a lot of stimuli "on-the-fly" that you had
to precompute into Offscreen-Windows under the old PTB. This saves
you trial setup time and costly memory upgrades for some experiments.
</LI>
</UL>
There are also a few consequences associated with the parallel nature
of drawing in PTB:
<P>
<UL>
<LI>The order of commands in your stimulus presentation loop matters:
Depending on where you place your commands with respect to the Screen('Flip')
command, speed and timing accuracy of your script can either largely
improve, or get worse.
</LI>
<LI>Simple timing of the duration of drawing commands with <I>tic,
toc or GetSecs</I> doesn't work anymore or gives wrong and confusing
results, because these commands only measure how long it takes Matlab+PTB
to <I>submit</I> those drawing commands to the GPU for execution,
<I>not</I> how long it takes the GPU to execute the drawing commands!
You need to use special timing functions for performing these measurements.
</LI>
<LI>Your graphics card matters: The more recent (and therefore more advanced
and faster) your graphics adaptor, the better. Also the amount of
local video memory (<I>VRAM</I>) that is installed can decide, what
you can do quickly. The speed and memory size of your graphics hardware
can be much more important than the speed of your CPU, especially
when drawing many images or long "movies" with the
Screen('DrawTexture'...) command!
</LI>
</UL>
In order to let the GPU do as much drawing work as possible in parallel
to the CPU, you need to submit all drawing commands early in the presentation
loop (immediately after the Screen('Flip') command) and you need to
tell the GPU when all drawing commands are submitted for the current
stimulus. How to do this? See section <A HREF="PTB2005.html#sub:Screen__DrawingFinished__">4.2.4</A>.
<P>
<H1><A NAME="SECTION00040000000000000000"></A><A NAME="sec:Optimal-machine-setup"></A>
<BR>
3 Optimal machine setup for experiments
</H1>
<P>
As explained in section <A HREF="PTB2005.html#sec:System-design-and">2</A>, a lot of other
applications and system processes can interfere with proper execution
of your experiment script, despite the use of Priority() and Rush().
The <I>only way to avoid or reduce</I> this interference is by <I>eliminating</I>
as many of the distractors as possible:
<P>
<UL>
<LI>Buy and install enough RAM! Enough is a matter of your specific experiment:
512 MB are recommended as a minimum for any kind of experiment if
you want to be safe, 256 MB <I>may</I> be enough for experiments with
very simple stimuli and <I>none</I> or <I>very few</I> images. If
you create a lot of images via Screen('MakeTexture'), more memory
(1 GB?) might be appropriate: You can calculate the amount of memory
consumed by <I>n</I> images of width <I>w</I> and height <I>h</I>
pixels as:
<BR><I>m=n*w*h*d</I>
<BR>
where <I>d=1</I> for pure gray images and <I>d=4</I> for anything
else (gray + transparency, true color RGB and RGB + transparency).
You should have at least that amount of memory plus 200 MB to be on
the safe side. Otherwise the system could decide to page out memory
to harddisk when you create your textures. Reading them back from
disk during your trial will certainly spoil the timing of your presentation.
</LI>
<LI>Quit all applications and tools on your machine that are not absolutely
necessary for your experiment, especially: Disable <I>automatic
software updates</I> of MacOS-X - they could start in the middle of an
experiment, <I>disable virus scanners</I> - they create a lot of disc
activity and CPU load if they decide to scan anything during your
session, <I>disable the file indexing service and the new Spotlight</I>
search mechanism of OS-X 10.4 - see <I>virus scanners</I> for explanation.
Close all unnecessary desktop applications like Safari, iTunes, Microsoft
Office, ... - Matlab should be the only running application
on your desktop.
</LI>
<LI>Matlab: Try to run with a local license installed instead of a network
license server, this prevents periodic checks for network licenses
which could spoil your trials. Under the "Desktop"
menu in the menu bar, disable the view of the "Current Directory".
This prevents Matlab from checking the content of the current working
directory at 1 second intervals.
</LI>
<LI>If possible, use a local license server instead of a network license
server and <I>disconnect</I> your machine from the network: Any kind
of network traffic that reaches the network adaptor of your machine
will be processed by the OS and cause load and possible delays. This
is especially true for Apple's music sharing over the network, license
server checks, other machines that have mounted your local disk via
SMB or AFP network filesystem, and viruses or worms that spread over
the network and can create an immense load on the system.
</LI>
<LI>Try to use a <I>single display setup</I> if your experiment only needs
to show monoscopic stimuli to the subject. If you want to use a dual
display setup for convenience, do so for development and debugging
of your code, but for running the study, either use a single display
setup or <I>switch all connected displays into mirror mode</I>, so
they show the same stimulus. <I>Mirror mode</I> can be enabled by
setting all displays to the same resolution, color depth/settings
and then checking the "mirror" checkbox in the Display
preferences panel of OS-X. If you want to present <I>two different
visual stimuli via two different PTB Onscreen-Windows on two different
attached displays</I>, e.g., for display of stereoscopic displays or
binocular rivalry stims, that's fine! The only thing that matters:
PTB needs <I>full control and coverage over all attached displays</I>.
But in case you want to drive two displays with different stims, make
sure you have a fast graphics adaptor with plenty of VRAM installed
(minimum 128 MB recommended).
<BR><I>A<SMALL>FTER ANY CHANGE OF DISPLAY SETTINGS, DO A</SMALL></I> <I>clear
all</I> or <I>clear Screen</I> <SMALL>ON THE </SMALL>M<SMALL>ATLAB PROMPT TO REINITIALIZE
</SMALL>PTB!!!
<BR>
The reason: If only one display shows the Psychtoolbox screen with
your stimulus, but the other display shows the OS-X desktop with the
Dock, the menu bar and the Matlab window as well as other applications
windows, all these applications will consume valuable computational
ressources and Video memory on your graphics adaptor for maintaining
and updating their displays. First they use up VRAM for their own
framebuffers, textures and 3D data: VRAM is needed by PTB for storing
the textures created with Screen('MakeTexture') and other temporary
data for drawing, this will slow down the execution of Screen('DrawTexture'),
because the textures need to be fetched from slow system memory if
they cannot by cached in VRAM. Then the drawing engine of your GPU
is needed to update the display of other windows, so it is not available
for drawing of stimuli. Allocation of the drawing engine happens on
a "First come, first served" bases, so you could
be the last! Creating two onscreen windows, one on each display, or
switching to mirror mode effectively prevents other applications than
PTB from using ressources on the graphics hardware.
</LI>
</UL>
If you stick to this list of configuration tips, you should get a
system with minimum timing interference.
<P>
<H1><A NAME="SECTION00050000000000000000"></A><A NAME="sec:Programming-tips"></A>
<BR>
4 Programming tips
</H1>
<P>
<H2><A NAME="SECTION00051000000000000000"></A><A NAME="sub:Optimal-structure"></A>
<BR>
4.1 Optimal structure of the code
</H2>
<P>
In order to get the highest drawing performance you should structure
your experimental loop to allow for maximum parallelism between CPU
and GPU: Stimulus onset is triggered by the <I>Screen('Flip')</I>
command. It tells PTB to show the result of all previous drawing operations
- your stimulus - to the subject, either at the <I>next possible
vertical retrace</I> of the display, or at a specified point in time
(actually the <I>closest retrace after</I> that point in time). In
that sense, <I>Flip</I> also marks the <I>beginning</I> of the sequence
of drawing commands for the next stimulus to show. Therefore you should
submit all drawing commands for the next stimulus <I>immediately</I>
after the <I>Flip</I> command and <I>before</I> all commands that
are unrelated to drawing, e.g., keyboard and mouse checks, Matlab
code for experiment logic. This way the GPU can execute drawing as
soon as possible and draw your stim while Matlab is executing the
remaining commands of your script on the CPU. It also helps if you
tell the <I>GPU</I> after the last drawing command that this <I>was</I>
the last drawing command to come. That allows PTB and the GPU some
further optimizations.
<P>
In short, your presentation code in the trial-loop should look roughly
like this (How to do it in a loop, e.g., for movie/moving stims, is
left as an exercise to the reader)<A NAME="tex2html2"
HREF="#foot156"><SUP>2</SUP></A>:
<P>
<OL>
<LI><I>vbl=Screen('Flip', windowPtr, ...)</I> for showing the previously
drawn stimulus.
</LI>
<LI>All Matlab commands that <I>need to be synchronized with stimulus
onset</I>, e.g., triggering of an acquisition device like fMRI, MEG,
EEG, ... or start of sound playback in sync with stimulus onset.
</LI>
<LI>All <I>Screen('xxxxxx', windowPtr, ...)</I> commands for drawing
the next stimulus.
</LI>
<LI><I>Screen('DrawingFinished', windowPtr, ...)</I> to mark <I>the
End</I> of all drawing commands - Helps PTB to optimize drawing.
</LI>
<LI>All Matlab commands that are not drawing related, e.g., <I>KbCheck,
GetMouse, WaitSecs</I>, experiment control logic...
</LI>
<LI><I>vbl=Screen('Flip', windowPtr, ...)</I> for showing the new
stimulus.
</LI>
</OL>
Many simple experiments can do with a different structure (and without
step 4) as well. This is just the optimal structure if you want to
draw complex, demanding stimuli at high refresh rates and with reliable
timing.
<P>
The generic layout of your experiment script should look like this:
<P>
<OL>
<LI><I>clear Screen</I> or <I>clear all</I> for clearing out all junk
left over from previous runs and to force reinit of Screen.
</LI>
<LI><I>try</I>
<P>
<OL>
<LI><I>AssertOpenGL</I> - Check if PTB is properly installed on your system.
</LI>
<LI><I>windowPtr = Screen('OpenWindow', screennumber, 0, [], 32,
2);</I>
</LI>
<LI>All kind of generic setup code for your experiment.
</LI>
<LI><I>Priority(9);</I> Enable realtime-scheduling
</LI>
<LI>ifi = <I>Screen('GetFlipInterval', windowPtr, 200);</I>
</LI>
<LI><I>Priority(0);</I> Disable realtime-scheduling
</LI>
<LI>Compute intense setup work, e.g., loading of images from disk, precomputing
stuff
</LI>
<LI><I>Priority(9);</I> Enable realtime-scheduling for real trial
</LI>
<LI><I>vbl = Screen('Flip', windowPtr, ...);</I> Initially synchronize
with retrace, take base time in <I>vbl</I>
</LI>
<LI>for - loop for stimulus presentation or your trial code (see above
for optimal code layout)
</LI>
<LI><I>Screen('CloseAll');</I> Close display windows
</LI>
<LI><I>Priority(0);</I> Shutdown realtime mode.
</LI>
<LI>Remaining cleanup code, e.g., writing of result file.
</LI>
</OL>
</LI>
<LI><I>catch</I>
<P>
<OL>
<LI><I>Screen('CloseAll');</I> Close display windows
</LI>
<LI><I>Priority(0);</I> Shutdown realtime mode.
</LI>
<LI><I>ShowCursor;</I> Show cursor again, if it has been disabled.
</LI>
</OL>
</LI>
<LI><I>end;</I>
</LI>
<LI>End of experiment.
</LI>
</OL>
Step 1 makes sure that PTB gets reset to a well defined state and
that you don't waste Matlab memory with junk from previous activity.
Steps 2,3-a,3-b,3-c and 4 make sure that you get your Matlab window
back and things properly cleaned up in case of an error. 2-b Opens
the window in the recommended way. Steps 2def are optional, they allow
to do an extra calibration run to get an extra accurate estimate of
the real monitor refresh interval in the variable <I>ifi</I>.
<P>
The following subsection will explain specific commands that are relevant
for experiment setup and for control of presentation timing. Please
see the example code and the online-help of Screen<A NAME="tex2html3"
HREF="#foot355"><SUP>3</SUP></A> for more detailed usage info.
<P>
Another special consideration: Put text drawing commands (<I>Screen('DrawText',
...)</I>) at the end of all drawing commands. They are the slowest
and could stall the faster commands, because they involve significant
processing by the CPU as well.
<P>
<H2><A NAME="SECTION00052000000000000000"></A><A NAME="sub:Special-commands"></A>
<BR>
4.2 Special commands and their usage
</H2>
<P>
<H3><A NAME="SECTION00052100000000000000">
4.2.1 Screen('OpenWindow')</A>
</H3>
<P>
The <I>windowPtr=Screen('OpenWindow', screennr, [,color] [,rect][,depth][,buffers][,stereo]);</I>
has multiple functions in PTB:
<P>
<OL>
<LI>It opens a fullscreen window on the physical display with the logical
number <I>screennr.</I> It will also make sure that no other application
can do any drawing operations on that physical display. The window
would have a background color <I>color</I>, a size <I>rect</I> and
a color depth of <I>depth</I> bits per pixel, in reality the <I>color</I>
and <I>rect</I> arguments are ignored and specifying anything else
than <I>32</I> as <I>depth</I> argument will return an error. The
<I>buffers</I> argument defines on how many drawing surfaces to use.
Any value except <I>2</I> - which is the default - will trigger a
warning on the Matlab window and a visual flashing yellow warning
sign to tell you that you should use other values only for debugging
if you are a developer of the PTB itself. The <I>stereo</I> argument
allows you to enable a stereoscopic display mode: The default value
of <I>0</I> will just show a monoscopic display window. A value of
<I>1</I> will enable MacOS-X's built-in stereo display facilities
- <I>Field sequential stereo</I>. OS-X will automatically flip the
display at each video refresh between the stimulus for the left-eye
and the stimulus for the right-eye, while simultaneously generating
appropriate control signals for stereo-goggles and other stereo display
hardware supported by Apple. See subsection TODO for information on
how to specify the content for left- vs. right eye. This mode only
works on some models of graphics hardware - you'll have to try it
out. In the future, values greater than one might be implemented to
support other stereo display modes like anaglyph stereo and such.
</LI>
<LI>It performs a measurement loop for estimating the real monitor refresh
interval: The refresh rate reported by <I>Screen('FrameRate') and
Screen('NominalFrameRate')</I> is the value returned by the operating
systems. On flat-panels, this values is pretty often unavailable (=reported
as zero). On any kind of display, this value may deviate a bit from
the real value due to manufacturing tolerances of graphics hardware
and multiple other factors. Therefore the measurement loop measures
the duration of at least 50 valid consecutive monitor refresh intervals
and computes an average. The monitor refresh interval that results
from this measurement can be queried via <I>Screen('GetFlipInterval')</I>.
</LI>
<LI>It performs a couple of checks to make sure that synchronization to
the vertical retrace, queries of rasterbeam positions and a couple
of other timing related functions work properly on your specific setup.
You will see a blue screen for multiple seconds while this checks
are performed. If a check fails or gives potentially troublesome results,
PTB will flash a big yellow or red warning triangle on your display
and provide a detailled trouble report on the Matlab command window,
together with troubleshooting tips.
<BR>
On multi-display setups where the displays run at the same monitor
refresh interval, some of these crucial checks can fail! In order
to make still sure that synchronization to the vertical retrace works
properly, a perceptual test is automatically run for 10 seconds, whenever
a multi-display setup is detected. You should see something like in
figure TODO on your stimulus display, if syncing properly works: The
huge gray area flickers in a homogenous way, you don't see any yellow
horizontal lines at the right border of the display, or only a few
isolated lines, or a couple of dense yellow lines at the top of the
display. If syncing doesn't work properly<A NAME="tex2html4"
HREF="#foot359"><SUP>4</SUP></A>, you should instead see something like in figure TODO: Many yellow
lines spread over the middle or bottom part of the display or even
over the whole height of the display. The gray area is flickering
in a very inhomogenous way - showing massive tearing artifacts. This
means that syncing to retrace is broken and you need to perform the
troubleshooting tips that PTB outputs to the Matlab window - or set
your displays to different refresh rates and rerun, in case PTB doesn't
detect trouble, or contact the forum if you're unsure what to do.
</LI>
</OL>
<P>
<H3><A NAME="SECTION00052200000000000000"></A><A NAME="sub:Screen__GetFlipInterval__"></A>
<BR>
4.2.2 Screen('GetFlipInterval')
</H3>
<P>
The <I>ifi = Screen('GetFlipInterval', windowPtr[, numSamples][,stddev][,timeout]);</I>
command allows you to query a measured estimate of the real monitor
refresh interval that was computed when opening the window, or to
rerun the measurement loop with more samples or tighter constraints
if you want the best possible estimate. If called as <I>ifi=Screen('GetFlipInterval',
windowPtr);</I> it just returns the estimated <I>interframe-intervall
ifi</I> from initial calibration. If called with the <I>numSamples</I>
argument greater than zero, it will rerun the calibration loop, trying
to take at least <I>numSamples</I> valid samples of monitor refresh,
with a maximum standard deviation from the mean smaller than <I>stddev</I>
(default is 50 microseconds). The loop will abort after at most <I>timeout</I>
seconds, in case your system is too noisy to allow a measurement satisfying
the given constraints. <I>ifi</I> plays a special role for timed stimulus
presentation via the <I>Screen('Flip')</I> command.
<P>
<H3><A NAME="SECTION00052300000000000000"></A><A NAME="sub:Screen_Flip_"></A>
<BR>
4.2.3 Screen('Flip')
</H3>
<P>
The <I>[vbltime sostime fliptime missed beampos] = Screen('Flip',
windowPtr [,when] [,clearmode] [,dontsync]);</I> command
has five functions in PTB:
<P>
<UL>
<LI>Presentation of a - previously drawn - stimulus to the subject at
a <I>well defined</I> point in time and in sync with the vertical
retrace of the display.
</LI>
<LI>Synchronization of Matlab to the stimulus onset.
</LI>
<LI>Acquisition of <I>stimulus presentation timestamps</I> that allow
you to check and record your presentation timing.
</LI>
<LI>Automatic <I>checking</I> for proper presentation timing.
</LI>
<LI>Preparation of the drawing surface (the <I>Backbuffer</I>) for drawing
of the next stimulus.
</LI>
</UL>
Timed stimulus presentation can be done in two ways, depending on
the <I>when</I> argument passed to <I>Flip</I>:
<P>
<OL>
<LI>If you set <I>when=0</I> or leave it away, <I>Flip</I> will try to
show your stimulus at the next possible vertical retrace of your display.
This is the behaviour of all Psychtoolboxes up to (and including)
version 1.0.5. Stimulus onset is <I>always</I> in sync with the vertical
retrace, as this is a built-in feature of modern graphics hardware,
completely independent of any possible timing delays in the rest of
the system. But you can still <I>miss</I> stimulus onset on the next
possible retrace (skipped frame) if you tried to draw too much in
a single monitor refresh interval, so PTB cannot complete drawing
of your stimulus in time. In that case, the stimulus will be shown
at the first possible vertical retrace after the stimulus is ready
for presentation.
</LI>
<LI>If you set <I>when</I> to a value greater than zero, <I>Flip</I> will
pause execution until the system time reaches the value <I>when</I>
(specified in seconds). Then it will try to show your stimulus in
sync with the next possible vertical retrace. It will also perform
some internal optimizations to try its best to meet the requested
stimulus presentation deadline <I>when</I>. Method 2 is the recommended
way of using <I>Flip</I>, method 1 is only available for backward-compatibility
with old versions.
<BR>
Use of the <I>when</I> value allows you to recover the functionality
of the Screen('WaitBlanking', windowPtr, waitframes) command known
from the old MacOS-9 PTB. The following snippet of code would show
a new stimulus exactly 10 monitor refresh intervals after onset of
the last stimulus:
<BR><I>ifi=Screen('GetFlipInterval', windowPtr);</I>
<BR><I>% Record current system time as a reference time:</I>
<BR><I>starttime=GetSecs();</I>
<BR><I>% Draw first stimulus...</I>
<BR><I>...</I>
<BR><I>% Show first stimulus approximately 30 seconds after time 'starttime',
record time of real stimulus onset in vbl:</I>
<BR><I>vbl=Screen('Flip', windowPtr, starttime + 30);</I>
<BR><I>% Draw second stimulus</I>
<BR><I>...</I>
<BR><I>% Show second stimulus *exactly* 10 monitor refresh intervals
after onset of first stimulus:</I>
<BR><I>vbl=Screen('Flip', windowPtr, vbl + 10*ifi - 0.5*ifi);</I>
<BR><I>% Real time of onset of second stimulus is returned in 'vbl'</I>
<BR>
<BR>
The <I>when</I> parameter therefore allows you timing in absolute
time units (seconds of system time) or relative to some point in time
(<I>starttime + 30</I> seconds), or some number of monitor refresh
intervals after the last stimulus onset via the formula:
<BR><I>when=vbl + (waitframes - 0.5)*ifi</I>
<BR>
<P>
</LI>
</OL>
Synchronization of Matlabs execution to the stimulus onset is enabled
by default: <I>Flip</I> waits for stimulus onset to happen - Matlab
is paused during this time. Synchronization of Matlab to stimulus
onset can be disabled by setting the <I>dontsync</I> value to 1 -
Stimulus onset will still happen in sync with retrace, but Matlab
won't wait for it to happen and all reported timestamps will be invalid.
The value <I>dontsync=2</I> will completely disable any synchronization
of drawing or execution to the retrace - Fast, but will likely create
severe flicker and tearing artifacts.
<P>
The <I>clearmode</I> flag allows you to specify what should happen
after a <I>Flip</I>:
<P>
<OL>
<LI>A value of <I>clearmode=0</I> (the default setting) will clear the
drawing surface to the background color, so you can draw a completely
new stimulus.
</LI>
<LI>A value of <I>clearmode=1</I> will restore the drawing surface to
exactly the same state as before the flip, so you can incrementally
update your stimulus.
</LI>
<LI>A value of <I>clearmode=2</I> will save you some millisecond(s) of
time by leaving the drawing surface in an undefined state - and leaving
the job of reinitializing the surface to you.
</LI>
</OL>
<I>Flip</I> will also take and (optionally) return multiple time stamps
that allow you to measure the time of stimulus onset:
<P>
<UL>
<LI><I>vbltime</I> is the time (in seconds) when flip flipped the drawing
surfaces. This is the time when the vertical retrace interval started,
you need to supply this value if you want to perform a <I>Waitblanking</I>
via the formula mentioned above.
</LI>
<LI><I>sostime</I> is the time when your stimulus starts to get drawn
on the display. This is the time when the vertical retrace interval
ended - the display starts drawing the topmost line of your display.
</LI>
<LI><I>fliptime</I> is the time when Flip returns to Matlab. This is always
after <I>vbltime</I> but can be before or slightly after <I>sostime</I>,
depending on the speed of your graphics card and computer.
</LI>
</UL>
For calculation of <I>vbltime</I> and <I>sostime</I>, PTB takes a
high-resolution measurement of system time and of the current vertical
position of your display's rasterbeam. It then corrects the timestamp
by some correction value calculated from the beam-position, the height
of your display and the exact monitor refresh interval. This way,
<I>vbltime</I> is always locked to the time of start of vertical retrace,
independent of possible timing jitter caused by Matlab or the operating
system.
<P>
These timestamps should allow you to accurately check your stimulus
presentation timing. <I>Flip</I> also contains a built-in check for
missed presentation deadlines (<I>when</I> value) and skipped frames.
This detector will spot skipped frames and deadlines reliably if you
provide a <I>when</I> value greater zero, it will spot many, but not
all, skipped frames if you don't provide a <I>when</I> value. The
result of the check for skipped frames is returned in the <I>missed</I>
value: Positive <I>missed</I> values indicate a missed <I>when</I>
deadline or skipped frame - <I>Flip</I> couldn't flip at the vertical
retrace closest to the specified <I>when</I> value. A summary of skipped
frames is also printed to the Matlab command window at the end of
your experiment. P<SMALL>LEASE NOTE THAT THE SKIPPED FRAME DETECTOR
IS ONLY AN ADDITIONAL SAFEGUARD FOR DETECTING TIMING PROBLEMS.</SMALL> You
are responsible for checking your timing by your own independent tests
as well, if frame-accurate timing matters for your study.
<P>
<H3><A NAME="SECTION00052400000000000000"></A><A NAME="sub:Screen__DrawingFinished__"></A>
<BR>
4.2.4 Screen('DrawingFinished')
</H3>
<P>
See VBLSyncTest.m and online help <I>Screen DrawingFinished?</I> for
now...
<P>
<H3><A NAME="SECTION00052500000000000000"></A><A NAME="sub:Screen__SelectStereoDrawbuffer__"></A>
<BR>
4.2.5 Screen('SelectStereoDrawbuffer')
</H3>
<P>
The <I>Screen('SelectStereoDrawbuffer', windowPtr, bufferid)</I> command
selects the drawing surface for drawing stimuli when stereo display
mode is enabled. In stereo display mode, you have to draw two stimulus
images each time before calling <I>Screen('Flip')</I>, one for the
left-eye, one for the right-eye. The <I>bufferid</I> argument selects
the target buffer for following drawing operations: <I>bufferid=0</I>
- Left eye , <I>bufferid=1</I> - Right Eye. The selection stays
active until the next <I>Flip</I> command and is reset to the left-eye
after a flip.
<P>
<H2><A NAME="SECTION00053000000000000000">
To be continued - Stay tuned...</A>
</H2>
<H1><A NAME="SECTION00060000000000000000">
About this document ...</A>
</H1>
<STRONG>Performance & Timing - HOWTO for Psychtoolbox on OS-X
<BR><I>Draft - Version 0.1 - PTB 1.0.5-MK4 and later</I></STRONG><P>
This document was generated using the
<A HREF="http://www.latex2html.org/"><STRONG>LaTeX</STRONG>2<tt>HTML</tt></A> translator Version 2002 (1.62)
<P>
Copyright © 1993, 1994, 1995, 1996,
<A HREF="http://cbl.leeds.ac.uk/nikos/personal.html">Nikos Drakos</A>,
Computer Based Learning Unit, University of Leeds.
<BR>
Copyright © 1997, 1998, 1999,
<A HREF="http://www.maths.mq.edu.au/~ross/">Ross Moore</A>,
Mathematics Department, Macquarie University, Sydney.
<P>
The command line arguments were: <BR>
<STRONG>latex2html</STRONG> <TT>-no_subdir -split 0 -show_section_numbers /tmp/lyx_tmpdir5791OnE22c/lyx_tmpbuf0/PTB2005.tex</TT>
<P>
The translation was initiated by Mario Kleiner on 2005-05-18
<BR><HR><H4>Footnotes</H4>
<DL>
<DT><A NAME="foot369">... delays</A><A
HREF="PTB2005.html#tex2html1"><SUP>1</SUP></A></DT>
<DD>BTW: The same applies to the old PTB on Microsoft Windows and to a
smaller degree on MacOS-9. Only some specially configured versions
of <I>GNU/Linux ("Realtime Linux")</I> and some
commercial - and hard to program - realtime operating systems like,
e.g., <I>QNX</I>, would be able to avoid these problems and provide
real <I>hard-realtime</I>, but PTB is currently not available for
Linux or such systems...
</DD>
<DT><A NAME="foot156">...</A><A
HREF="PTB2005.html#tex2html2"><SUP>2</SUP></A></DT>
<DD>A perfect, well documented, albeit extremely simple example is the
VBLSyncTest script. Run it, read its sourcecode carefully.
</DD>
<DT><A NAME="foot355">... Screen</A><A
HREF="PTB2005.html#tex2html3"><SUP>3</SUP></A></DT>
<DD>Online help for Screen subcommand <I>foo</I> is displayed when typing
<I>Screen foo?</I> at the Matlab command prompt, e.g., <I>Screen
Flip?</I>
</DD>
<DT><A NAME="foot359">... properly</A><A
HREF="PTB2005.html#tex2html4"><SUP>4</SUP></A></DT>
<DD>This can easily happen with all ATI graphics adaptors when run under
MacOS-X 10.3 "Panther" or under MacOS-X 10.4.0 "Tiger"
due to a bug in the ATI display drivers.
</DD>
</DL><HR>
<!--Navigation Panel-->
<IMG WIDTH="81" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next_inactive"
SRC="file:/usr/share/latex2html/icons/nx_grp_g.png">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up"
SRC="file:/usr/share/latex2html/icons/up_g.png">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous"
SRC="file:/usr/share/latex2html/icons/prev_g.png">
<BR>
<!--End of Navigation Panel-->
<ADDRESS>
Mario Kleiner
2005-05-18
</ADDRESS>
</BODY>
</HTML>
|