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