o.k., here is what I found, following your input: <br><br>In any experiment I create in EP1 (in a neighboring lab...), canvas.copy takes under 1 ms.<br>In any experiment I create in EP2, canvas.copy takes a whole refresh cycle.<br>If I take an experiment created in EP1 and convert it to EP2 - then canvas.copy time is under 1 ms... although nothing in the inline changed...<br>How can that be?<br><br><br><br>On Thursday, April 25, 2013 8:29:06 AM UTC+3, Peter Quain wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<div>
<br>
I haven't tested any code examples, but have a lot of data showing
canvas.copy in v.1.?.? takes under a ms, supporting David's observations.
Perhaps something here is less instant in v2.?, and a bug has been
identified?<br><br>
At 03:19 PM 25/04/2013, you wrote:<br>
<blockquote type="cite">Thank you both your
replies!<br><br>
I am using E-prime 2.0.10, and a CRT iiyama Vision Master screen, with
display resolution<br>
of 1024 x 768 and a refresh rate of 100 Hz. My operating system is
windows XP.<br><br>
I'm troubled with this timing issue because my experiment includes EEG
recording, thus the<br>
synchronization is terribly important. I need to send triggers via the
parallel port exactly at the<br>
onset of each stimulus, or else my EEG signal might be smeared.
Considering that the canvas.copy<br>
takes a refresh cycle to complete - I'm not sure what time ought to be
considered the stimulus onset...<br><br>
Anyhow, David, I've tried running your code - and I get dt's of 13-14ms.
Do you think that all the difference<br>
between your 0.22ms to my 13-14ms is due to E-prime1 vs. E-prime2
differences? That's shocking...<br>
I get the same results as Michiel for the loop codes, as puzzling as they
are...<br><br>
Thanks again for your help,<br>
Tamar<br><br>
<br><br>
<br>
On Wednesday, April 24, 2013 4:44:46 PM UTC+3, McFarlane, David
wrote:<br>

<dl>
<dd>Hmm.  I explored this issue myself three years ago, using EP1
(still my <br>

</dd><dd>favorite version for this type of exploration).  I just dug up
my test <br>

</dd><dd>program and ran it again on my trusty old XP laptop at home after
<br>

</dd><dd>breakfast, and got times of 0.22 ms even for full screen copies, much
as <br>

</dd><dd>I remember from before (where full screen means 1024 x 768; and yes,
<br>

</dd><dd>that is less than a millisecond).  To be sure, here is the core
of my <br>

</dd><dd>test code: <br><br>

</dd><dd>     t0 = clock.readmicrosec <br>

</dd><dd>     dcnvs.copy cnvs <br>

</dd><dd>     dt = clock.readmicrosec - t0 <br>

</dd><dd>     msgbox format$( dt/1000,
"Standard" ) & " ms" <br><br>

</dd><dd>where all variables are defined and initialized earlier as expected
<br>

</dd><dd>(dcnvs is set to Display.Canvas just for notational convenience).
<br><br>

</dd><dd>Also, I looked at the Canvas.Copy topic in the E-Basic Help -- no
<br>

</dd><dd>evidence that .Copy includes an implicit
Display.WaitForVerticalBlank, <br>

</dd><dd>to the contrary, the code example there includes an explicit <br>

</dd><dd>Display.WaitForVerticalBlank just before the cnvs.Copy.  I would
be <br>

</dd><dd>*extremely* surprised if Canvas.Copy included a <br>

</dd><dd>Display.WaitForVerticalBlank, as that would greatly compromise its
<br>

</dd><dd>utility (e.g., when wanting to Copy several segments to an offscreen
<br>

</dd><dd>Canvas before copying the complete result to Display.Canvas).
<br><br>

</dd><dd>So I do not know how to account for your results.  Mind you, I
did all <br>

</dd><dd>my tests using good-old EP1 with 1024x768 display resolution. 
For all I <br>

</dd><dd>know things changed with the latest EP version, or things get slower
<br>

</dd><dd>with larger display resolutions.  What EP version do you
use?  What <br>

</dd><dd>display resolution? <br><br>

</dd><dd>Michiel, I am especially puzzled by your results.  Both of your
tests <br>

</dd><dd>measure the total time to perform a Canvas.Copy and <br>

</dd><dd>Display.WaitForVerticalBlank, only in different orders.  So you
should <br>

</dd><dd>get the same time for both tests, regardless of whether Canvas.Copy
<br>

</dd><dd>includes its own Display.WaitForVerticalBlank.  What am I
missing? <br><br>

