see also https://wiki.flightgear.org/Nasal_Optimisation#Emesary_real_time_executive
Using a scheduler to manage the invocation of Nasal modules provides a more predictable and efficient way to replace update loops and also optimises property tree access to one access per property per frame by using a hash that contains the property values.
There is a default global object created (emexec.ExecScheduler) that should be used in most circumstances.
Each Nasal object simply has to have an update(notification) method. This will be called on a schedule and the notification will contain any requested property values.
The exec will also adapt the rate to the frame rate; with a maximum of 50hz, but this will drop to as low as 4hz based on the frame rate to optimise workload.
The modules will be called in the order in which they were added; so it is possible to have modules in the right sequence (i.e. an earlier module calculates values that are used by a later module)
A simple example is below. The VSD_device has the update method
------
# list of prooperties to include in the notification hash
var properties_to_monitor = {
OrientationHeadingDeg : "orientation/heading-deg",
OrientationPitchDeg : "orientation/pitch-deg",
OrientationRollDeg : "orientation/roll-deg",
GroundspeedKts : "velocities/groundspeed-kt",
radar2_range : "instrumentation/radar/radar2-range",
target_display : "sim/model/f15/instrumentation/radar-awg-9/hud/target-display",
vc_kts : "instrumentation/airspeed-indicator/true-speed-kt",
};
# create Canvas based device (that has an update method)
VSD = VSD_Device.new(designation, textureImage, notification.Ident, root_node);
# register with the exec;
# - ident
# - proprties to include in notification hash
# - object (with an .update(notification) method
# - rate (4 = 1/4)
emexec.ExecModule.register("F15-VSD", properties_to_monitor, VSD, 4);
Objects like OSM buildings using the `model-combined` effect ignored
the Terrain quality. Rayleigh Fog is computed for the terrain only
at "Ultra" level, but was computed for models at all quality levels,
which led to a visual disparity. The shader now takes into account
the terrain quality before computing rayleigh fog for objects.
The `road` effect also had the same issue and is fixed now.
model-combined-transparent was replaced by calling model-transparent causing the ALS
externel canopy effects to get lost. Call model-combined instead which restores these
effects.
Previously the water shader was separate and executed on a
different mesh.
This adds the water shader as a separate fragment function
(ws30-water.frag) and uses a material parameter passed in
as a Uniform to use it in preference to the usual texel
lookup.
Performance testing found a slight performance improvement
from having a single mesh, but a slight performance impact
from the extra fragment shader complexity.
from Chris RINGEVAL
https://sourceforge.net/p/flightgear/fgdata/merge-requests/269/
Squashed commit of the following:
commit 23194c0fed49609999b4da67b2990af774f7df03
Author: Chris Ringeval <eatdirt@protonmail.com>
Date: Sun Jan 30 23:52:09 2022 +0100
Remove CC-BY-SA 3.0 texture provided by EAS and replace it with one made by myself
commit cb30c7972ba3db6b4cb4ad5f9dcd12d7e0ddbc1a
Author: Chris Ringeval <eatdirt@protonmail.com>
Date: Sun Dec 5 15:49:31 2021 +0100
Optimize shaders for vram usage and use new uniforms
commit 7541e49c6757a23b08684f1c4354e84b9af3bcc3
Author: Chris Ringeval <eatdirt@protonmail.com>
Date: Thu Dec 2 17:22:55 2021 +0100
Reduce the oversized galaxy texture to 400kB
commit 0e6591907a9978077dc6dff1b53dea7c439a6cc4
Author: Chris Ringeval <eatdirt@protonmail.com>
Date: Tue Nov 30 23:49:24 2021 +0100
Add Milky Way onto the night sky
Previously haze calculations were performed
in the main body of the ws30 shaders (inherited
from the ALS terrain shaders). This change creates
a common applyHaze function to consistently apply haze.
This is not ws30 specific, and could be used to replace the
haze calculations of all ALS shaders for improved consistency.