[Date Index]
[Thread Index]
[Author Index]
Re: JLink and speeding up graphics display by java routine
*To*: mathgroup at smc.vnet.net
*Subject*: [mg36722] Re: [mg36661] JLink and speeding up graphics display by java routine
*From*: Todd Gayley <tgayley at wolfram.com>
*Date*: Fri, 20 Sep 2002 04:16:43 -0400 (EDT)
*Sender*: owner-wri-mathgroup at wolfram.com
At 01:09 AM 9/18/02, Blimbaum Jerry DLPC wrote:
>I am trying to write an animation using JLink.....basically as
>follows...(using Mathematica 4.1, JLink 2.01 and java 1.4.1)...
>
>frm = createWindow[]; (* basically to create a MathFrame and a drawArea
>= MathCanvas *)
>
>Here is my drawing routine....
>
> Map[(obj = drawMembrane[#];
>drawArea@setMathCommand["obj"];
> drawArea@repaintNow[];
> Pause[.0001];) &, t ]
>
>t = time list ={0,.25,etc}.... and drawMembrane is a function that uses the
>time value to make a graphics plot......unfortunately, this routine draws
>the next time plot very slowly, plus I also notice that without the Pause[]
>statement, Mathematica only draws the graph for the final time value...
Jerry,
You did a nice job with this "one-frame-at-a-time plot". (I'm replying here
to this message and your previous one where you presented the full code.)
The main reason that it is slow drawing the frames is that the Pause[]
function only works with integer second intervals. If you say Pause[.0001]
it pauses for a whole second, which inserts a 1-second delay between each
frame. If I take out the Pause, I get about 5 frames per second on my
laptop (for your Sin plot). This still seems slow to me, but it turns out
that Java is just slow at taking GIF data and making it into pixels to be
displayed. That step consumes virtually all the time for the animation.
If you make the image smaller, the animation runs much faster. Try making
your window size 400 x 300 instead of 800 x 600. At that size, the
animation runs at a good speed on my machine. If you want to insert a delay
between frames, you need to use Java instead of calling Pause[]:
LoadJavaClass["java.lang.Thread"];
Map[(obj = drawMembrane[#];
drawArea@setMathCommand["obj"];
drawArea@repaintNow[];
(* Add a 100 ms delay *)
Thread`sleep[100];) &, t ]
You said that without the Pause[] you only get the last frame drawn, but
that shouldn't have any effect. Perhaps you took out the call to
repaintNow() along with the Pause?
>Following an example in the JLink documentation, I have written the
>following java routine....which I saved in the same dir as MathFrame,
>etc....
>
>
>public class My_DisplayGraphicsViaJava {
> public void displayGraphics(String cmds[]) { // declare String Array
>for Graphics Objects
> for (int i = 0; i < cmds.length-1; i++)
> drawArea.setMathCommand(cmds[i]);
> drawArea.repaintNow();
> Thread.sleep(200);} }
>
>
>and then in Mathematica I have
>
> LoadJavaClass["My_DisplayGraphicsViaJava"];
>My_DisplayGraphicsViaJava`displayGraphics["obj"]; (* where obj is the
>array of Graphics plots created *)
>
>
>But needless to say this dont work....LoadJavaClass responds by saying Class
>not Found.....so what should I do to correct this? Also , on the java
>routine, was i supposed to add: Extends MathFrame, etc....how will my
>java routine know what drawArea.setMathCommand is, etc.....am I also
>supposed to compile my java routine?
You will definitely need to compile any Java classes you write! But writing
this in Java won't change anything because the delay is in Java itself, not
in J/Link or the MathLink communication. This Java class would need a lot
of work before it would compile. You would need to either create drawArea
in the Java class rather than in Mathematica code, or pass it as an
argument to displayGraphics() (which needs to be static, by the way).
Anyway, there is no point in thinking about any of that, since this
displayGraphics() method just duplicates functionality that you have
already (much more conveniently) scripted in Mathematica code.
One final general note for J/Link programmers: It's OK to create Java names
with underscores in them, but you have to remember how they are handled in
Mathematica. When you refer to a Java name in Mathematica code as a string,
you keep the underscore:
LoadJavaClass["My_DisplayGraphicsViaJava"];
But when a name appears as a symbol in Mathematica, J/Link maps it to a U
because _ is not legal in a symbol name:
MyUDisplayGraphicsViaJava`displayGraphics[....]
It's often easiest to just avoid using _ in the names of Java classes and
methods that you write for use with Mathematica.
Todd Gayley
Wolfram Research
Prev by Date:
**Re: Different letters different solutions!!**
Next by Date:
**How to display package contents?**
Previous by thread:
**JLink and speeding up graphics display by java routine**
Next by thread:
**Thanks to all; here's what looks to be best solution**
| |