</dd><dd>Nevertheless, Michiel's advice still stands  -- as long as your
program <br>

</dd><dd>does everything it needs to do within one screen refresh (and
assuming <br>

</dd><dd>that you *do* synchronize visual displays to the screen refresh, as
you <br>

</dd><dd>should), then that is good enough. <br>
<br>

</dd><dd>----- <br>

</dd><dd>David McFarlane <br>

</dd><dd>E-Prime training online: <br>

</dd><dd><a href="http://psychology.msu.edu/Workshops_Courses/eprime.aspx" target="_blank">
http://psychology.msu.edu/<wbr>Workshops_Courses/eprime.aspx</a> <br>

</dd><dd>Twitter:  @EPrimeMaster
(<a href="http://twitter.com/EPrimeMaster" target="_blank">twitter.com/EPrimeMaster</a>)
<br><br>

</dd><dd>/----------- <br>

</dd><dd>Stock reminder:  1) I do not work for PST.  2) PST's
trained staff take <br>

</dd><dd>any and all questions at <br>

</dd><dd><a href="http://support.pstnet.com/e%2Dprime/support/login.asp" target="_blank">
http://support.pstnet.com/e%<wbr>2Dprime/support/login.asp</a> , and they
strive <br>

</dd><dd>to respond to all requests in 24-48 hours, so make full use of
it.  3) <br>

</dd><dd>In addition, PST takes questions at their Facebook page <br>

</dd><dd>
(<a href="http://www.facebook.com/pages/Psychology-Software-Tools-Inc/241802160683" target="_blank">
http://www.facebook.com/pages/<wbr>Psychology-Software-Tools-Inc/<wbr>241802160683</a>
 <br>

</dd><dd>), and offers several instructional videos there and on their YouTube
<br>

</dd><dd>channel
(<a href="http://www.youtube.com/user/PSTNET" target="_blank">
http://www.youtube.com/user/<wbr>PSTNET</a> ) (no Twitter feed yet, <br>

</dd><dd>though).  4) If you do get an answer from PST staff, please
extend the <br>

</dd><dd>courtesy of posting their reply back here for the sake of others.
<br>

</dd><dd>\----------- <br><br>
<br>

</dd><dd>Cognitology wrote: <br>

</dd><dd>> Hi, <br>

</dd><dd>> <br>

</dd><dd>> A quick look, but I think that you pretty much nailed it: it can
take <br>

</dd><dd>> quite long to do any canvas operation. Given that your screen
refresh <br>

</dd><dd>> rate presumably isn�t more than 100 Hz (and in any ways, your
foveal <br>

</dd><dd>> vision isn�t), I don�t see the problem? Indeed, if you were
to draw many <br>

</dd><dd>> things to the main canvas, one after the other, then indeed, it
gets to <br>

</dd><dd>> be a problem, but as long as the only operation is copying a
�preloaded� <br>

</dd><dd>> canvas to the shown one, it doesn�t matter all that much.
Notice, given <br>

</dd><dd>> that you�re not using E-Prime�s stimdisplays, it�s not
clear at what <br>

</dd><dd>> time the stimulus is actually displayed � only when it�s
done sending <br>

</dd><dd>> the command. I think it�s generally better for critical timing
aspects <br>

</dd><dd>> of your experiment to avoid canvas as much as possible.
Personally, I <br>

</dd><dd>> think �critical timing� is when it concerns a subliminal vs
barely <br>

</dd><dd>> supraliminal prime or some such, for other types of stimuli the
10 ms of <br>

</dd><dd>> (constant, therefore presumably stimulus independent) delay is
of <br>

</dd><dd>> trivial concern. <br>

</dd><dd>> <br>

</dd><dd>>   <br>

</dd><dd>> <br>

</dd><dd>> Just testing some of it myself, and I get values ranging between
15 and <br>

</dd><dd>> 17 � which is funny, given that my refresh rate is indeed 60,
so it <br>

</dd><dd>> seems a bit like there�s some sort of
display.waitforverticalblank built <br>

</dd><dd>> into canvas.copy. Curiously, this: <br>

</dd><dd>> <br>

</dd><dd>> For j = 1 To 100 <br>

</dd><dd>> <br>

</dd><dd>>       DrawFixation �this is just
a custom function drawing a line to <br>

</dd><dd>> cnvsnext <br>

</dd><dd>> <br>

</dd><dd>>       cnvs.copy cnvsnext <br>

</dd><dd>> <br>

</dd><dd>>       display.waitforverticalblank
<br>

</dd><dd>> <br>

