Performance Tuning Guide
AutoOrtho includes advanced performance tuning options that allow you to balance image quality against loading times and in-flight stuttering. This guide explains each setting and provides recommendations for different use cases.
Quick Start: Performance Presets
For most users, the easiest way to configure performance is using the Performance Preset dropdown in Settings → Performance Tuning:
| Preset | Best For | Trade-off |
|---|---|---|
| Fast | Weak CPUs, slow internet, stutter-free experience | May have occasional missing/low-res tiles |
| Balanced | Most users | Good balance of quality and performance |
| Quality | Fast CPUs, fast internet, maximum image quality | May have longer loading times |
| Custom | Advanced users who want fine-grained control | Manual configuration required |
Detailed Settings Reference
Zoom Level (Critical Performance Factor)
The Max Zoom Level setting has the most significant impact on loading times and resource usage. Understanding this is crucial for optimizing performance.
How Zoom Levels Work
Each zoom level doubles the resolution in both dimensions, meaning each zoom level increase requires 4× the resources of the previous level:
| Zoom Level | Chunks per Tile | Relative Resources | Typical Use |
|---|---|---|---|
| ZL14 | 16 (4×4) | 1× (baseline) | Low detail, fast loading |
| ZL15 | 64 (8×8) | 4× | Medium detail |
| ZL16 | 256 (16×16) | 16× | High detail (default) |
| ZL17 | 1024 (32×32) | 64× | Very high detail |
| ZL18 | 4096 (64×64) | 256× | Maximum detail, slowest |
Impact on Performance
Downloads: At ZL17, you need to download 4× more image chunks than ZL16. At ZL18, that's 16× more than ZL16.
Processing: Each chunk must be decoded (JPEG→RGB) and compressed (RGB→DDS). More chunks = more CPU time.
Memory: Higher zoom levels require more RAM to hold all the image data during processing.
Storage: Cache size grows exponentially with zoom level.
Recommendations by System
| System Type | Recommended Max Zoom | Notes |
|---|---|---|
| Low-end / Slow internet | ZL15 | Fastest loading, acceptable quality |
| Mid-range | ZL16 | Good balance (default) |
| High-end / Fast internet | ZL17 | High quality, longer loading |
| Enthusiast | ZL18 | Maximum quality, expect long loads |
Example: Loading Time Impact
Assuming 50ms average per chunk download:
| Zoom Level | Chunks | Theoretical Min Time |
|---|---|---|
| ZL15 | 64 | ~3.2 seconds |
| ZL16 | 256 | ~12.8 seconds |
| ZL17 | 1024 | ~51.2 seconds |
| ZL18 | 4096 | ~3.4 minutes |
Note: Actual times vary based on parallelism, caching, and network conditions. These are theoretical minimums to illustrate the exponential scaling.
Config File Setting
# Maximum zoom level for imagery (14-18)
# Higher = better quality but exponentially longer loading times
# Each level increase = 4× more resources needed
maptype_override_zoom = 16
Tip: If you're experiencing long loading times or frequent missing tiles, consider lowering your max zoom level before adjusting other settings.
Time Budget System
The Time Budget system controls how long AutoOrtho spends loading each tile before returning a result to X-Plane.
Enable Time Budget (use_time_budget)
- Type: Boolean (True/False)
- Default: True
- Config file:
use_time_budget = True
When enabled, AutoOrtho uses a wall-clock time limit for tile requests instead of the legacy per-chunk timeout system. This provides more predictable performance and reduces stuttering.
Recommendation: Keep enabled unless you experience issues.
Tile Time Budget (tile_time_budget)
- Type: Float (seconds)
- Default: 180
- Range: 60 - 600 seconds
- Config file:
tile_time_budget = 180.0
The maximum wall-clock time for a complete tile (all mipmap levels combined). This budget measures active processing time only - queue wait time doesn't count. The budget starts when AutoOrtho actually begins processing the tile's chunks, not when the tile is first requested.
| Value | Use Case | Effect |
|---|---|---|
| 60 - 120.0s | Fast/smooth experience | Quicker loading, but more partial tiles |
| 120.0 - 300.0s | Balanced | Good quality with reasonable loading times |
| 300 - 600.0s | Maximum quality | Complete tiles, but longer loading times |
How it works:
1. X-Plane requests a tile from AutoOrtho (tile enters processing queue)
2. Budget timer starts when AutoOrtho actually begins downloading/processing chunks for this tile
3. AutoOrtho builds all mipmaps (4 → 3 → 2 → 1 → 0) sharing this budget
4. After tile_time_budget seconds of active processing, AutoOrtho builds the DDS with whatever is complete
5. Any incomplete areas use the configured missing_color
Note: Queue wait time (when other tiles are being processed first) does NOT count against the budget. This ensures fair time allocation even when many tiles are requested simultaneously.
Note: Each tile covers a large geographic area (approximately 1 square degree of latitude/longitude at zoom 16). Higher budgets allow more time for all chunks to download and process.
Note: The effectiveness of this setting will also depend on your configured max zoom level. Higher zoom levels with lower budget times will result in faster loading but lots of missing tiles.
Fallback System
When chunks fail to download in time, the fallback system provides alternative imagery to prevent missing tiles.
Fallback Level (fallback_level)
- Type: String (none, cache, full)
- Default: cache
- Config file:
fallback_level = cache
Controls which fallback mechanisms are enabled:
| Level | Fallback 1 (Disk Cache) | Fallback 2 (Scale Mipmaps) | Fallback 3 (Network) | Use Case |
|---|---|---|---|---|
| none | ❌ Disabled | ❌ Disabled | ❌ Disabled | Fastest, may have green/missing tiles |
| cache | ✅ Enabled | ✅ Enabled | ❌ Disabled | Balanced - uses cached data only |
| full | ✅ Enabled | ✅ Enabled | ✅ Enabled | Best quality - can download lower-detail alternatives |
Fallback Chain Explained:
-
Fallback 1 - Disk Cache: Searches your local cache for a lower-zoom version of the same imagery. Fast and free.
-
Fallback 2 - Scale from Mipmaps: Scales imagery from already-built lower-detail mipmap levels. Very fast.
-
Fallback 3 - Network Download: Downloads lower-detail imagery on-demand from the server. Slowest but provides the best fill-in quality.
Recommendation: Use cache for most users. Use full if you have fast internet and prefer complete imagery over speed.
Fallback Extends Budget (fallback_extends_budget)
- Type: Boolean (True/False)
- Default: False
- Config file:
fallback_extends_budget = False
Only applies when fallback_level = full.
When enabled, network fallbacks (Fallback 3) will continue even after the tile time budget is exhausted. This prioritizes image quality over strict timing.
| Setting | Behavior | Effect |
|---|---|---|
| False (default) | Fallbacks respect budget | Faster loading, may have some missing tiles |
| True | Fallbacks ignore budget | Better quality, may cause longer load times |
When to enable: - You prioritize having complete imagery over loading speed - You have a fast, reliable internet connection - You don't mind occasional longer loading times
When to keep disabled: - You want predictable, stutter-free performance - Your internet is slow or unreliable - Loading speed is more important than perfect imagery
Extended Fallback Timeout (fallback_timeout)
- Type: Float (seconds)
- Default: 3.0
- Range: 1.0 - 10.0 seconds
- Config file:
fallback_timeout = 3.0
Only applies when fallback_extends_budget = True.
When extended fallbacks are enabled, this controls how long each lower-detail mipmap level waits for its chunks to download. The total additional time is this value multiplied by the number of mipmap levels tried (typically 3-4 levels).
| Value | Per-Level Wait | Total Extra Time (4 levels) | Use Case |
|---|---|---|---|
| 1.5s | 1.5 seconds | ~6 seconds | Fast - minimize extra wait |
| 3.0s | 3.0 seconds | ~12 seconds | Balanced (default) |
| 5.0s | 5.0 seconds | ~20 seconds | Quality - more time for slow connections |
| 10.0s | 10.0 seconds | ~40 seconds | Maximum - ensure fallbacks succeed |
Example calculation:
- tile_time_budget = 10s (exhausted after 10 seconds)
- fallback_timeout = 3.0s
- Fallback tries mipmap levels 1, 2, 3, 4 → 4 levels × 3.0s = 12 seconds max
- Total worst-case time: 10s + 12s = 22 seconds
Recommendation: Start with 3.0s. If you see fallbacks timing out (check logs), increase to 5.0s. If loading is too slow, decrease to 1.5s.
Startup Loading Behavior
Suspend Maxwait (suspend_maxwait)
- Type: Boolean (True/False)
- Default: True
- Config file:
suspend_maxwait = True
When enabled, AutoOrtho extends timeout values during initial scenery loading (before the first flight begins). This allows more time for downloads to complete during the initial load, resulting in fewer missing tiles when the flight starts.
How it works: - AutoOrtho detects the "loading" phase by tracking if X-Plane has ever sent flight data via UDP - During initial loading (before first connection), the tile time budget is multiplied by 10× - Once the flight begins (X-Plane starts sending position data), normal timeouts resume permanently - Important: Temporary disconnects (e.g., from stuttering) do NOT re-enable extended timeouts
| Phase | Time Budget Behavior |
|---|---|
| Initial loading (never connected) | tile_time_budget × 10 |
| Flying (UDP connected) | tile_time_budget (normal) |
| Temporary disconnect (stutter) | tile_time_budget (normal - no penalty) |
Stall Detection:
AutoOrtho monitors download progress and will log warnings if downloads appear stalled:
- After 60 seconds with no successful downloads: "Downloads appear slow..." warning
- After 180 seconds with no successful downloads: "⚠️ DOWNLOADS STALLED..." warning
These warnings help identify server-side throttling vs client-side issues.
Note: If you experience very long loading times (>5 minutes stuck at "Reading scenery files"), this may indicate: - Server throttling (especially with BI/Bing imagery during high-traffic periods) - Network connectivity issues - Very high zoom level with slow internet connection
Troubleshooting Long Loading Times:
1. Check AutoOrtho logs for "Downloads appear slow" or "DOWNLOADS STALLED" warnings - these indicate server throttling
2. Try a different imagery source (GO2, EOX) to rule out server-specific issues
3. Lower your max zoom level temporarily to reduce download volume
4. Ensure your file cache is enabled - subsequent flights load much faster
5. If issues persist, set suspend_maxwait = False for stricter timeouts during loading (may result in more missing tiles initially)
Dynamic Zoom Levels
The Dynamic Zoom system automatically adjusts imagery quality based on your altitude Above Ground Level (AGL). This provides higher detail when flying low and saves resources at high altitudes where detail matters less.
Why AGL Instead of MSL?
AutoOrtho uses AGL (Above Ground Level) altitude from X-Plane's y_agl dataref rather than MSL (Mean Sea Level) pressure altitude. This provides more accurate terrain-aware imagery quality:
| Scenario | MSL Altitude | Terrain Elevation | AGL Altitude | Zoom Decision |
|---|---|---|---|---|
| Flying over ocean | 10,000ft | 0ft | 10,000ft AGL | Lower zoom OK |
| Flying over mountains | 10,000ft | 5,000ft | 5,000ft AGL | Higher zoom needed |
| Approaching mountain airport | 8,000ft | 7,000ft | 1,000ft AGL | Maximum zoom |
With AGL, you automatically get higher quality imagery when flying low over terrain, regardless of the terrain's MSL elevation.
Enable Dynamic Zoom (max_zoom_mode)
- Type: String (fixed, dynamic)
- Default: fixed
- Config file:
max_zoom_mode = fixed
| Mode | Description |
|---|---|
| fixed | Use the same zoom level everywhere (traditional behavior) |
| dynamic | Automatically adjust zoom based on AGL altitude |
Configuring Quality Steps
Quality Steps define zoom levels for different altitude ranges. Each step specifies: - Altitude (AGL): The altitude threshold in feet above ground - Zoom Level: The maximum zoom level for normal tiles - Airports Zoom Level: The maximum zoom level near airports (can be higher for detail)
Example configuration:
| Altitude (AGL) | Normal ZL | Airports ZL | Use Case |
|---|---|---|---|
| 0ft+ | ZL17 | ZL18 | On ground / very low |
| 5,000ft+ | ZL16 | ZL17 | Low altitude flight |
| 15,000ft+ | ZL15 | ZL16 | Medium altitude |
| 30,000ft+ | ZL14 | ZL15 | High altitude cruise |
How altitude prediction works:
When a tile is requested, AutoOrtho predicts your altitude when you'll be closest to that tile:
- Gets your current position, heading, speed, and vertical speed
- Calculates when you'll be closest to the tile
- Predicts your AGL altitude at that time
- Selects the appropriate zoom level for that predicted altitude
This means tiles ahead of you during a descent will load at higher detail than tiles behind you.
Fallback Behavior
When X-Plane DataRefs are not available (before flight starts, loading screens): - Dynamic zoom falls back to the base step (0ft AGL quality level) - This ensures tiles load at maximum configured quality during scenery loading
Spatial Prefetching
The prefetching system proactively downloads tiles ahead of your aircraft to reduce in-flight stuttering.
Enable Prefetching (prefetch_enabled)
- Type: Boolean (True/False)
- Default: True
- Config file:
prefetch_enabled = True
When enabled, AutoOrtho monitors your aircraft's position, heading, and speed to predict which tiles you'll need next and downloads them in advance.
How it works:
With SimBrief flight data loaded: 1. AutoOrtho follows your actual flight plan, interpolating between waypoints 2. Uses SimBrief's calculated times (accounting for winds and climb/descent) 3. Prioritizes tiles by time-to-encounter (closest tiles first) 4. Downloads tiles uniformly along your entire route
Without SimBrief (velocity-based): 1. AutoOrtho tracks your aircraft's heading and ground speed 2. It calculates which tiles are in your flight path ahead 3. It downloads those tiles in the background before you reach them
Prefetching with Dynamic Zoom:
When Dynamic Zoom is enabled, the prefetcher uses your predicted AGL altitude at each prefetch location to determine the appropriate zoom level. This means: - Tiles prefetched for a descent will be at higher zoom levels - Tiles prefetched for cruise will be at lower zoom levels - Each prefetched tile matches what you'll actually need when you get there
Recommendation: Keep enabled for the smoothest in-flight experience.
Lookahead Time (prefetch_lookahead)
- Type: Integer (minutes)
- Default: 10
- Range: 1 - 60 minutes
- Config file:
prefetch_lookahead = 10
How far ahead (in minutes of flight time) to prefetch tiles.
| Value | At 150 kts | At 300 kts | At 500 kts | Use Case |
|---|---|---|---|---|
| 5 min | ~12nm | ~25nm | ~42nm | Conservative, less bandwidth |
| 10 min | ~25nm | ~50nm | ~83nm | Balanced (default) |
| 20 min | ~50nm | ~100nm | ~166nm | Longer flights, faster aircraft |
| 30 min | ~75nm | ~150nm | ~250nm | Cross-country flights |
| 60 min | ~150nm | ~300nm | ~500nm | Maximum prefetch coverage |
Example: At 300 knots ground speed with 10 minute lookahead: - Distance: 300 kts × 10 min = 50 nautical miles ahead - AutoOrtho will prefetch tiles up to 50nm in front of you
Recommendation:
- Short flights / GA: 5-10 minutes
- Medium flights / Jets: 10-20 minutes
- Long haul / Fast jets: 20-30 minutes
Per-Chunk Timeout Settings
These settings work alongside the tile time budget to control individual chunk download behavior.
Per-Chunk Max Wait (maxwait)
- Type: Float (seconds)
- Default: 5.0
- Range: 0.1 - 10.0
- Config file:
maxwait = 5.0 - UI: Settings → Advanced Settings → Per-chunk max wait
Maximum time to wait for a single chunk to download. This works in combination with the tile time budget:
- Tile Time Budget: Total time for the entire tile (all 256 chunks)
- Per-Chunk Max Wait: Maximum time for each individual chunk download
A chunk will stop waiting when either limit is reached, whichever comes first. This prevents a single slow chunk from consuming the entire tile budget.
How it works:
For each chunk:
wait_time = min(remaining_tile_budget, maxwait)
wait for chunk up to wait_time
Recommended values:
| Network Speed | Recommended maxwait |
|--------------|----------------------|
| Fast (fiber) | 2.0 seconds |
| Normal (cable/DSL) | 5.0 seconds (default) |
| Slow/unreliable | 10.0 seconds |
When time budget is disabled: This becomes the sole timeout mechanism — each chunk waits up to maxwait seconds independently, which can result in much longer total tile times (up to 256 × maxwait for a full tile).
Extended Loading at Startup (suspend_maxwait)
- Type: Boolean
- Default: True
- Config file:
suspend_maxwait = True - UI: Settings → Advanced Settings → "Allow extra loading time during startup"
When enabled, AutoOrtho uses significantly longer timeouts during X-Plane's initial scenery load (before the flight starts). This ensures tiles load at full quality before you begin flying.
Startup behavior when enabled:
| Setting | Normal Flight | During Startup |
|---|---|---|
| Tile Time Budget | As configured | 10× the configured value |
| Per-Chunk Max Wait | As configured | 20 seconds |
Example: With tile_time_budget = 180 and maxwait = 5.0:
- During startup: 1800s tile budget, 20s per-chunk wait
- During flight: 180s tile budget, 5s per-chunk wait
How startup is detected: AutoOrtho considers you to be in "startup mode" until X-Plane's DataRef connection is established, which happens when the flight becomes active (after the "Reading new scenery files" splash screen).
Trade-offs: - ✅ Better initial scenery quality (fewer blurry/missing tiles at flight start) - ✅ Reduces low-resolution and placeholder tiles - ⚠️ May increase initial scenery loading time
⚠️ Tip: Long X-Plane Loading Times?
If you're experiencing significantly longer X-Plane loading times, try setting "Allow extra loading time during startup" to Off. This option can dramatically increase scenery loading times, especially when combined with higher zoom levels or slower internet connections. Disabling it will use the normal time budgets during startup, resulting in faster loads at the cost of potentially lower initial scenery quality.
Recommended Configurations
Stutter-Free Flying (Prioritize Performance)
use_time_budget = True
tile_time_budget = 120.0
fallback_level = cache
fallback_extends_budget = False
prefetch_enabled = True
prefetch_lookahead = 30
max_zoom_level = 16
Maximum Quality (Prioritize Imagery)
use_time_budget = True
tile_time_budget = 300
fallback_level = full
fallback_extends_budget = True
prefetch_enabled = True
prefetch_lookahead = 60
max_zoom_level = 17
Slow Internet Connection
use_time_budget = True
tile_time_budget = 180
fallback_level = cache
fallback_extends_budget = False
prefetch_enabled = True
prefetch_lookahead = 90
max_zoom_level = 16
Weak CPU / Limited System
use_time_budget = True
tile_time_budget = 180
fallback_level = none
fallback_extends_budget = False
prefetch_enabled = False
max_zoom_level = 15
Understanding the Statistics
AutoOrtho logs performance statistics that can help you tune your settings:
STATS: {'mm_count:0': 12, 'mm_count:1': 26, 'chunk_budget_skipped': 8782, 'chunk_missing_count': 394}
Key Statistics
| Statistic | Meaning |
|---|---|
mm_count:N |
Successful mipmap builds at level N (0=highest detail) |
chunk_budget_skipped |
Chunks skipped because time budget ran out |
chunk_missing_count |
Chunks that ended up with missing color (no fallback worked) |
Healthy indicators:
- High mm_count:0 values = high-detail tiles completing successfully
- Low chunk_missing_count = fallbacks working well
Warning signs:
- High chunk_budget_skipped = many chunks timing out, increase tile_time_budget
- High chunk_missing_count = fallbacks not covering gaps, enable more fallbacks
Breaking Down Tile Creation Time
Each tile creation has two main phases:
- Download + Compose (typically 60-80% of time)
- Downloading 64-4096 image chunks (depending on zoom level)
- Decoding JPEG data
-
Compositing into a single image
-
Compression (typically 20-40% of time)
- Converting RGBA to DDS format
- Generating mipmaps
The stats show both the total time and compression-only time, letting you identify bottlenecks: - If compression time is high → CPU-bound, consider lowering zoom level - If download time is high → Network-bound, check internet speed
Time-Based Exclusion
AutoOrtho includes a time-based exclusion feature that allows you to automatically disable AutoOrtho scenery during specific time ranges in the simulator. This is useful for night flying when satellite imagery provides little benefit.
How It Works
When time exclusion is active:
- AutoOrtho monitors the simulator's local time via the
sim/time/local_time_secdataref - During the exclusion period, DSF file reads are redirected to X-Plane's global scenery
- X-Plane uses its default scenery (which often has better night lighting)
- When the exclusion period ends, AutoOrtho scenery becomes available again
Important: DSF files are never hidden from X-Plane. X-Plane indexes DSF files at flight load time, so hiding them would cause missing terrain. Instead, AutoOrtho redirects reads to the corresponding global scenery DSF files, ensuring terrain data is always available.
Safety Features
The time exclusion system includes important safety features:
- Active DSF Protection: DSF files that are currently in use by X-Plane will NOT be redirected, even if the exclusion period starts. This prevents crashes or graphical glitches.
- Gradual Transition: Only new DSF requests are redirected during exclusion. Previously loaded scenery continues to work until X-Plane naturally releases it.
- Global Scenery Fallback: When redirecting, AutoOrtho looks for the equivalent DSF in X-Plane's Global Scenery folder. If not found, the original AutoOrtho file is served.
Configuration
Enable Time Exclusion (enabled)
- Type: Boolean (True/False)
- Default: False
- Config file:
[time_exclusion]section,enabled = True
Enable or disable the time-based exclusion feature.
Start Time (start_time)
- Type: String (HH:MM format)
- Default: 22:00
- Config file:
start_time = 22:00
The time when the exclusion period begins (24-hour format). For example, "22:00" for 10 PM.
End Time (end_time)
- Type: String (HH:MM format)
- Default: 06:00
- Config file:
end_time = 06:00
The time when the exclusion period ends (24-hour format). For example, "06:00" for 6 AM.
Default to Exclusion (default_to_exclusion)
- Type: Boolean (True/False)
- Default: False
- Config file:
default_to_exclusion = False
Controls behavior when sim time is not yet available (before flight starts):
| Setting | Behavior |
|---|---|
| False (default) | AutoOrtho works normally until sim time confirms exclusion |
| True | Assume exclusion is active until sim time proves otherwise |
When to enable: - You want night flights to start with default scenery from the very beginning - You don't want any AutoOrtho scenery loaded before sim time is available
When to keep disabled: - You prefer AutoOrtho to work normally during loading screens - You only want exclusion to apply when sim time is confirmed
Decision Preservation During Scenery Reload
Once the simulator time becomes available and AutoOrtho determines the correct exclusion state, this decision is preserved during temporary disconnections such as when you trigger "Reload Scenery" in X-Plane.
Why this matters:
Without decision preservation, the following problem would occur: 1. You start a flight with "Default to Exclusion" enabled 2. Time exclusion activates initially (no sim time available yet) 3. Sim time becomes available (e.g., 15:00 / 3 PM) → exclusion deactivates correctly 4. You trigger "Reload Scenery" in X-Plane 5. During reload, sim time temporarily becomes unavailable 6. ❌ Without preservation: exclusion would incorrectly re-activate 7. ✅ With preservation: exclusion stays inactive (correct behavior)
How it works:
- When sim time is received, AutoOrtho records both the time and the exclusion decision
- If sim time becomes temporarily unavailable (during reload), the last decision is preserved
- The preserved decision is updated whenever new sim time data is received
- Normal time-based transitions still work (crossing into/out of exclusion hours)
Limitations:
| Limitation | Description |
|---|---|
| Persists until restart | The preserved decision remains until AutoOrtho is fully restarted |
| To reset behavior | Quit and restart AutoOrtho to return to the default_to_exclusion initial behavior |
| Updates on new time | If sim time indicates a state change (e.g., crossing into night), it will update when time becomes available again |
💡 Tip: If you notice the exclusion state is "stuck" after multiple scenery reloads, simply restart AutoOrtho to reset to the configured default behavior.
Example Configuration
To disable AutoOrtho between 10 PM and 6 AM (night hours):
[time_exclusion]
enabled = True
start_time = 22:00
end_time = 06:00
default_to_exclusion = False
To ensure exclusion is active from the moment AutoOrtho starts (before sim time is available):
[time_exclusion]
enabled = True
start_time = 22:00
end_time = 06:00
default_to_exclusion = True
Overnight Ranges
The system correctly handles overnight time ranges. For example, if you set: - Start: 22:00 (10 PM) - End: 06:00 (6 AM)
AutoOrtho will be disabled from 10 PM until 6 AM the next morning.
UI Configuration
You can configure time exclusion in the AutoOrtho Settings tab:
- Go to Settings tab
- Find the Time Exclusion Settings group
- Check Enable time-based exclusion
- Set the Start time and End time in HH:MM format
Use Cases
- Night Flying: Satellite imagery is often dark or less useful at night. Default X-Plane scenery may have better night lighting.
- Performance Optimization: Reduce network usage and CPU load during night hours when visual quality matters less.
- Dawn/Dusk Flying: Exclude twilight hours when satellite imagery transitions may look unrealistic.
SimBrief Integration
AutoOrtho can integrate with SimBrief to enhance Dynamic Zoom and Prefetching using your actual flight plan data. This provides more accurate predictions than velocity-based calculations alone.
Setting Up SimBrief Integration
- Go to Settings → Setup tab
- Find the SimBrief Integration section
- Enter your SimBrief User ID (found in your SimBrief account settings)
- Click Fetch Flight Data after filing your flight plan in SimBrief
- Enable Use Flight Data for Dynamic Zoom Level and Pre-fetching Calculations
Note: You can load SimBrief flight data at any time — before or after pressing "Run". The toggle takes effect immediately, so you don't need to restart AutoOrtho or save the config when loading a flight plan mid-session.
How It Works
When SimBrief integration is enabled and flight data is loaded:
Dynamic Zoom with SimBrief
Instead of predicting altitude based on current vertical speed, AutoOrtho uses your planned altitudes from SimBrief:
- For each tile, finds the closest waypoint(s) in your flight plan
- Uses the planned AGL altitude at those waypoints
- If multiple waypoints are within the consideration radius (default 50nm), uses the lowest AGL altitude for conservative quality
Conservative AGL Calculation: - Uses the lowest flight altitude (MSL) among nearby waypoints — accounts for descents - Uses the highest ground elevation — accounts for mountains - AGL = lowest_MSL - highest_ground = most conservative (highest quality) result
Prefetching with SimBrief
Instead of prefetching based on velocity vector prediction, AutoOrtho follows your actual flight path with time-based prioritization:
- Projects your position onto the route — finds exactly where you are on the flight plan
- Calculates your "current time" — interpolates between waypoint times based on position
- Walks forward along the entire path — interpolating between waypoints at regular intervals (not just around waypoints)
- Uses SimBrief's planned times — accounts for winds, climb/descent speeds, and holds
- Calculates time-to-encounter for each point along the path
- Prioritizes tiles by time — tiles you'll reach sooner are prefetched first
- Stops at the configured lookahead time — doesn't waste bandwidth on distant tiles
Key advantage: The path is uniformly sampled between waypoints, so even long oceanic legs or direct routes with distant waypoints get full coverage. Tiles are downloaded in the order you'll actually encounter them.
Example: If your next waypoint is 200nm away but you'll pass near a tile in 5 minutes, that tile is prefetched before tiles near the waypoint itself.
Configuration Options
These settings are available in Settings → Setup → SimBrief Integration when flight data is loaded and the "Use Flight Data" toggle is enabled.
| Setting | Default | Range | Description |
|---|---|---|---|
| Route Consideration Radius | 50 nm | 10-200 nm | Radius around a tile to consider waypoints for altitude calculation. Uses the lowest altitude among nearby waypoints for conservative zoom level selection. |
| Route Deviation Threshold | 40 nm | 5-100 nm | Maximum distance off-route before falling back to DataRef-based calculations. Accounts for ATC vectors or weather avoidance. |
| Route Prefetch Radius | 40 nm | 10-150 nm | Radius around path points for pre-fetching tiles. Larger values prefetch more tiles perpendicular to your route. |
ℹ Real-time Changes: All route settings take effect immediately when modified — no restart required. However, use Save Config to persist your values for future AutoOrtho sessions.
Fallback Behavior
SimBrief integration gracefully falls back to DataRef-based calculations when:
- No flight data loaded: Use velocity-based prediction from X-Plane DataRefs
- Aircraft off-route: If you deviate more than 40nm from the planned route, AutoOrtho assumes you're no longer following the plan and falls back to DataRef calculations
- DataRefs unavailable: If X-Plane isn't sending data yet, uses the base quality step (0ft AGL = maximum quality)
Example Workflows
Option A: Load flight plan before starting
- File flight plan in SimBrief (e.g., KJFK → KLAX)
- Start AutoOrtho and go to Settings → Setup
- Enter SimBrief User ID and click "Fetch Flight Data"
- Verify flight info displays correctly (route, cruise altitude, aircraft)
- Enable toggle "Use Flight Data for Dynamic Zoom..."
- Press Run — AutoOrtho starts and begins prefetching along your route
- Start X-Plane and fly your route
Option B: Load flight plan after starting (mid-session)
- Start AutoOrtho and press Run (with your SimBrief User ID already saved)
- Start X-Plane and begin your flight
- File flight plan in SimBrief when ready
- Go to Settings → Setup and click "Fetch Flight Data"
- Enable toggle — takes effect immediately, no restart needed
- AutoOrtho will immediately start using your flight plan for prefetching and dynamic zoom
Known Limitations
Zoom Level Transitions
When flying through areas where the zoom level changes (e.g., from ZL16 to ZL15 during climb), you may notice:
- Hard visual transitions: Adjacent tiles at different zoom levels may have visible seams due to:
- Different imagery capture dates
- Different color processing/calibration
-
Resolution differences at tile boundaries
-
Color mismatches: Satellite imagery from different zoom levels is often captured at different times, so colors, seasons, and lighting may not match perfectly.
Mitigation strategies: - Configure fewer, larger altitude steps to reduce the number of transitions - Accept some quality variation for the performance benefits - Use similar zoom levels for adjacent altitude ranges (e.g., ZL16/ZL16 instead of ZL16/ZL14)
SimBrief Integration Limitations
| Limitation | Description |
|---|---|
| Single flight plan | Only the most recently fetched SimBrief flight plan is used. Multi-leg flights require re-fetching between legs. |
| Static ground heights | Ground elevation data comes from SimBrief's database, which may differ slightly from X-Plane's terrain. |
| Route deviation detection | The 40nm off-route threshold is a straight-line distance, not a cross-track distance. Complex routes near waypoints may trigger false positives. |
| No automatic refresh | Flight data is fetched once when you click the button. Changes to your SimBrief flight plan require manual re-fetch. |
| Holding patterns | SimBrief fixes don't include holding patterns. If you hold, AutoOrtho may use incorrect altitude predictions. |
DataRef-Based Prediction Limitations
When not using SimBrief (or when off-route), altitude prediction uses X-Plane DataRefs:
| Limitation | Description |
|---|---|
| Vertical speed extrapolation | Assumes current vertical speed will continue, which may not be accurate for complex climb/descent profiles. |
| 60-second averaging window | Predictions are based on a 60-second rolling average, so rapid changes in flight path take time to reflect. |
| No terrain awareness | DataRef-based predictions use current AGL but don't know about upcoming terrain changes. |
Prefetching Limitations
| Limitation | Description |
|---|---|
| Priority system | Prefetched tiles are always lower priority than tiles X-Plane directly requests. During rapid maneuvering, prefetching pauses. |
| Network-dependent | Prefetching requires available network bandwidth. On slow connections, prefetching may not keep up with fast aircraft. |
| Cache eviction | Prefetched tiles can be evicted from cache if memory limits are reached before you reach those tiles. |
General Limitations
| Limitation | Description |
|---|---|
| Imagery availability | Not all zoom levels are available in all areas. Some regions only have imagery up to ZL15 or ZL16. |
| Server-side rate limiting | Excessive requests may be throttled by imagery providers, affecting both real-time and prefetch downloads. |
| Memory usage | Higher zoom levels and extensive prefetching increase memory usage. Monitor system RAM on limited systems. |
Native Pipeline Architecture
AutoOrtho includes a high-performance native pipeline (aopipeline) written in C that bypasses Python's Global Interpreter Lock (GIL) for CPU-intensive operations. This provides 10-20x faster DDS texture building compared to the Python-only path.
Why Native Code?
Python's GIL (Global Interpreter Lock) prevents true multi-threading for CPU-bound work. Even with multiple Python threads, only one can execute Python bytecode at a time. This caused stutters when multiple DDS textures needed to be built simultaneously.
The native pipeline solves this by: 1. Moving CPU-intensive work entirely to C code 2. Using OpenMP for true parallel execution across all CPU cores 3. Calling into Python only for orchestration, not computation
Components
The native pipeline consists of four modules:
| Module | Purpose | Parallelism |
|---|---|---|
| AoCache | Batch file I/O for cached JPEGs | OpenMP parallel reads |
| AoDecode | JPEG decoding via TurboJPEG | OpenMP parallel decodes |
| AoDDS | DDS texture building with ISPC compression | OpenMP parallel compression |
| AoHttp | HTTP downloads via libcurl | Connection pooling, HTTP/2 |
How It Works
When X-Plane requests a tile, AutoOrtho's native pipeline:
- Batch reads all cached JPEG chunks in parallel (256 files for ZL16)
- Batch decodes all JPEGs using thread-local TurboJPEG handles
- Composes the full tile image using SIMD-optimized operations
- Compresses each DDS mipmap level in parallel using ISPC
- Returns the complete DDS to Python for serving to X-Plane
All steps happen in native C threads, completely bypassing the Python GIL.
Performance Impact
| Metric | Python-Only | Native Pipeline | Improvement |
|---|---|---|---|
| Cache read (256 files) | 500ms | 50ms | 10x |
| JPEG decode (256 chunks) | 800ms | 100ms | 8x |
| DDS compression | 1000ms | 80ms | 12x |
| Total tile build | 2.5s | ~260ms | ~10x |
Configuration
[autoortho]
# Maximum threads for native pipeline (0 = auto from CPU cores)
# Controls parallelism for cache I/O, JPEG decoding, and DDS compression
# Set to 1 for single-threaded mode (lowest CPU, slowest builds)
native_pipeline_threads = 0
# Disk-based DDS cache size in MB (0 = disabled)
# Uses temp directory, auto-cleaned on session end
ephemeral_dds_cache_mb = 4096
Thread Configuration
| Value | Behavior |
|---|---|
| 0 (default) | Auto-detect CPU cores, use all available |
| 1 | Single-threaded (useful for debugging or very low-end CPUs) |
| N | Limit to N threads (balance performance vs other applications) |
Ephemeral DDS Cache
The native pipeline includes an ephemeral disk cache for pre-built DDS textures:
- Memory tier: Fast access for recently used tiles (configurable, default 512MB)
- Disk tier: Overflow storage in temp directory (configurable, default 4GB)
- Auto-cleanup: Disk cache is deleted when AutoOrtho exits
This hybrid approach provides: - ✅ Large cache capacity without permanent disk usage - ✅ Fresh tiles every session (no stale/corrupted cache) - ✅ Settings changes take effect immediately (no cache invalidation needed)
Native HTTP Client
The native HTTP client uses libcurl's multi-interface for high-performance chunk downloads:
| Feature | Benefit |
|---|---|
| Connection pooling | Reuses TCP connections across requests |
| HTTP/2 multiplexing | Multiple requests over single connection |
| Batch processing | Amortizes Python overhead across 64 chunks |
| Parallel downloads | True concurrent I/O, not GIL-limited |
This is especially impactful during initial loading when 100,000+ chunk requests are queued.
Important Caveats
Apple Maps Fallback
Apple Maps (APPLE imagery source) always uses the Python HTTP client, not the native client. This is intentional because:
- Dynamic token: Apple requires a session-specific access token obtained via DuckDuckGo proxy
- Token rotation: On 403/410 errors, the token must be refreshed and the request retried
- Complex logic: The Python path handles all this special authentication flow
Impact: Apple Maps downloads may be slightly slower than other sources, but all retry logic and token handling works correctly.
# Native HTTP path (fast):
BI, EOX, ARC, NAIP, USGS, FIREFLY, YNDX, GO2 → libcurl → parallel downloads
# Python fallback path (full features):
APPLE → requests library → token rotation on 403/410
Platform Support
The native pipeline requires compiled libraries for each platform:
| Platform | Library | Status |
|---|---|---|
| macOS (ARM64) | libaopipeline.dylib |
✅ Included |
| macOS (x86_64) | libaopipeline.dylib |
Build from source |
| Linux (x64) | libaopipeline.so |
Build from source |
| Windows (x64) | aopipeline.dll |
Build from source |
If the native library is not available for your platform, AutoOrtho automatically falls back to the Python implementation.
Fallback Behavior
The native pipeline gracefully falls back to Python when: - Native library is not available or fails to load - Apple Maps source is used (token handling) - Transient HTTP errors need sophisticated retry logic - Chunk downloads fail and need server rotation
You'll see log messages indicating which path is used:
INFO: Using NativeChunkGetter (32 connections)
INFO: Native HTTP client available: 1.0.0
Or for fallback:
INFO: Using Python ChunkGetter (32 workers)
DEBUG: Native HTTP client library not available, using Python requests fallback
Troubleshooting
Long X-Plane Loading Times
If X-Plane takes significantly longer to load scenery with AutoOrtho enabled, the most common cause is the "Allow extra loading time during startup" setting (suspend_maxwait). This option extends timeout values by 10× during initial scenery loading, which can add substantial time to X-Plane's startup.
To reduce loading times:
- Go to Settings → Advanced Settings
- Set "Allow extra loading time during startup" to Off
- This will use normal time budgets during startup, resulting in faster loads
Note: Disabling this may result in some tiles loading at lower quality initially, but they will reload at full quality as you fly.
Other Common Issues
See the FAQ for common issues related to: - Missing color (green) tiles - Long loading times - In-flight stuttering