Announcement

Collapse
No announcement yet.

WWJ SDK Alpha 4.1 - 0.4.1 available

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WWJ SDK Alpha 4.1 - 0.4.1 available

    The World Wind Java SDK alpha 4 - version 0.4.1 is available.
    Download WWJ SDK 0.4 (Zip 6.5M) or try the java web start demo 0.4 from the NASA World Wind site.

    WWJ changes from 0.4.0 to 0.4.1
    • Fixed NetworkStatus bug causing freeze for some
    • Added an off-line attribute to the WorldWind class to elect not to use the network
    • Added a show-network-status attribute to StatusBar

    WorldWind Java SDK home pages at NASA Learning Technologies and WorldWind Central.

  • #2
    Note that this version also contains an updated set of great circle and rhumb line computation methods in LatLon. Previous spherical methods have been renamed to greatCircleAzimuth, Distance and EndPosition. New rhumb methods are named rhumbAzimuth, Distance and EndPosition.

    A few non unicode characters have also been removed from a couple classes.
    My World Wind Java Blog & WW.net Plugins page

    Comment


    • #3
      The new great circle and rhumb line code didn't make it into 0.4.1. I wanted to quickly make the network status fix available first. They'll be in an update in the next day or two.

      Comment


      • #4
        Feedback

        Hi Tag and Pat,

        Testing with 0.4.1 "out-of-the-box" behind my corporate firewall (ref the thread about problems with 0.4.0):

        -> The globe still freezes for 20 seconds or so, and then it's ok for 5 seconds or so, and then it freezes again. This cycle repeats many times, but after a minute or two I didn't think the pattern would change, so I stopped trying. Here's the thread dump:
        Code:
        2007-12-06 09:30:42
        Full thread dump Java HotSpot(TM) Client VM (1.6.0_01-b06 mixed mode):
        
        "Idle World Wind Task " daemon prio=2 tid=0x0b0c4800 nid=0xa40 waiting on condition [0x1ea3f000..0x1ea3fc14]
           java.lang.Thread.State: WAITING (parking)
        	at sun.misc.Unsafe.park(Native Method)
        	- parking to wait for  <0x02ff83f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        	at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
        	at java.util.concurrent.ArrayBlockingQueue.take(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        	at java.lang.Thread.run(Unknown Source)
        
        "Idle World Wind Retriever" daemon prio=2 tid=0x0b37dc00 nid=0x394 waiting on condition [0x1e9ef000..0x1e9efc94]
           java.lang.Thread.State: WAITING (parking)
        	at sun.misc.Unsafe.park(Native Method)
        	- parking to wait for  <0x02ff8810> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        	at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
        	at java.util.concurrent.PriorityBlockingQueue.take(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        	at java.lang.Thread.run(Unknown Source)
        
        "Idle World Wind Retriever" daemon prio=2 tid=0x0b35ec00 nid=0x9e0 waiting on condition [0x1e99f000..0x1e99fd14]
           java.lang.Thread.State: WAITING (parking)
        	at sun.misc.Unsafe.park(Native Method)
        	- parking to wait for  <0x02ff8810> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        	at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
        	at java.util.concurrent.PriorityBlockingQueue.take(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        	at java.lang.Thread.run(Unknown Source)
        
        "Idle World Wind Retriever" daemon prio=2 tid=0x0b3c7800 nid=0xa2c waiting on condition [0x1e14f000..0x1e14fd94]
           java.lang.Thread.State: WAITING (parking)
        	at sun.misc.Unsafe.park(Native Method)
        	- parking to wait for  <0x02ff8810> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        	at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
        	at java.util.concurrent.PriorityBlockingQueue.take(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        	at java.lang.Thread.run(Unknown Source)
        
        "Idle World Wind Retriever" daemon prio=2 tid=0x0b2b7400 nid=0x7d8 waiting on condition [0x1e0ff000..0x1e0ffa14]
           java.lang.Thread.State: WAITING (parking)
        	at sun.misc.Unsafe.park(Native Method)
        	- parking to wait for  <0x02ff8810> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        	at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
        	at java.util.concurrent.PriorityBlockingQueue.take(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        	at java.lang.Thread.run(Unknown Source)
        
        "Idle World Wind Retriever" daemon prio=2 tid=0x0b261800 nid=0x8d8 waiting on condition [0x1e0af000..0x1e0afa94]
           java.lang.Thread.State: WAITING (parking)
        	at sun.misc.Unsafe.park(Native Method)
        	- parking to wait for  <0x02ff8810> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        	at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
        	at java.util.concurrent.PriorityBlockingQueue.take(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        	at java.lang.Thread.run(Unknown Source)
        
        "Idle World Wind Task " daemon prio=2 tid=0x0b0c6800 nid=0x940 waiting on condition [0x1ca8f000..0x1ca8fb14]
           java.lang.Thread.State: WAITING (parking)
        	at sun.misc.Unsafe.park(Native Method)
        	- parking to wait for  <0x02ff83f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        	at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
        	at java.util.concurrent.ArrayBlockingQueue.take(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        	at java.lang.Thread.run(Unknown Source)
        
        "Idle World Wind Task " daemon prio=2 tid=0x0b0adc00 nid=0x8a4 waiting on condition [0x1ca3f000..0x1ca3fb94]
           java.lang.Thread.State: WAITING (parking)
        	at sun.misc.Unsafe.park(Native Method)
        	- parking to wait for  <0x02ff83f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        	at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
        	at java.util.concurrent.ArrayBlockingQueue.take(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        	at java.lang.Thread.run(Unknown Source)
        
        "Idle World Wind Task " daemon prio=2 tid=0x0b0ad400 nid=0x958 waiting on condition [0x1c9ef000..0x1c9efc14]
           java.lang.Thread.State: WAITING (parking)
        	at sun.misc.Unsafe.park(Native Method)
        	- parking to wait for  <0x02ff83f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        	at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
        	at java.util.concurrent.ArrayBlockingQueue.take(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
        	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        	at java.lang.Thread.run(Unknown Source)
        
        "DestroyJavaVM" prio=6 tid=0x00266800 nid=0xa1c waiting on condition [0x00000000..0x0094fd4c]
           java.lang.Thread.State: RUNNABLE
        
        "AWT-EventQueue-0" prio=6 tid=0x0b200400 nid=0x970 runnable [0x0b63f000..0x0b63fd14]
           java.lang.Thread.State: RUNNABLE
        	at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
        	at java.net.InetAddress$1.lookupAllHostAddr(Unknown Source)
        	at java.net.InetAddress.getAddressFromNameService(Unknown Source)
        	at java.net.InetAddress.getAllByName0(Unknown Source)
        	at java.net.InetAddress.getAllByName0(Unknown Source)
        	at java.net.InetAddress.getAllByName(Unknown Source)
        	at java.net.InetAddress.getByName(Unknown Source)
        	at gov.nasa.worldwind.util.BasicNetworkStatus.isHostReachable(Unknown Source)
        	at gov.nasa.worldwind.util.BasicNetworkStatus.isNetworkUnavailable(Unknown Source)
        	at gov.nasa.worldwind.util.BasicNetworkStatus.isNetworkUnavailable(Unknown Source)
        	at gov.nasa.worldwind.retrieve.BasicRetrievalService.isAvailable(Unknown Source)
        	at gov.nasa.worldwind.layers.placename.PlaceNameLayer.sendRequests(Unknown Source)
        	at gov.nasa.worldwind.layers.placename.PlaceNameLayer.doRender(Unknown Source)
        	at gov.nasa.worldwind.layers.AbstractLayer.render(Unknown Source)
        	at gov.nasa.worldwind.AbstractSceneController.draw(Unknown Source)
        	at gov.nasa.worldwind.BasicSceneController.doRepaint(Unknown Source)
        	at gov.nasa.worldwind.AbstractSceneController.repaint(Unknown Source)
        	at gov.nasa.worldwind.WorldWindowGLAutoDrawable.doDisplay(Unknown Source)
        	at gov.nasa.worldwind.WorldWindowGLAutoDrawable.display(Unknown Source)
        	at com.sun.opengl.impl.GLDrawableHelper.display(GLDrawableHelper.java:78)
        	at javax.media.opengl.GLCanvas$DisplayAction.run(GLCanvas.java:435)
        	at com.sun.opengl.impl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:194)
        	at javax.media.opengl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:412)
        	at javax.media.opengl.GLCanvas.display(GLCanvas.java:244)
        	at javax.media.opengl.GLCanvas.paint(GLCanvas.java:277)
        	at javax.media.opengl.GLCanvas.update(GLCanvas.java:354)
        	at sun.awt.RepaintArea.updateComponent(Unknown Source)
        	at sun.awt.RepaintArea.paint(Unknown Source)
        	at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
        	at java.awt.Component.dispatchEventImpl(Unknown Source)
        	at java.awt.Component.dispatchEvent(Unknown Source)
        	at java.awt.EventQueue.dispatchEvent(Unknown Source)
        	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        	at java.awt.EventDispatchThread.run(Unknown Source)
        
        "TimerQueue" daemon prio=6 tid=0x0b090400 nid=0xa88 in Object.wait() [0x0b5ef000..0x0b5efd94]
           java.lang.Thread.State: TIMED_WAITING (on object monitor)
        	at java.lang.Object.wait(Native Method)
        	- waiting on <0x031a4be8> (a javax.swing.TimerQueue)
        	at javax.swing.TimerQueue.run(Unknown Source)
        	- locked <0x031a4be8> (a javax.swing.TimerQueue)
        	at java.lang.Thread.run(Unknown Source)
        
        "Timer-0" prio=6 tid=0x0b1fbc00 nid=0xa68 in Object.wait() [0x0b59f000..0x0b59fa14]
           java.lang.Thread.State: WAITING (on object monitor)
        	at java.lang.Object.wait(Native Method)
        	- waiting on <0x03003b58> (a java.util.TaskQueue)
        	at java.lang.Object.wait(Object.java:485)
        	at java.util.TimerThread.mainLoop(Unknown Source)
        	- locked <0x03003b58> (a java.util.TaskQueue)
        	at java.util.TimerThread.run(Unknown Source)
        
        "AWT-Windows" daemon prio=6 tid=0x0b029400 nid=0xa24 runnable [0x0b50f000..0x0b50fa94]
           java.lang.Thread.State: RUNNABLE
        	at sun.awt.windows.WToolkit.eventLoop(Native Method)
        	at sun.awt.windows.WToolkit.run(Unknown Source)
        	at java.lang.Thread.run(Unknown Source)
        
        "AWT-Shutdown" prio=6 tid=0x0b028800 nid=0x214 in Object.wait() [0x0b4bf000..0x0b4bfb14]
           java.lang.Thread.State: WAITING (on object monitor)
        	at java.lang.Object.wait(Native Method)
        	- waiting on <0x02fc4180> (a java.lang.Object)
        	at java.lang.Object.wait(Object.java:485)
        	at sun.awt.AWTAutoShutdown.run(Unknown Source)
        	- locked <0x02fc4180> (a java.lang.Object)
        	at java.lang.Thread.run(Unknown Source)
        
        "Java2D Disposer" daemon prio=10 tid=0x0b010c00 nid=0x8a8 in Object.wait() [0x0b46f000..0x0b46fb94]
           java.lang.Thread.State: WAITING (on object monitor)
        	at java.lang.Object.wait(Native Method)
        	- waiting on <0x02fc4218> (a java.lang.ref.ReferenceQueue$Lock)
        	at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        	- locked <0x02fc4218> (a java.lang.ref.ReferenceQueue$Lock)
        	at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        	at sun.java2d.Disposer.run(Unknown Source)
        	at java.lang.Thread.run(Unknown Source)
        
        "Low Memory Detector" daemon prio=6 tid=0x0ab2bc00 nid=0x910 runnable [0x00000000..0x00000000]
           java.lang.Thread.State: RUNNABLE
        
        "CompilerThread0" daemon prio=10 tid=0x0ab27000 nid=0x924 waiting on condition [0x00000000..0x0ad7f698]
           java.lang.Thread.State: RUNNABLE
        
        "Attach Listener" daemon prio=10 tid=0x0ab26000 nid=0xa34 runnable [0x00000000..0x00000000]
           java.lang.Thread.State: RUNNABLE
        
        "Signal Dispatcher" daemon prio=10 tid=0x0ab25000 nid=0xa28 waiting on condition [0x00000000..0x00000000]
           java.lang.Thread.State: RUNNABLE
        
        "Finalizer" daemon prio=8 tid=0x0ab13800 nid=0x3a4 in Object.wait() [0x0ac8f000..0x0ac8fa94]
           java.lang.Thread.State: WAITING (on object monitor)
        	at java.lang.Object.wait(Native Method)
        	- waiting on <0x02ef1300> (a java.lang.ref.ReferenceQueue$Lock)
        	at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        	- locked <0x02ef1300> (a java.lang.ref.ReferenceQueue$Lock)
        	at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        	at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
        
        "Reference Handler" daemon prio=10 tid=0x0ab12800 nid=0x998 in Object.wait() [0x0ac3f000..0x0ac3fb14]
           java.lang.Thread.State: WAITING (on object monitor)
        	at java.lang.Object.wait(Native Method)
        	- waiting on <0x02ef1390> (a java.lang.ref.Reference$Lock)
        	at java.lang.Object.wait(Object.java:485)
        	at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
        	- locked <0x02ef1390> (a java.lang.ref.Reference$Lock)
        
        "VM Thread" prio=10 tid=0x0ab0f800 nid=0x950 runnable 
        
        "VM Periodic Task Thread" prio=10 tid=0x0ab4e800 nid=0x288 waiting on condition 
        
        JNI global references: 1226
        
        Heap
         def new generation   total 960K, used 310K [0x02a00000, 0x02b00000, 0x02ee0000)
          eden space 896K,  32% used [0x02a00000, 0x02a49b60, 0x02ae0000)
          from space 64K,  24% used [0x02af0000, 0x02af3e88, 0x02b00000)
          to   space 64K,   0% used [0x02ae0000, 0x02ae0000, 0x02af0000)
         tenured generation   total 16340K, used 13503K [0x02ee0000, 0x03ed5000, 0x06a00000)
           the space 16340K,  82% used [0x02ee0000, 0x03c0fe00, 0x03c0fe00, 0x03ed5000)
         compacting perm gen  total 14080K, used 13939K [0x06a00000, 0x077c0000, 0x0aa00000)
           the space 14080K,  99% used [0x06a00000, 0x0779cf28, 0x0779d000, 0x077c0000)
        No shared spaces configured.
        ...but from the looks of it, I think there's not much that can be done on that front, except maybe not calling "BasicNetworkStatus.isHostReachable( )" from the Event dispatch thread...

        The good news, though, is that once I modified ApplicationTemplate to set the offline mode to true via the WorldWind class, everything works like a charm. I believe you should make this method static (which I did for my test), because it's itself calling a static method (getNetworkStatus()). Probably just an oversight.

        Many thanks for that offline mode, by the way, it will be very usefull for me too.. My users, like myself, are typically on a Defense network behind an (understandably) paranoid firewall, so I'll be either packaging my layers or get them from an internal WMS server...but I guess at that point I'll have to re-enable the network... hmmmm....something to think about

        Glad to be of help!

        Chiss!
        Last edited by Chiss; 12-06-2007, 03:42 PM. Reason: Added contextual details

        Comment


        • #5
          Hello again,

          What a fantastic set of examples! I'm drooling all over it ! I didn't get the time to check 0.3.0 when it got released, so maybe I'm late to the party..!

          I did notice, however, that the Tracks.java is missing its "tuolumne.gpx" file... All I found was the 3 PipeTracks gpx files.

          Great job with the SDK!

          Chiss!

          Comment


          • #6
            Thanks for trying that. We're unable to duplicate the problem here -- yes, even when we unplug the network cable, and we tried several computers -- so the solution was just a guess based on the stack traces you posted. Can you tell me the characteristics of the machine you're using. Specifically, the number and type of processors, the operating system and the graphics device. Are you connected to some network, even if not a public one, or fully stand-alone?

            Thanks.

            Comment


            • #7
              Here we go:

              Computer : Pentium4 3.2GHz, single CPU with 1Gig of RAM
              O/S : Win2k
              Video: ATI Radeon X600 256M (at least that's what Windows's 'Device Manager' says... It's my machine at work and I'm not allowed to peek under the hood

              The computer is connected to the office LAN which can access the Internet via the corporate firewall.

              I hope this helps!

              Chiss!

              Comment


              • #8
                Tag, thank you very much for the quick response. I am also still having the same problem as chiss described. My machine is a Dell Pentium M Chip, 2.0 GHz, 2 GB RAM laptop.

                I also noticed that the new version somehow does not use the USGS Digital Orth graphics data and high res LandSat data. I can prvoide screen shot of wwj0.3.0 and wwj0.4.1 using the same dataset if you think that helps.

                Comment


                • #9
                  shin103, can you be more specific about the missing layers?
                  My World Wind Java Blog & WW.net Plugins page

                  Comment


                  • #10
                    Patrick,

                    the attached screen shots are taken from running JavaOneDemoA using wwj0.3.0 and wwj0.4.1 respectively on my box without code change. As you can see, the 0.3.0 is using more detailed data than 0.4.1.

                    thanks,

                    Shin.
                    Attached Files

                    Comment


                    • #11
                      It works fine here - using the webstart demo 0.4.1.

                      In the 0.4.1 screenshot your are missing the USGS Urban Ortho layer. I dont know why, but it should be there. Maybe the network was slow and you didnt wait long enough for the tiles to come through... although if it shows in 0.3 then it is in the cache and should be there rightaway in 0.4.1.
                      My World Wind Java Blog & WW.net Plugins page

                      Comment


                      • #12
                        I just removed my cache, ran the JavaOneADemo, zoomed in on that shot of Long Beach until the Urban Ortho images came in -- about 15 seconds total. I then stopped the demo, turned off the machine's network connection, ran the demo again, zoomed in to Long Beach again, and the Urban Ortho images came up immediately. This is a long way of saying that it works for me, even under duress. Are you sure you are either connected to the public network or have the Urban Ortho images of that area in your local cache?

                        Comment


                        • #13
                          tag, thanks for looking into the problem. I tried it again... the Urban Ortho image came in after I run the webstart demo first for a couple areas with wwj0.4.1. Perhaps I am missing some lower res data and just have the high res data on hand. I am still having trouble with the Digital Ortho data, I will have to try that outside our firewalled area to see if I can get that back again.

                          Comment


                          • #14
                            There may have been a change between 3.0 and 4.0, 4.1 that requires the low res data to be in the cache before the hi res tiles will be displayed.
                            I downloaded the hi res with 3.0. To do that with just a dialup I changed:
                            URLReadTimeout was increased
                            RetrievalPoolSize was reduced
                            RetrievalQueueSize was reduced

                            Offline with 3.0 the hi res shows fine. With 4.0 or 4.1 they do not for the airports at Long Beach, Ontario, Tucson, Denver, Ankorage, etc. For LAX and Salt Lake where the lower res were downloaded also then the hi res will show. This effects not only the Urban Ortho but even the Digital Ortho and Landsat.

                            You might try keeping the Urban hi res, L9, and deleting the lower res for an area, then pull the plug or disable any download connection before starting 4.0 or 4.1 and see if the hi res L9 will show without the lower res for that area.
                            Neil
                            http://www.nlneilson.com

                            Comment


                            • #15
                              One thing that has changed in 0.4 - and was forgotten in the readme, is the image tiles loading logic.

                              Before 0.4, WWJ would request and load the tiles for the level you need - nothing more. Since 0.4, tiles with lower res will be requested and loaded first until you reach the needed level. So for any location, WW will be looking for lower res tiles first before addressing the current needed resolution. That ensures the layer will stay consistent when zooming out - no tiles missing.

                              This change may have affected the offline behavior if you only have higher res levels without the lower res ones in your cache.
                              My World Wind Java Blog & WW.net Plugins page

                              Comment

                              Working...
                              X