</dd><dd>>       debug.print clock.read -
clocktime <br>

</dd><dd>> <br>

</dd><dd>>       clocktime = clock.read <br>

</dd><dd>> <br>

</dd><dd>> Next j <br>

</dd><dd>> <br>

</dd><dd>>   <br>

</dd><dd>> <br>

</dd><dd>> Gives me latencies equal to refresh rates (+- 1 ms). <br>

</dd><dd>> <br>

</dd><dd>> Whereas: <br>

</dd><dd>> <br>

</dd><dd>>   <br>

</dd><dd>> <br>

</dd><dd>> For j = 1 To 100 <br>

</dd><dd>> <br>

</dd><dd>>       DrawFixation �this is just
a custom function drawing a line to <br>

</dd><dd>> cnvsnext <br>

</dd><dd>> <br>

</dd><dd>>       display.waitforverticalblank
<br>

</dd><dd>> <br>

</dd><dd>> cnvs.copy cnvsnext <br>

</dd><dd>> <br>

</dd><dd>>       debug.print clock.read -
clocktime <br>

</dd><dd>> <br>

</dd><dd>>       clocktime = clock.read <br>

</dd><dd>> <br>

</dd><dd>> Next j <br>

</dd><dd>> <br>

</dd><dd>>   <br>

</dd><dd>> <br>

</dd><dd>> Gives me latencies equal to 2xrefresh rates. Somebody with young
eyes <br>

</dd><dd>> should tell us if the first one doesn�t have cutting-off
errors, <br>

</dd><dd>> otherwise I�d suggest there might be some sort of
waitforverticalblank <br>

</dd><dd>> built into canvas.copy. <br>

</dd><dd>> <br>

</dd><dd>> Best, <br>

</dd><dd>> <br>

</dd><dd>>   <br>

</dd><dd>> <br>

</dd><dd>> Michiel Sovij�rvi-Spap� <br>

</dd><dd>> <br>

</dd><dd>>   <br>

</dd><dd>> <br>

</dd><dd>> Helsinki Institute for Information Technology <br>

</dd><dd>> <br>

</dd><dd>> Aalto & University of Helsinki <br>

</dd><dd>> <br>

</dd><dd>> Finland <br>

</dd><dd>> <br>

</dd><dd>>   <br>

</dd><dd>> <br>

</dd><dd>>   <br>

</dd><dd>> <br>

</dd><dd>>   <br>

</dd><dd>> <br>

</dd><dd>> BTW: notice that using debug.print also incurs a delay (last
measured at <br>

</dd><dd>> 0.7 ms). <br>

</dd><dd>> <br>

</dd><dd>>   <br>

</dd><dd>> <br>

</dd><dd>>   <br>

</dd><dd>> <br>

</dd><dd>> *From:* <a>e-p...@googlegroups.com</a>
[<a>
mailto:e-p...@googlegroups.com</a><wbr>] *On <br>

</dd><dd>> Behalf Of *Tamar <br>

</dd><dd>> *Sent:* 24. April 2013 08:33 <br>

</dd><dd>> *To:* <a>e-p...@googlegroups.com</a> <br>

</dd><dd>> *Subject:* Canvas.Copy is taking too long to complete <br>

</dd><dd>> <br>

</dd><dd>>   <br>

</dd><dd>> <br>

</dd><dd>> I'm programming a visual experiment, and suffering from some
timing <br>

</dd><dd>> issues. It seems that the line presenting the stimuli
(canvas.copy) is <br>

</dd><dd>> considerably time consuming: 10-12 ms. I can't figure out the
cause for <br>

</dd><dd>> this delay, and I would appreciate any help... <br>

</dd><dd>> <br>

</dd><dd>> Here is the relevant piece of code: <br>

</dd><dd>> <br>

</dd><dd>> ====== in an initializing inline script, at the begining of
SessionProc: <br>

</dd><dd>> ====== <br>

</dd><dd>> Set MainCanvas = Display.Canvas <br>

</dd><dd>> MainCanvas.fillColor = CColor(background_color) <br>

</dd><dd>> MainCanvas.clear <br>

</dd><dd>> <br>

</dd><dd>> For i = 1 To NumStim <br>

</dd><dd>>    Set StimCanvases(i) = Display.CreateCanvas
<br>

</dd><dd>> <br>

</dd><dd>>    'define destination rect as center of screen
<br>

</dd><dd>>    destRects(i).Left = Display.XRes/2-stim_w/2
<br>

</dd><dd>>    destRects(i).Top = Display.YRes/2-stim_h/2
<br>

