Feature Scaling - FlightGear
Menu Bar
Hiding the menu bar improves FPS too some degree. More so when FlightGear is running in a window. It can be toggled on/off with [Shift] + [F10] or the Auto Hide option can be used.
GPU Profile
See Graphics card profiles for the main article about this subject. |
The following GPU profile was provided by enrogue [1]
<?xml version="1.0"?>
<PropertyList>
<shaders>
<custom-settings type="bool">true</custom-settings>
<clouds type="double">0</clouds>
<generic type="double">1</generic>
<landmass type="double">3</landmass>
<model type="double">0</model>
<contrails type="double">1</contrails>
<crop type="double">0</crop>
<skydome type="bool">false</skydome>
<transition type="double">0</transition>
<urban type="double">0</urban>
<water type="double">3</water>
<wind-effects type="double">0</wind-effects>
<vegetation-effects type="double">0</vegetation-effects>
<forest type="double">0</forest>
<lights type="double">3</lights>
<quality-level-internal type="double">3</quality-level-internal>
<quality-level type="double">-1</quality-level>
</shaders>
<random-objects type="bool">true</random-objects>
<random-vegetation type="bool">true</random-vegetation>
<random-vegetation-shadows type="bool">false</random-vegetation-shadows>
<random-vegetation-normals type="bool">false</random-vegetation-normals>
<vegetation-density type="double">1</vegetation-density>
<random-buildings type="bool">false</random-buildings>
<building-density type="double">1</building-density>
<point-sprites type="bool">true</point-sprites>
<particles type="bool">true</particles>
<clouds3d-enable type="bool">true</clouds3d-enable>
<clouds3d-vis-range type="double">10000</clouds3d-vis-range>
<clouds3d-detail-range type="double">10000</clouds3d-detail-range>
<clouds3d-density type="double">0.25</clouds3d-density>
<shadows>
<enabled type="bool">true</enabled>
</shadows>
</PropertyList>
FG1000
See FG1000 for the main article about this subject. |
For the time being, the FG1000 must be considered hardly usable on the RPi, i.e. ~200ms/5fps. We're currently in the process of investigating what can be done to make it possible to use the device on the RPi, since that would seem like a perfect use-case.
One thing that's obvious is that initialization of the device takes unusually long. To see what's going on, we can wrap the initialization code inside $FG_ROOT/gui/menubar.xml in between profiling calls:
diff --git a/gui/menubar.xml b/gui/menubar.xml
index ff3faa1ac..6c94b2e76 100644
--- a/gui/menubar.xml
+++ b/gui/menubar.xml
@@ -834,6 +834,7 @@
<binding>
<command>nasal</command>
<script>
+ fgcommand("profiler-start");
var nasal_dir = getprop("/sim/fg-root") ~ "/Aircraft/Instruments-3d/FG1000/Nasal/";
if (! defined("fg1000")) {
io.load_nasal(nasal_dir ~ 'FG1000.nas', "fg1000");
@@ -846,6 +847,7 @@
var fg1000system = fg1000.FG1000.getOrCreateInstance();
var pfdindex = fg1000system.addPFD();
fg1000system.displayGUI(pfdindex);
+ fgcommand("profiler-stop");
</script>
</binding>
Another thing worth trying is running the built-on OSG optimizer on the root group, this requires patching SG/FG respectively:
diff --git a/simgear/canvas/elements/CanvasGroup.hxx b/simgear/canvas/elements/CanvasGroup.hxx
index 33687637..288da23d 100644
--- a/simgear/canvas/elements/CanvasGroup.hxx
+++ b/simgear/canvas/elements/CanvasGroup.hxx
@@ -20,6 +20,8 @@
#ifndef CANVAS_GROUP_HXX_
#define CANVAS_GROUP_HXX_
+#include <osgUtil/Optimizer>
+
#include "CanvasElement.hxx"
#include <list>
@@ -97,6 +99,11 @@ namespace canvas
osg::BoundingBox
getTransformedBounds(const osg::Matrix& m) const override;
+ void optimize () {
+ osgUtil::Optimizer opt;
+ opt.optimize(_scene_group.get() );
+ }
+
protected:
static ElementFactories _child_factories;
diff --git a/src/Scripting/NasalCanvas.cxx b/src/Scripting/NasalCanvas.cxx
index 602f06989..23aadfb36 100644
--- a/src/Scripting/NasalCanvas.cxx
+++ b/src/Scripting/NasalCanvas.cxx
@@ -521,7 +521,8 @@ naRef initNasalCanvas(naRef globals, naContext c)
.bases<NasalElement>()
.method("_createChild", &f_groupCreateChild)
.method( "_getChild", &f_groupGetChild)
- .method("_getElementById", &sc::Group::getElementById);
+ .method("_getElementById", &sc::Group::getElementById)
+ .method("optimize", &sc::Group::optimize);
NasalText::init("canvas.Text")
.bases<NasalElement>()
.method("heightForWidth", &sc::Text::heightForWidth)