R3vo/Sandbox – User

From Bohemia Interactive Community
Jump to navigation Jump to search
m (merged pags)
 
(465 intermediate revisions by 4 users not shown)
Line 1: Line 1:
[[File:A3_KeyFrameAnimation_Overview.gif|right|800px]] __ToC__
{{TOC|side}}
== Overview ==
If you have ever wondered why you scenario is running so badly, performance profiling is the way to find it out. It allows you to find bottlenecks and slow code by capturing a "slow" frame.
It's all about '''Key Frame Animation''' with real time preview with '''3DEN''' integration.
The captured data can then be viewed and analysed.
A '''Key Frame''' is a location on a timeline which marks the beginning or end of a transition. It holds special information that defines where a transition should start or stop. The intermediate frames are interpolated over time between those definitions to create the illusion of motion. This interpolation is performed mathematically by the '''CPU'''.


'''Keyframing''' is the simplest form of animating an object (be it 2D or 3D). Based on the notion that an object has a beginning state or condition and will be changing over time, in position, form, color, luminosity, or any other property, to some different final form. '''Keyframing''' takes the stance that we only need to show the "key" frames, or conditions, that desribe the transformation of this object, and that all other intermediate positions can be figured out from these.
== Getting the correct Version ==
Profiling is enabled in the following {{arma3}} versions
* arma3profiling_x64.exe - '''Part of the Performance Profiling Build'''
* arma3diag_x64.exe - '''Part of the Development Build'''


Read [[Arma_3: Steam Branches]] for a guide on how to access these branches.


This system is all about interpolation and can be used for the following:
{{Feature|informative|It is recommended to use the '''Performance Profiling Build''' (arma3profiling_x64.exe) for performance profiling because:
* Has tools that might not make it into development build
* Has all the profiling related commands that ''arma3diag_x64.exe'' has
* Its performance is closer to the default ''arma3_x64.exe''}}


* '''Camera Scene / Cut-Scene''': Camera path and timing
== Frame Capturing ==
* '''2D animations''': Ability to animate UI controls on screen
There are several commands that allow you to capture a frame.
* '''3D animations''': Ability to animate objects in the 3D world
* [[diag_captureFrame]]
* '''Numeric animation''': Ability to animate any number transition
* [[diag_captureSlowFrame]]
* [[diag_logSlowFrame]] - not available in Arma 3 :(
* [[diag_captureFrameToFile]]
In most cases you do not want to capture any or all frames, you just want to capture "slow" frames. A slow frame is a frame that takes longer than the average frame and slows down the game.


''The low level system also includes a library of '''Non-Linear Interpolation''' methods that can be used independently from the rest.''
== How to Use ==
# Run a mission
# Execute a scripted command <sqf inline>diag_captureSlowFrame ["total", 0.3];</sqf> using any means ([[Arma 3: Debug Console|Debug Console]], mission radio trigger...)
# Once a slow frame is detected, a window will open
# In the window you will be able to browse a lot of performance-related data, which can be interesting
# To export the gathered information for sharing with others:
## Select Main Thread (if not selected yet)
## Press the Copy button
## Open an external text editor
## Paste the text into a new file
## Save the file


== Interpolation Algorithm ==  
== Capture Frame UI ==
[[File: arma3-capture frame ui overview.png]]


* '''Linear''' - Linear interpolation is a method of curve fitting using linear polynomials to construct new data points within the range of a discrete set of known data points
# {{Wiki|TODO}}
* '''Bezier Cubic''' - Non linear interpolation that uses 4 control points, Cubic Bezier interpolation
# {{Wiki|TODO}}
* '''Ease In''' - Non linear interpolation that starts slow and ends at desired speed
# {{Wiki|TODO}}
* '''Ease Out''' - Non linear interpolation that starts at desired speed and slows down the closer it is from the end
# {{Wiki|TODO}}
* '''Ease In Out''' - Non linear interpolation that starts slow and speeds up to desired speed reaching the half way through, slowing down the closer it is from the end
# {{Wiki|TODO}}
* '''Hermite''' - Non linear interpolation and only different a variation of Ease In Out
# {{Wiki|TODO}}
* '''Bounce In''' - Non linear interpolation that bounces at start
# {{Wiki|TODO}}
* '''Bounce Out''' - Non linear interpolation that bounces at the end
# {{Wiki|TODO}}
* '''Bounce In Out''' - Non linear interpolation that bounces at start and end
# {{Wiki|TODO}}
* '''Quintic In''' - Quintic version of ease in
* '''Quintic Out''' - Quintic version of ease out
* '''Quintic In Out''' - Quintic version of ease in out
* '''Berp''' - Boing interpolation that overshoots target and comes to a rest after
* '''Interpolate''' - Non linear interpolation from current value to target value based on speed, scaled by distance
* '''Interpolate Constant''' - Linear interpolation from current value to target value based on speed


''There's both Float and Vector versions for each of the above methods''
== External Viewer ==
* chrome://tracing
* https://ui.perfetto.dev/


== Math ==
[[File:Performance_Profiling_04.png|thumb|diag_captureFrame sample output with custom subtree]]
== Creating Your Own Subtree ==


* '''Bezier Length''' - Computes the length of a bezier spline
When Profiling Per-Frame Eventhandlers (PFH), [[diag_captureFrame]] only shows one blob called siFEH that contains all PFH's so you can't see what part of that is caused by your PFH.<br>
* '''Clamp''' - Clamps a float between min and max (inclusive)
You can create your own subtree inside siFEH by wrapping your function call inside a [[isNil]] CODE statement like this:<br>
* '''Clamp Vector''' - Clamps all axis of a vector between min and max (inclusive)
Turn your old call which may look like this:
* '''Delta Time''' - Helper function to get and manage DeltaTime
<sqf>
* '''Find Look At''' - Calculates Forward and Up vectors to orientate an objects looking at position from another position
addMissionEventHandler ["EachFrame", {
* '''Nearest Point''' - Computes the nearest point in a line
call myPFHFunction
* '''Pow''' - Helper function for Expoent Power
}];
* '''Pulsate''' - Pulsates a value between 0 and 1 with desired frequency and offsets
</sqf>
* '''Vector Divide''' - Divides a vector by a float


== [[Eden Editor]] Tutorial ==
Into something like this:
For the 3DEN Keyframe Animation tutorial we will animate a UAV on a spline.
<sqf>
addMissionEventHandler ["EachFrame", {
isNil { call myPFHFunction } // isNil creates the subtree
}];
</sqf>


===1. 3DEN Object Setup===
Now when you run [[diag_captureFrame]] inside of siPFH you will have a subtree called gsEva and behind that you can see the first line of code inside the isNil statement.<br>
It will only show a part of the first line of that code so you should put something descriptive into the [[isNil]] statement.<br>
You can use the same to create a subtree for any function you like. This will also work inside [[Scheduler#Scheduled_Environment|Scheduled]] ([[spawn]]ed) scripts. <br>
But using this method to "subtree" a function with return values requires a little bit of trickery to get the return value out.


* Open 3DEN and place a player unit
* On the asset list, select Modules (F5) and select category Modules
* Search for '''Keyframe Animation''' category, here you'll find all related modules used to make up animations in 3DEN


[[File:A3_KeyFrameAnimation_tutorial3den_setupObjects.jpg|240px]]
== Notes ==


===2. Placing the Timeline===
* 0.3 is a time in second used to determine what duration of a frame you consider abnormal, and first such frame will be captured.
* 0.3 is definitely something you should not see in a normal game.
* If you do not capture any frames with 0.3, try lowering it to 0.2 or 0.1.
* If it triggers too early, before the main slowdown happens, increase it to a higher value, e.g. 1.0.


* When in '''Modules > Keyframe Animation''' place a '''Timeline''' module
== Scopes ==
* Enable '''Play From Start''' - Will make the timeline start to be simulated when the scenario starts
{| class="wikitable sortable"
* Set the '''Length''' to 15 seconds - This is the length of the timeline
|-
* Enable '''Loop''' - Timeline will restart once it's simulation reaches the end
! Technical Name !! Descriptive Name !! Description
* In '''Event Looped''' put the following: <br/> <syntaxhighlight lang="cpp">hint "Timeline finished and is now looping";</syntaxhighlight>
|-
| Main
|
|
|-
| total
|
|
|-
| fsPHa
|
|
|-
| winMs
|
|
|-
| dlcSim
|
|
|-
| steamCbk
|
|
|-
| input
|
|
|-
| wSimu
|
|
|-
| docSim
|
|
|-
| wSimDisp
|
|
|-
| MFDManager
|
|
|-
| wDisp
|
|
|-
| EventPrcs
|
|
|-
| gsEva
|
|
|-
| gbFrm
|
|
|-
| memLo
|
|
|-
| siScr
|
|
|-
| scrVM
|
|
|-
| wsSet
|
|
|-
| sLand
|
|
|-
| simSW
|
|
|-
| cLWObj
|
|
|-
| oTemp
|
|
|-
| FPres
|
|
|-
| waitSnd
|
|
|-
| job
|
|
|-
| sound
|
|
|-
| ssAdv
|
|
|-
| snCmt
|
|
|-
| play
|
|
|-
| ARTCpl
|
|
|-
| rendr
|
|
|-
| drwVi
|
|
|-
| txHLi
|
|
|-
| txPMM
|
|
|-
| dsr2t
|
|
|-
| wPrep
|
|
|-
| dPr
|
|
|-
| fmiRun
|
|
|-
| fmiWait
|
|
|-
| fmiMDrw
|
|
|-
| fmiSIns
|
|
|-
| wPrepFtr
|
|
|-
| clPrp
|
|
|-
| oPrep
|
|
|-
| sceAC
|
|
|-
| oSplt
|
|
|-
| sceACTA
|
|
|-
| sceACPrx
|
|
|-
| lodUL
|
|
|-
| PrxObj
|
|
|-
| manAn
|
|
|-
| ppdOT
|
|
|-
| flProx
|
|
|-
| PrxObjTransport
|
|
|-
| oSoSL
|
|
|-
| oSoJE
|
|
|-
| oSoJE1
|
|
|-
| oSoJE2
|
|
|-
| oSo1OFOv
|
|
|-
| oSo1ON
|
|
|-
| sceCLsHSH
|
|
|-
| prpAMCt
|
|
|-
| oSoJEw
|
|
|-
| pDrwFNP
|
|
|-
| oSoSLu
|
|
|-
| lPGCl
|
|
|-
| pdDrw
|
|
|-
| lDGnd
|
|
|-
| lGSMM
|
|
|-
| recCB
|
|
|-
| mtPmj
|
|
|-
| cuDrw
|
|
|-
| prepT
|
|
|-
| drwCB
|
|
|-
| oPasD
|
|
|-
| o1Drw
|
|
|-
| lckDnBf
|
|
|-
| prpTx
|
|
|-
| inst
|
|
|-
| stpSctnTL
|
|
|-
| o1ShV
|
|
|-
| scSVI
|
|
|-
| oPas3
|
|
|-
| sssmC
|
|
|-
| sbDrw
|
|
|-
| aniMt
|
|
|-
| ppSSSM
|
|
|-
| drwROM
|
|
|-
| drwIn
|
|
|-
| wDraw
|
|
|-
| lDPGT
|
|
|-
| oSDrw
|
|
|-
| oPasO
|
|
|-
| lDSky
|
|
|-
| swRdr
|
|
|-
| ppSWDD
|
|
|-
| swRdGeom
|
|
|-
| swRdGeomVB
|
|
|-
| swFillV
|
|
|-
| oPasA
|
|
|-
| ppShrpn
|
|
|-
| lDWat
|
|
|-
| oPas2
|
|
|-
| o2Drw
|
|
|-
| oPas5
|
|
|-
| o5Drw
|
|
|-
| EDraw3D
|
|
|-
| MEventPrcs
|
|
|-
| cLGSY
|
|
|-
| stpAll
|
|
|-
| stpCB
|
|
|-
| stpTxtCS
|
|
|-
| stpUAVsCS
|
|
|-
| ppHDRCL
|
|
|-
| ppGSB
|
|
|-
| ppDOF
|
|
|-
| ppGlwNw
|
|
|-
| ppGLu
|
|
|-
| stpCBUpd
|
|
|-
| ppQWt
|
|
|-
| ppCMAA
|
|
|-
| hudDr
|
|
|-
| 3DEN_UI_OnDraw
|
|
|-
| 3DEN_PrepareDraw
|
|
|-
| clObL
|
|
|-
| 3DEN_Drawing
|
|
|-
| stpTxtGS
|
|
|-
| txt2D
|
|
|-
| mapDr
|
|
|-
| mapSeaAndNormal
|
|
|-
| mapPM
|
|
|-
| lndPM
|
|
|-
| MapObjectsPrepTask
|
|
|-
| mapSeaAndNormalDraw
|
|
|-
| mapCntDraw
|
|
|-
| mapObjectsDraw
|
|
|-
| mapForestShape
|
|
|-
| mapGrid
|
|
|-
| drwFn
|
|
|-
| dtTot
|
|
|-
| wFram
|
|
|-
| 3dSwp
|
|
|-
| preLd
|
|
|-
| preLV
|
|
|-
| actObjPrld
|
|
|-
| hashChk
|
|
|-
| sSim
|
|
|-
| enfWorkShort
|
|
|-
| updAttPos
|
|
|-
| oSo1AN
|
|
|-
| prpAMCf
|
|
|-
| prpAMCSlt
|
|
|-
| prpSDM
|
|
|-
| locL
|
|
|-
| mapSeaAndNormalWork
|
|
|-
| mapObjectsPrepWork
|
|
|-
| drwIdxPrm
|
|
|-
| oSo3
|
|
|-
| lsCVB
|
|
|-
| oSo5
|
|
|-
| oSo2CL
|
|
|-
| oSo1AF
|
|
|-
| Visualize
|
|
|-
| visul
|
|
|-
| txMLo
|
|
|-
| oSo2Srt
|
|
|-
| oSoSdw
|
|
|-
| prpAMCbsi
|
|
|-
| prpAMCp
|
|
|-
| Render
|
|
|-
| bgD3D
|
|
|-
| stpTxtVS
|
|
|-
| ppHBAOPlus
|
|
|}


[[File:A3_KeyFrameAnimation_tutorial3den_timeline1.jpg|240px]][[File:A3_KeyFrameAnimation_tutorial3den_timeline2.jpg|240px]]
<sqf>
private _ctrlTV = ctrlparent (_this select 0) displayCtrl 101;


===3. Placing the Curve===
private _export = "{| class=""wikitable sortable"""  + endl + "|-" + endl;
_export = _export + "! Technical Name !! Descriptive Name !! Description";


* Place a '''Rich Curve''' module
private _fnc_logChilden =
* Right click on the newly created '''Rich Curve''' and synchronize it with the '''Timeline'''
{
* Set the '''Orientation Mode''' to Animation - This will make the orientation of the animated objects orientation follow the animation
    params ["_path"];


[[File:A3_KeyFrameAnimation_tutorial3den_curveSync.jpg|240px]][[File:A3_KeyFrameAnimation_tutorial3den_curve1.jpg|240px]][[File:A3_KeyFrameAnimation_tutorial3den_curve2.jpg|240px]]
    for "_i" from 0 to ((_ctrlTV tvCount _path) - 1) do
    {
        private _text = _ctrlTV tvText (_path + [_i]);
        _text = _text splitString " " select 0;


===4. Placing the start and end keys===
        if !(_text in _export) then
        {
            _export = _export + endl + "|-" + endl + "| " + _text + endl + "| " + endl + "| ";
        };


* Place two '''Rich Curve Key'''s
        if (_ctrlTV tvCount (_path + [_i]) > 0 ) then
* Select and then right click on the newly created '''Rich Curve Key'''s and synchronize them with the '''Rich Curve'''
        {
[[File:A3_KeyFrameAnimation_tutorial3den_KeysSync.jpg|240px]]
            [_path + [_i]] call _fnc_logChilden;
        };
    };
};


===5. First Key Setup===
[[]] call _fnc_logChilden;


* Open the attributes of one of the placed keys, we will consider this one the first and so it is the start of our animation
copyToClipboard (_export + endl + "|}" + endl);
* You can leave all the settings as default for now
</sqf>


[[File:A3_KeyFrameAnimation_tutorial3den_FirstKey.jpg|240px]]
== See Also ==


===6. Last Key Setup===
* [[Code Optimisation]]
* [[Mission Optimisation]]


* Open the attributes of the other key, this will be the final point in our animation
* Set the '''Time''' property to '''10''', this means our animation will be in total 10 seconds long, since our first key starts at 0 and our last key is at 10


[[File:A3_KeyFrameAnimation_tutorial3den_LastKey.jpg|240px]]
[[Category:Arma Scripting Tutorials]]
 
===7. First Animation===
 
* Congratulations, while not much so far, you have now created your first Animation in 3DEN
* Move the '''Key''' objects around and notice how the path of the animation is being drawn in red and how you are affecting the animation in real-time
* The red line defines the animation path or spline
* The red dot's define the animation density
''Note: In order for things to be drawn at least one object part of the animation needs to be selected in 3DEN''
 
[[File:A3_KeyFrameAnimation_tutorial3den_anim1.gif]]
 
 
===8. Adding an Animated Object===
 
* The next step is to add our '''Animated Object''', basically, an object that will follow your animation with real-time 3DEN preview
* In the '''Asset Browser''' select ''Units (F1) > NATO > Drones > MQ-4A Greyhawk'' and place it into the level
* Right click on the newly created UAV and synchronize it with the '''Curve''' object
* If you select an object which is part of the animation, you should start seeing the UAV being animated along your first animation
* Feel free to move the keys around and get a sense of the real-time editing features
 
[[File:A3_KeyFrameAnimation_tutorial3den_anim2.gif]][[File:A3_KeyFrameAnimation_tutorial3den_anim3.gif]][[File:A3_KeyFrameAnimation_tutorial3den_anim4.gif]]
 
===9. Turning your animation into a spline (Bezier Cubic)===
 
* Select both keys in 3DEN and right click one of them, select '''Attributes'''
* Set the '''Interpolation Mode''' to ''Cubic''
* So now, your animation will have non linear (Bezier Cubic in this case) interpolation and we can now start adding control points to control the Bezier Cubic tangents
 
[[File:A3_KeyFrameAnimation_tutorial3den_anim5.gif]]
 
===10. Adding Control Points to manipulate Tangents===
 
* There are two kinds of Control Points, Arrive and Leave (see [[HelloWorld]] for more info)
* Go back to ''Modules > Keyframe Animation'' and place two '''Rich Curve Key Control Points''', these will be used to control the spline tangents
* One of the '''Control Points''' synchronize with the first '''Key''', open its '''Attributes''' and set the '''Tangent Type''' to '''Leave'''
* The other '''Control Point''' you synchronize with the second '''Key''', open its '''Attributes''' and set the '''Tangent Type''' to '''Arrive''' (which should be set by default)
* At this point you should notice your spline tangents being afected, try to move the control points around and modify the spline
 
[[File:A3_KeyFrameAnimation_tutorial3den_anim6.gif]][[File:A3_KeyFrameAnimation_tutorial3den_anim7.gif]][[File:A3_KeyFrameAnimation_tutorial3den_anim8.gif]]
 
===11. Understanding 3DEN controls===
 
When working on your Animation in 3DEN there are a few specific controls:
* '''LCtrl''' - Displays the index of all the keys of the highlighted animation starting at 0 for the first key, note that non selected keys (and it's control points) will be rendered in white while selected ones will render in green
* '''LShift''' - If the mouse position is near the animation spline, a line will be drawn between mouse and spline that defines a point where a new key can easily be placed if LShift + Space key combination is used
* '''LShift + Space''' - If the above is valid, a new Key will be created at the exact place where the mouse is pointing to, the key will be registered with the given curve, will have control points and be set as Cubic
 
''Note: For Keyframe Animation controls to work you must have one or more animation highlighted in 3DEN, you can do that by selecting an object part of the animation (Timeline, Curve, Key or Control Point)''
 
[[File:A3_KeyFrameAnimation_tutorial3den_anim9.gif]][[File:A3_KeyFrameAnimation_tutorial3den_anim10.gif]]
 
===12. Adding a Key onto the Animation===
 
'''Keys''' can be directly placed onto the animation by using the keyboard combination '''LShift (Highlight) + Space (Spawn Key)''', this is a fast and straight forward way to add keys to your animation, since even properties like '''Time''' will be computed automatically for you, same with the registration done with the '''Curve'''. The created '''Keys''' using this method are set to '''Cubic''' and '''Control Points''' are created with them and registered. In future this could be a 3DEN setting.
* ''Press and hold'' '''LShift''' and move your mouse pointer near the highlighted spline / curve
* Once there is a connection between mouse and your curve, while still holding '''LShift''' also press '''Space''' once, this will create the key
 
''Note: For Keyframe Animation controls to work you must have one or more animation highlighted in 3DEN, you can do that by selecting an object part of the animation (Timeline, Curve, Key or Control Point)''
 
[[File:A3_KeyFrameAnimation_tutorial3den_anim11.gif]]
 
===13. Lockable Control Points (Bezier Cubic)===
 
When control points are locked you are able to have matematically accurate and smooth transition between key frames. You can set the lock mode in each key.
 
* To set the '''Control Points Lock State''' just open your '''Key''' attributes (to which control points are synchronized) and toggle the option '''Lock Control Points'''
 
[[File:A3_KeyFrameAnimation_tutorial3den_anim12.gif]][[File:A3_KeyFrameAnimation_tutorial3den_anim13.gif]]
 
''Note: Always make sure your Control Points are configured correctly, a key can have one Arrive and one Leave control point''
 
===14. Play===
Now that everything is ready, you can preview the mission and observe the UAV moving.
 
 
[[Category:Arma 3: Editing]]
[[Category:Arma 3 Key Frame Animation|Tutorial 3den]]

Latest revision as of 18:23, 4 November 2024

If you have ever wondered why you scenario is running so badly, performance profiling is the way to find it out. It allows you to find bottlenecks and slow code by capturing a "slow" frame. The captured data can then be viewed and analysed.

Getting the correct Version

Profiling is enabled in the following Arma 3 versions

  • arma3profiling_x64.exe - Part of the Performance Profiling Build
  • arma3diag_x64.exe - Part of the Development Build

Read Arma_3: Steam Branches for a guide on how to access these branches.

It is recommended to use the Performance Profiling Build (arma3profiling_x64.exe) for performance profiling because:
  • Has tools that might not make it into development build
  • Has all the profiling related commands that arma3diag_x64.exe has
  • Its performance is closer to the default arma3_x64.exe

Frame Capturing

There are several commands that allow you to capture a frame.

In most cases you do not want to capture any or all frames, you just want to capture "slow" frames. A slow frame is a frame that takes longer than the average frame and slows down the game.

How to Use

  1. Run a mission
  2. Execute a scripted command diag_captureSlowFrame ["total", 0.3]; using any means (Debug Console, mission radio trigger...)
  3. Once a slow frame is detected, a window will open
  4. In the window you will be able to browse a lot of performance-related data, which can be interesting
  5. To export the gathered information for sharing with others:
    1. Select Main Thread (if not selected yet)
    2. Press the Copy button
    3. Open an external text editor
    4. Paste the text into a new file
    5. Save the file

Capture Frame UI

arma3-capture frame ui overview.png

  1. 🚧
    TODO: this must be updated.
  2. 🚧
    TODO: this must be updated.
  3. 🚧
    TODO: this must be updated.
  4. 🚧
    TODO: this must be updated.
  5. 🚧
    TODO: this must be updated.
  6. 🚧
    TODO: this must be updated.
  7. 🚧
    TODO: this must be updated.
  8. 🚧
    TODO: this must be updated.
  9. 🚧
    TODO: this must be updated.

External Viewer

diag_captureFrame sample output with custom subtree

Creating Your Own Subtree

When Profiling Per-Frame Eventhandlers (PFH), diag_captureFrame only shows one blob called siFEH that contains all PFH's so you can't see what part of that is caused by your PFH.
You can create your own subtree inside siFEH by wrapping your function call inside a isNil CODE statement like this:
Turn your old call which may look like this:

addMissionEventHandler ["EachFrame", { call myPFHFunction }];

Into something like this:

addMissionEventHandler ["EachFrame", { isNil { call myPFHFunction } // isNil creates the subtree }];

Now when you run diag_captureFrame inside of siPFH you will have a subtree called gsEva and behind that you can see the first line of code inside the isNil statement.
It will only show a part of the first line of that code so you should put something descriptive into the isNil statement.
You can use the same to create a subtree for any function you like. This will also work inside Scheduled (spawned) scripts.
But using this method to "subtree" a function with return values requires a little bit of trickery to get the return value out.


Notes

  • 0.3 is a time in second used to determine what duration of a frame you consider abnormal, and first such frame will be captured.
  • 0.3 is definitely something you should not see in a normal game.
  • If you do not capture any frames with 0.3, try lowering it to 0.2 or 0.1.
  • If it triggers too early, before the main slowdown happens, increase it to a higher value, e.g. 1.0.

Scopes

Technical Name Descriptive Name Description
Main
total
fsPHa
winMs
dlcSim
steamCbk
input
wSimu
docSim
wSimDisp
MFDManager
wDisp
EventPrcs
gsEva
gbFrm
memLo
siScr
scrVM
wsSet
sLand
simSW
cLWObj
oTemp
FPres
waitSnd
job
sound
ssAdv
snCmt
play
ARTCpl
rendr
drwVi
txHLi
txPMM
dsr2t
wPrep
dPr
fmiRun
fmiWait
fmiMDrw
fmiSIns
wPrepFtr
clPrp
oPrep
sceAC
oSplt
sceACTA
sceACPrx
lodUL
PrxObj
manAn
ppdOT
flProx
PrxObjTransport
oSoSL
oSoJE
oSoJE1
oSoJE2
oSo1OFOv
oSo1ON
sceCLsHSH
prpAMCt
oSoJEw
pDrwFNP
oSoSLu
lPGCl
pdDrw
lDGnd
lGSMM
recCB
mtPmj
cuDrw
prepT
drwCB
oPasD
o1Drw
lckDnBf
prpTx
inst
stpSctnTL
o1ShV
scSVI
oPas3
sssmC
sbDrw
aniMt
ppSSSM
drwROM
drwIn
wDraw
lDPGT
oSDrw
oPasO
lDSky
swRdr
ppSWDD
swRdGeom
swRdGeomVB
swFillV
oPasA
ppShrpn
lDWat
oPas2
o2Drw
oPas5
o5Drw
EDraw3D
MEventPrcs
cLGSY
stpAll
stpCB
stpTxtCS
stpUAVsCS
ppHDRCL
ppGSB
ppDOF
ppGlwNw
ppGLu
stpCBUpd
ppQWt
ppCMAA
hudDr
3DEN_UI_OnDraw
3DEN_PrepareDraw
clObL
3DEN_Drawing
stpTxtGS
txt2D
mapDr
mapSeaAndNormal
mapPM
lndPM
MapObjectsPrepTask
mapSeaAndNormalDraw
mapCntDraw
mapObjectsDraw
mapForestShape
mapGrid
drwFn
dtTot
wFram
3dSwp
preLd
preLV
actObjPrld
hashChk
sSim
enfWorkShort
updAttPos
oSo1AN
prpAMCf
prpAMCSlt
prpSDM
locL
mapSeaAndNormalWork
mapObjectsPrepWork
drwIdxPrm
oSo3
lsCVB
oSo5
oSo2CL
oSo1AF
Visualize
visul
txMLo
oSo2Srt
oSoSdw
prpAMCbsi
prpAMCp
Render
bgD3D
stpTxtVS
ppHBAOPlus

private _ctrlTV = ctrlparent (_this select 0) displayCtrl 101; private _export = "{| class=""wikitable sortable""" + endl + "|-" + endl; _export = _export + "! Technical Name !! Descriptive Name !! Description"; private _fnc_logChilden = { params ["_path"]; for "_i" from 0 to ((_ctrlTV tvCount _path) - 1) do { private _text = _ctrlTV tvText (_path + [_i]); _text = _text splitString " " select 0; if !(_text in _export) then { _export = _export + endl + "|-" + endl + "| " + _text + endl + "| " + endl + "| "; }; if (_ctrlTV tvCount (_path + [_i]) > 0 ) then { [_path + [_i]] call _fnc_logChilden; }; }; }; [[]] call _fnc_logChilden; copyToClipboard (_export + endl + "|}" + endl);

See Also