</dd><dd>>    destRects(i).Right = Display.XRes/2+stim_w/2
<br>

</dd><dd>>    destRects(i).Bottom = Display.YRes/2+stim_h/2
<br>

</dd><dd>>     <br>

</dd><dd>>    'define source rect as upper left corner <br>

</dd><dd>>    srcRects(i).Left = 0 <br>

</dd><dd>>    srcRects(i).Top = 0 <br>

</dd><dd>>    srcRects(i).Right = stim_w <br>

</dd><dd>>    srcRects(i).Bottom = stim_h <br>

</dd><dd>>     <br>

</dd><dd>>    'Load the image file <br>

</dd><dd>>    StimCanvases(i).LoadImage "Stimuli/"
& FileNames(i) & ".bmp" <br>

</dd><dd>>     <br>

</dd><dd>> Next i <br>

</dd><dd>> <br>

</dd><dd>> ====== in the inline of TrialProc: ======= <br>

</dd><dd>> Debug.Print "1:" & clock.read <br>

</dd><dd>> StartTrialTime = clock.read <br>

</dd><dd>> n = c.GetAttrib("CanvasNum") <br>

</dd><dd>> c.SetAttrib "TrialStart", StartTrialTime <br>

</dd><dd>> display.WaitForVerticalBlank <br>

</dd><dd>> Debug.Print "4:" & clock.read <br>

</dd><dd>> StartStimTime = clock.read <br>

</dd><dd>> c.SetAttrib "StimStart", StartStimTime <br>

</dd><dd>> Debug.Print "5:" & clock.read <br>

</dd><dd>> mainCanvas.copy StimCanvases(n),srcRects(n),<wbr>destRects(n) <br>

</dd><dd>> Debug.Print "6:" & clock.read <br>

</dd><dd>> <br>

</dd><dd>> <br>

</dd><dd>> I've tried a few things: <br>

</dd><dd>> - to create variables taking the values of <br>

</dd><dd>> StimCanvases(n),srcRects(n),<wbr>destRects(n) in the beginning of the
trial, <br>

</dd><dd>> so the mainCanvas.copy line would not need to approach the
arrays. <br>

</dd><dd>> - to present other simple canvases instead of my real stimuli
(just a <br>

</dd><dd>> fixation, for example. or an empty canvas) <br>

</dd><dd>> - to draw something on the mainCanvas rather than copy a new
canvas to <br>

</dd><dd>> it (e.g. mainCanvas.Circle). <br>

</dd><dd>> <br>

</dd><dd>> All of these takes 10-12 ms! (as calculated by subtracting time5
from <br>

</dd><dd>> time6). The only way I managed to get rid of the delay was to
erase the <br>

</dd><dd>> entire row... <br>

</dd><dd>> <br>

</dd><dd>> Am I missing something here?... <br>

</dd><dd>> <br>

</dd><dd>> Thanks, <br>

</dd><dd>> Tamar <br><br>

</dd></dl>-- <br>
You received this message because you are subscribed to the Google Groups
"E-Prime" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an
email to <a href="javascript:" target="_blank" gdf-obfuscated-mailto="oUJgrymnaTUJ">e-prime+u...@<wbr>googlegroups.com</a>.<br>
To post to this group, send email to <a href="javascript:" target="_blank" gdf-obfuscated-mailto="oUJgrymnaTUJ">e-p...@googlegroups.com</a>.<br>
To view this discussion on the web visit
<a href="https://groups.google.com/d/msg/e-prime/-/0DZ5JBsrwGUJ" target="_blank">
https://groups.google.com/d/<wbr>msg/e-prime/-/0DZ5JBsrwGUJ</a>.<br>
For more options, visit
<a href="https://groups.google.com/groups/opt_out" target="_blank">
https://groups.google.com/<wbr>groups/opt_out</a>.<br>
 <br>
 </blockquote></div>

</blockquote>

<p></p>

-- <br />
You received this message because you are subscribed to the Google Groups "E-Prime" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an email to e-prime+unsubscribe@googlegroups.com.<br />
To post to this group, send email to e-prime@googlegroups.com.<br />
To view this discussion on the web visit <a href="https://groups.google.com/d/msg/e-prime/-/Vt8fFfvwiJwJ">https://groups.google.com/d/msg/e-prime/-/Vt8fFfvwiJwJ</a>.<br />
For more options, visit <a href="https://groups.google.com/groups/opt_out">https://groups.google.com/groups/opt_out</a>.<br />
 <br />
 <br />