R3vo/Sandbox – User

From Bohemia Interactive Community
Jump to navigation Jump to search
m (added spoiles)
 
(473 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{SideTOC}}
{{TOC|side}}
== Creating a Module ==
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.
Arma 3 introduces a [[Arma 3 Module Framework | module framework]], which lets designer to simplify the configuration and choose how the module function will be executed (e.g., globally and for every player who joins later). To create a new module in '''{{arma3}}''', follow the following steps.  
The captured data can then be viewed and analysed.


=== Create a Module Addon ===
== Getting the correct Version ==
* Make a folder named ''<span style="color:indigo">myTag</span>_addonName'' a create a ''config.cpp'' file in it.
Profiling is enabled in the following {{arma3}} versions
* Inside, declare a CfgPatches class with your addon and its modules (in the ''units'' array). Without this, the game wouldn't recognize the addon.
* arma3profiling_x64.exe - '''Part of the Performance Profiling Build'''
* Make sure the addon and all objects start with your tag, e.g. <span style="color:indigo">myTag</span>
* arma3diag_x64.exe - '''Part of the Development Build'''
class CfgPatches
{
class <span style="color:indigo">myTag</span>_addonName
{
units[] = {"<span style="color:indigo">myTag</span>_<span style="color:green">Module</span><span style="color:orangered;">Nuke</span>"};
requiredVersion = 1.0;
requiredAddons[] = {"A3_Modules_F"};
};
};


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


=== Module Category ===  
{{Feature|informative|It is recommended to use the '''Performance Profiling Build''' (arma3profiling_x64.exe) for performance profiling because:
* Modules are placed into basic categories which makes finding a desired module easier for an user. Use can use on of the existing categories:
* Has tools that might not make it into development build
{| class="mw-collapsible mw-collapsed wikitable"
* Has all the profiling related commands that ''arma3diag_x64.exe'' has
! class
* Its performance is closer to the default ''arma3_x64.exe''}}
! displayName
 
== Frame Capturing ==
There are several commands that allow you to capture a frame.
* [[diag_captureFrame]]
* [[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.
 
== 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
 
== Capture Frame UI ==
[[File: arma3-capture frame ui overview.png]]
 
# {{Wiki|TODO}}
# {{Wiki|TODO}}
# {{Wiki|TODO}}
# {{Wiki|TODO}}
# {{Wiki|TODO}}
# {{Wiki|TODO}}
# {{Wiki|TODO}}
# {{Wiki|TODO}}
# {{Wiki|TODO}}
 
== External Viewer ==
* chrome://tracing
* https://ui.perfetto.dev/
 
[[File:Performance_Profiling_04.png|thumb|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.<br>
You can create your own subtree inside siFEH by wrapping your function call inside a [[isNil]] CODE statement like this:<br>
Turn your old call which may look like this:
<sqf>
addMissionEventHandler ["EachFrame", {
call myPFHFunction
}];
</sqf>
 
Into something like this:
<sqf>
addMissionEventHandler ["EachFrame", {
isNil { call myPFHFunction } // isNil creates the subtree
}];
</sqf>
 
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.
 
 
== 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 ==
{| class="wikitable sortable"
|-
! 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
|
|
|-
|-
| ''Effects''
| play
| Effects
|
|  
|-
|-
| ''Events''
| ARTCpl
| Events
|
|  
|-
|-
| ''Modes''
| rendr
| Gameplay Modes
|
|  
|-
|-
| ''GroupModifiers''
| drwVi
| Group Modifiers
|
|  
|-
|-
| ''Intel''
| txHLi
| Intel
|
|  
|-
|-
| ''NO_CATEGORY''
| txPMM
| Misc
|
|  
|-
|-
| ''Multiplayer''
| dsr2t
| Multiplayer
|
|  
|-
|-
| ''ObjectModifiers''
| wPrep
| Object Modifiers
|
|  
|-
|-
| ''Sites''
| dPr
| Sites
|
|  
|-
|-
| ''StrategicMap''
| fmiRun
| Strategic
|
|  
|-
|-
| ''Supports''
| fmiWait
| Supports
|  
|}
|  
Alternatively, you can create your own one:
|-
class CfgFactionClasses
| fmiMDrw
{
|  
class NO_CATEGORY;
|  
class <span style="color:indigo">myTag</span>_<span style="color:teal">explosions</span>: NO_CATEGORY
|-
{
| fmiSIns
displayName = "Explosions";
|  
};
|  
};
|-
 
| wPrepFtr
 
|  
=== Creating the Module Config ===
|  
* All in-game objects (soldiers, vehicles, buildings, logics, modules, ...) are defined in ''CfgVehicles'' class.
|-
* '''All modules must inherit from Module_F''' parent class, either directly or through some additional sub-parent. While modules inheriting from some other class will be still displayed in the Modules menu (F7), they won't be using the module framework and all benefits tied to it.
| clPrp
* Modules functions are by default <u>not</u> executed when in [[Eden Editor]] workspace. It can be enabled using ''is3DEN'' property, but that will also change format of function params (see the section about writing a function below).
|  
 
|  
'''Example''':
|-
<spoiler> class CfgVehicles
| oPrep
{
|  
class Logic;
|  
class Module_F: Logic
|-
{
| sceAC
class AttributesBase
|  
{
|  
class Default;
|-
class Edit; {{codecomment|// Default edit box (i.e., text input field)}}
| oSplt
class Combo; {{codecomment|// Default combo box (i.e., drop-down menu)}}
|  
class Checkbox; {{codecomment|// Default checkbox (returned value is [[Bool]])}}
|  
class CheckboxNumber; {{codecomment|// Default checkbox (returned value is [[Number]])}}
|-
class ModuleDescription; {{codecomment|// Module description}}
| sceACTA
class Units; {{codecomment|// Selection of units on which the module is applied}}
|  
};
|  
{{codecomment|// Description base classes, for more information see below}}
|-
class ModuleDescription
| sceACPrx
{
|  
class AnyBrain;
|  
};
|-
};
| lodUL
class <span style="color:indigo">myTag</span>_<span style="color:green">Module</span><span style="color:orangered;">Nuke</span>: Module_F
|  
{
|  
{{codecomment|// Standard object definitions}}
|-
scope = 2; {{codecomment|// Editor visibility; 2 will show it in the menu, 1 will hide it.}}
| PrxObj
displayName = "Nuclear Explosion"; {{codecomment|// Name displayed in the menu}}
|  
icon = "\<span style="color:indigo">myTag</span>_addonName\data\icon<span style="color:orangered;">Nuke</span>_ca.paa"; {{codecomment|// Map icon. Delete this entry to use the default icon}}
|  
category = "<span style="color:teal">Effects</span>";
{{codecomment|// Name of function triggered once conditions are met}}
function = "<span style="color:indigo">myTag</span>_fnc_module<span style="color:orangered;">Nuke</span>";
{{codecomment|// Execution priority, modules with lower number are executed first. 0 is used when the attribute is undefined}}
functionPriority = 1;
{{codecomment|// 0 for server only execution, 1 for global execution, 2 for persistent global execution}}
isGlobal = 1;
{{codecomment|// 1 for module waiting until all synced triggers are activated}}
isTriggerActivated = 1;
{{codecomment|// 1 if modules is to be disabled once it's activated (i.e., repeated trigger activation won't work)}}
isDisposable = 1;
{{codecomment|// // 1 to run init function in [[Eden Editor]] as well}}
is3DEN = 1;
{{codecomment|// Menu displayed when the module is placed or double-clicked on by Zeus}}
curatorInfoType = "RscDisplayAttribute<span style="color:green">Module</span><span style="color:orangered;">Nuke</span>";
{{codecomment|// Module attributes, uses https://community.bistudio.com/wiki/Eden_Editor:_Configuring_Attributes#Entity_Specific}}
class Attributes: AttributesBase
{
{{codecomment|// Arguments shared by specific module type (have to be mentioned in order to be present)}}
class Units: Units
{
property = "<span style="color:indigo">myTag</span>_<span style="color:green">Module</span><span style="color:orangered;">Nuke</span>_Units";
};
{{codecomment|// Module specific arguments}}
class Yield: Combo
  {
{{codecomment|// Unique property, use "<moduleClass>_<attributeClass>" format to make sure the name is unique in the world}}
property = "<span style="color:indigo">myTag</span>_<span style="color:green">Module</span><span style="color:orangered;">Nuke</span>_Yield";
displayName = "Nuclear weapon yield"; {{codecomment|// Argument label}}
tooltip = "How strong will the explosion be"; {{codecomment|// Tooltip description}}
typeName = "NUMBER"; {{codecomment|// Value type, can be "NUMBER", "STRING" or "BOOL"}}
defaultValue = "50"; {{codecomment|// Default attribute value. WARNING: This is an expression, and its returned value will be used (50 in this case)}}
class Values
{
class 50Mt {name = "50 megatons"; value = 50;}; {{codecomment|// Listbox item}}
class 100Mt {name = "100 megatons"; value = 100;};
};
};
class Name: Edit
  {
displayName = "Name";
tooltip = "Name of the nuclear device";
{{codecomment|// Default text filled in the input box}}
{{codecomment|// Because it's an expression, to return a [[String]] one must have a string within a string}}
defaultValue = """Tsar Bomba""";
};
class ModuleDescription: ModuleDescription{}; {{codecomment|// Module description should be shown last}}
};
{{codecomment|// Module description. Must inherit from base class, otherwise pre-defined entities won't be available}}
class ModuleDescription: ModuleDescription
{
description = "Short module description"; {{codecomment|// Short description, will be formatted as structured text}}
sync[] = {"LocationArea_F"}; {{codecomment|// Array of synced entities (can contain base classes)}}
class LocationArea_F
{
description[] = { {{codecomment|// Multi-line descriptions are supported}}
"First line",
"Second line"
};
position = 1; {{codecomment|// Position is taken into effect}}
direction = 1; {{codecomment|// Direction is taken into effect}}
optional = 1; {{codecomment|// Synced entity is optional}}
duplicate = 1; {{codecomment|// Multiple entities of this type can be synced}}
synced[] = {"BLUFORunit","AnyBrain"}; {{codecomment|// Pre-define entities like "AnyBrain" can be used. See the list below}}
};
class BLUFORunit
{
description = "Short description";
displayName = "Any BLUFOR unit"; {{codecomment|// Custom name}}
icon = "iconMan"; {{codecomment|// Custom icon (can be file path or CfgVehicleIcons entry)}}
side = 1; {{codecomment|// Custom side (will determine icon color)}}
};
};
};
};</spoiler>
 
[[File:A3 modules info.jpg|300px|thumb|[[2D Editor]]: The description is available after clicking on "Show Info" button when editing the module]]
[[File:A3 3den ModuleDescription.jpg|thumb|300px|[[Eden Editor]]: The description is available after opening the modules' attributes window]]
 
* Pre-defined sync preview entities can be:
{| class="mw-collapsible mw-collapsed wikitable"
! class
! descripton
|-
|-
| ''Anything''
| manAn
| Any object - persons, vehicles, static objects, etc.
|
|  
|-
|-
| ''AnyPerson''
| ppdOT
| Any person. Not vehicles or static objects.
|
|  
|-
|-
| ''AnyVehicle''
| flProx
| Any vehicle. No persons or static objects.
|
|  
|-
|-
| ''GroupModifiers''
| PrxObjTransport
| Group Modifiers
|
|  
|-
|-
| ''AnyStaticObject''
| oSoSL
| Any static object. Not persons or vehicles.
|
|  
|-
|-
| ''AnyBrain''
| oSoJE
| Any AI or player. Not empty objects
|
|  
|-
|-
| ''AnyAI''
| oSoJE1
| Any AI unit. Not players or empty objects
|
|  
|-
|-
| ''AnyPlayer''
| oSoJE2
| Any player. Not AI units or empty objects
|
|  
|-
|-
| ''EmptyDetector''
| oSo1OFOv
| Any trigger
|  
|}
|  
 
=== Configuring the Module Function ===
* Place '' class CfgFunctions'' to ''config.cpp''. See [[Functions Library (Arma 3)]] for more info about functions configuration.
class CfgFunctions
{
class <span style="color:indigo">myTag</span>
{
class <span style="color:teal">Effects</span>
{
file = "\<span style="color:indigo">myTag</span>_addonName\functions";
class <span style="color:green">module</span><span style="color:orangered;">Nuke</span>{};
};
};
};
 
 
=== Writing the Module Function ===
* Create the ''functions'' folder within the addon folder and place *.sqf or *.fsm files there.
* Example: ''\<span style="color:indigo">myTag</span>_addonName\functions\fn_<span style="color:green">module</span><span style="color:orangered;">Nuke</span>.sqf''
* Input parameters differ based on value of ''is3DEN'' property.
 
 
'''Example''':
<spoiler>
'''Default'''
{{codecomment|// Argument 0 is module logic.}}
_logic = param [0,objNull,[objNull]];
{{codecomment|// Argument 1 is list of affected units (affected by value selected in the 'class Units' argument))}}
_units = param [1,[],<nowiki>[</nowiki>[]]];
{{codecomment|// True when the module was activated, false when it's deactivated (i.e., synced triggers are no longer active)}}
_activated = param [2,true,[true]];
{{codecomment|// Module specific behavior. Function can extract arguments from logic and use them.}}
if (_activated) then {
{{codecomment|// Attribute values are saved in module's object space under their class names}}
_bombYield = _logic [[getVariable]] ["Yield",-1]; {{codecomment|//(as per the previous example, but you can define your own.) }}
hint format ["Bomb yield is: %1", _bombYield ]; {{codecomment|// will display the bomb yield, once the game is started }}
};
{{codecomment|// Module function is executed by [[spawn]] command, so returned value is not necessary.}}
{{codecomment|// However, it's a good practice to include one.}}
true
 
'''Eden Editor Compatible'''
 
When '''is3DEN = 1''' is set in module config, different, more detailed params are passed to the function.
_mode = param [0,"",[""]];
_input = param [1,[],<nowiki>[</nowiki>[]]];
switch _mode do {
{{codecomment|// Default object init}}
case "init": {
_logic = _input param [0,objNull,[objNull]]; {{codecomment|// Module logic}}
_isActivated = _input param [1,true,[true]]; {{codecomment|// True when the module was activated, false when it's deactivated}}
_isCuratorPlaced = _input param [2,false,[true]]; {{codecomment|// True if the module was placed by Zeus}}
{{codecomment|// ... code here...}}
};
{{codecomment|// When some attributes were changed (including position and rotation)}}
case "attributesChanged3DEN": {
_logic = _input param [0,objNull,[objNull]]; {{codecomment|// Module logic}}
{{codecomment|// ... code here...}}
};
{{codecomment|// When added to the world (e.g., after undoing and redoing creation)}}
case "registeredToWorld3DEN": {
_logic = _input param [0,objNull,[objNull]]; {{codecomment|// Module logic}}
{{codecomment|// ... code here...}}
};
{{codecomment|// When removed from the world (i.e., by deletion or undoing creation)}}
case "unregisteredFromWorld3DEN": {
_logic = _input param [0,objNull,[objNull]]; {{codecomment|// Module logic}}
{{codecomment|// ... code here...}}
};
{{codecomment|// When connection to object changes (i.e., new one is added or existing one removed)}}
case "connectionChanged3DEN": {
_logic = _input param [0,objNull,[objNull]]; {{codecomment|// Module logic}}
{{codecomment|// ... code here...}}
};
{{codecomment|// When object is being dragged}}
case "dragged3DEN": {
_logic = _input param [0,objNull,[objNull]]; {{codecomment|// Module logic}}
{{codecomment|// ... code here...}}
};
};
true</spoiler>
 
== Placing Modules ==
{{Feature arma3|If you use the [[Eden Editor]] please visit [[Eden Editor: System]].}}
[[File:A3 modules info.jpg|200px|thumb]]
In editor:
# Activate modules mode by pressing F7 or clicking on following icon: [[File:icon editor module.png|32px]]
# Double-click on map to place a module.
# After selecting a desired module, click on ''SHOW INFO'' button to see detailed description.
#: ''Some more advanced modules may be described here on Community Wiki, see the bottom of this page.''
 
== Module Properties ==
{{Feature arma3|If you use the [[Eden Editor]] please visit [[Eden Editor: System]].}}
{| class="mw-collapsible mw-collapsed wikitable"
! Property Name
! Description
|-
|-
| ''Name''
| oSo1ON
| The name of a module can be used to refer to the object in script code. Like all variable names, the name must not contain any spaces or reserved characters. You should try to make it something meaningful and avoid conflicts. Note that if a variable exists with an identical name, no warning will be given and the name will refer to the variable first, rather than the named unit. If you copy and paste a named entity, the duplicate will be automatically have an underscore and number appended to it's name to avoid conflicts.
|
|  
|-
|-
| ''Initialization''
| sceCLsHSH
| Any [[Scripting|script]] code placed in this box will be executed as the mission begins. Script code is extremely powerful and useful - it allows you to create many effects and change aspects of the mission that would not be possible using only the graphical interface of the mission editor. For example, to make a soldier begin the mission unarmed, add "[[removeAllWeapons]] [[this]]" (without the quotation marks) to it's initialization string. Any [[Expression|expressions]] in the initialization field must return [[Nothing|nothing]], or an error message will prevent the unit dialogue from closing.
|  
|  
|-
|-
| ''Description''
| prpAMCt
| The description property is  not used by modules. However, it's used by some functions and it changes the tooltip in [[Eden Editor]] when hovering over the module icon.
|
|  
|-
|-
| ''Probability of Presence''
| oSoJEw
| Defines how likely it is that the entity will exist each time the mission is played. This can be used to add a bit of randomness to missions. Moving the slider all the way to the right means the object will always be there, all the way to the left means the unit will never appear. Note the ''Condition of Presence'' must also return true if the entity is to appear in the mission.
|  
 
|
|-
|-
| ''Condition of Presence''
| pDrwFNP
| This is a script code condition which must return true in order for the object to appear in the mission. By default this reads "true" which means the object will appear as defined by it's ''Probability of Presence''. For an example, if you wanted a unit to appear only if the mission is being played in Veteran mode, place "![[cadetMode]]" (without quotation marks) in it's Condition of Presence box. A unit with a Condition of Presence that returns false will not exist in the mission, irrespective of its ''Probability of Presence''.
|
|  
|-
|-
| ''Placement Radius''
| oSoSLu
| Changes the object's starting position to a random point within a circle of this radius, in metres. This can be used to add some randomness to your mission. For grouped units, the placement radius is only used by the group leader, and group members with a [[#Special|''Special'']] setting of ''None'' (or ''In Cargo'' for a group without suitable vehicle).
|  
|}
|  
 
== Arma 3 Modules (List) ==
{{GVI|arma3|1.82}}
{| class='mw-collapsible mw-collapsed wikitable'
!Module Name !!Category !!Addon !!Function !!Description
|-
|-
|Hide Terrain Objects
| lPGCl
||Environment
|  
||Arma 3
|  
||[[BIS_fnc_moduleHideTerrainObjects]]
||
|-
|-
|Edit Terrain Object
| pdDrw
||Environment
|  
||Arma 3
|  
||[[BIS_fnc_moduleEditTerrainObject]]
||
|-
|-
|Timeline
| lDGnd
||Keyframe Animation
|  
||Arma 3
|  
||
||
|-
|-
|Rich Curve
| lGSMM
||Keyframe Animation
|  
||Arma 3
|  
||
||
|-
|-
|Rich Curve Key
| recCB
||Keyframe Animation
|  
||Arma 3
|  
||
||
|-
|-
|Rich Curve Key Control Point
| mtPmj
||Keyframe Animation
|  
||Arma 3
|  
||
||
|-
|-
|Camera
| cuDrw
||Keyframe Animation
|  
||Arma 3
|  
||
||
|-
|-
|Smoke Grenade
| prepT
||Effects
|  
||Arma 3
|  
||[[BIS_fnc_moduleGrenade]]
||Create a smoke shell.
|-
|-
|Chem light
| drwCB
||Effects
|  
||Arma 3
|  
||[[BIS_fnc_moduleGrenade]]
||Create a chem light.
|-
|-
|Tracers
| oPasD
||Effects
|  
||Arma 3
|  
||[[BIS_fnc_moduleTracers]]
||Shoot tracers upwards to create an illusion of battle.
|-
|-
|Plankton
| o1Drw
||Effects
|  
||Arma 3
|  
||[[BIS_fnc_moduleEffectsEmitterCreator]]
||Plankton module creates an underwater plankton effect around player.
|-
|-
|Bubbles
| lckDnBf
||Effects
|  
||Arma 3
|  
||[[BIS_fnc_moduleEffectsEmitterCreator]]
||Creates underwater bubbles on position of the module. Unless you set the position of the module manually (via script commands), bubbles will be created at the bottom.
|-
|-
|Cartridges
| prpTx
||Effects
|  
||Arma 3
|  
||[[BIS_fnc_moduleEffectsEmitterCreator]]
||Creates empty cartridges on the position of the module.
|-
|-
|Smoke
| inst
||Effects
|  
||Arma 3
|  
||[[BIS_fnc_moduleEffectsEmitterCreator]]
||Creates smoke on a position of the module.
|-
|-
|Fire
| stpSctnTL
||Effects
|  
||Arma 3
|  
||[[BIS_fnc_moduleEffectsEmitterCreator]]
||Creates fire on a position of the module.
|-
|-
|Date
| o1ShV
||Events
|  
||Arma 3
|  
||[[BIS_fnc_moduleDate]]
||Set mission date.
|-
|-
|Weather
| scSVI
||Environment
|  
||Arma 3
|  
||[[BIS_fnc_moduleWeather]]
||Set mission weather. Certain changes can take some time to appear.
|-
|-
|Save Game
| oPas3
||Events
|  
||Arma 3
|  
||[[BIS_fnc_moduleSaveGame]]
||Set the mission progress. Will replace the previous automatic save. User save won't be affected.
|-
|-
|Radio Chat
| sssmC
||Events
|  
||Arma 3
|  
||[[BIS_fnc_moduleChat]]
||Show a chat message.
|-
|-
|Volume
| sbDrw
||Events
|  
||Arma 3
|  
||[[BIS_fnc_moduleVolume]]
||Set mission sound/music volume. Changes won't affect user options.
|-
|-
|Generic radio message
| aniMt
||Events
|  
||Arma 3
|  
||[[BIS_fnc_moduleGenericRadio]]
||Show a chat message.
|-
|-
|Set Callsign
| ppSSSM
||Group Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleGroupID]]
||Assign group callsign. Each group has to have a unique callsign - assigning an existing one will remove it from the group which used it previously.
|-
|-
|Combat Get In
| drwROM
||Group Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleCombatGetIn]]
||
|-
|-
|High Command - Commander
| drwIn
||Others
|  
||Arma 3
|  
||
||Set person as a high commander, giving him an ability to control whole groups.
|-
|-
|Skip time
| wDraw
||Environment
|  
||Arma 3
|  
||[[BIS_fnc_moduleSkiptime]]
||Skip mission time.
|-
|-
|Create Task
| lDPGT
||Intel
|  
||Arma 3
|  
||[[BIS_fnc_ModuleTaskCreate]]
||Add a task to synced objects or to larger pool of units.
|-
|-
|Set Task Description
| oSDrw
||Intel
|  
||Arma 3
|  
||[[BIS_fnc_ModuleTaskSetDescription]]
||Set task description.
|-
|-
|Set Task Destination
| oPasO
||Intel
|  
||Arma 3
|  
||[[BIS_fnc_ModuleTaskSetDestination]]
||Set task destination.
|-
|-
|Set Task State
| lDSky
||Intel
|  
||Arma 3
|  
||[[BIS_fnc_ModuleTaskSetState]]
||Set task state.
|-
|-
|Create Diary Record
| swRdr
||Intel
|  
||Arma 3
|  
||[[BIS_fnc_moduleCreateDiaryRecord]]
||Create a diary record for synced objects or for larger a pool of units.
|-
|-
|Headquarters Entity
| ppSWDD
||Intel
|  
||Arma 3
|  
||[[BIS_fnc_moduleHQ]]
||Virtual headquarters unit which can be used for playing radio messages.
|-
|-
|Military Symbols
| swRdGeom
||Others
|  
||Arma 3
|  
||
||
|-
|-
|Zone Restriction
| swRdGeomVB
||Others
|  
||Arma 3
|  
||[[BIS_fnc_moduleZoneRestriction]]
||Set punishment for leaving the Area of Operation.
|-
|-
|Trident
| swFillV
||Others
|  
||Arma 3
|  
||[[BIS_fnc_moduleTrident]]
||Set diplomacy options. When involved sides start killing each other, they won't be punished by a negative rating. Once too many kills are reached, the sides will turn hostile.
|-
|-
|Unlock Object
| oPasA
||Others
|  
||Arma 3
|  
||[[BIS_fnc_moduleUnlockObject]]
||Unlock addons of synced objects for the curator. E.g., when synced to a BLUFOR soldier, all BLUFOR soldiers will be unlocked, because they belong to the same addon.
|-
|-
|Unlock Area
| ppShrpn
||Others
|  
||Arma 3
|  
||[[BIS_fnc_moduleUnlockArea]]
||Unlock area for curator unit spawning.
|-
|-
|Friendly Fire
| lDWat
||Others
|  
||Arma 3
|  
||[[BIS_fnc_moduleFriendlyFire]]
||Set punishment for killing friendly units.
|-
|-
|Sector
| oPas2
||Multiplayer
|  
||Arma 3
|  
||[[BIS_fnc_moduleSector]]
||
|-
|-
|Respawn Position
| o2Drw
||Multiplayer
|  
||Arma 3
|  
||[[BIS_fnc_moduleRespawnPosition]]
||Add a respawn position.
|-
|-
|Vehicle Respawn
| oPas5
||Multiplayer
|  
||Arma 3
|  
||[[BIS_fnc_moduleRespawnVehicle]]
||Set vehicle respawn parameters.
|-
|-
|Show / Hide
| o5Drw
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleShowHide]]
||Show/hide synced objects. They will become invisible and their simulation will be disabled.
|-
|-
|Set Position / Rotation
| EDraw3D
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_modulePositioning]]
||Set position and rotation of synced objects.
|-
|-
|Set Skill
| MEventPrcs
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleSkill]]
||Set AI skill of synced objects. Has no effect on players.
|-
|-
|Set Character Damage
| cLGSY
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleHealth]]
||Set damage of synced persons.
|-
|-
|Set Vehicle Damage
| stpAll
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleDamage]]
||Set damage of synced vehicles.
|-
|-
|Set Vehicle Fuel
| stpCB
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleFuel]]
||Set fuel of synced vehicles.
|-
|-
|Set Ammo
| stpTxtCS
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleAmmo]]
||Set total ammo of synced objects. Affects only ammo of their weapons, not ammo carried in cargo space (e.g., ammo boxes).
|-
|-
|Set Mode
| stpUAVsCS
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleMode]]
||Set behavior pattern of synced objects.
|-
|-
|Set Rank
| ppHDRCL
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleRank]]
||Set military rank of synced objects.
|-
|-
|Set AI Mode
| ppGSB
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleAI]]
||Enable/disable AI modes.
|-
|-
|Add Rating / Score
| ppDOF
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleRating]]
||Add rating to synced objects. Rating is automatically awarded for killed enemies and players can see it in the debriefing screen. Shooting friendlies will lead to a negative rating and turning hostile to your own units.
|-
|-
|Open / Close Doors
| ppGlwNw
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleDoorOpen]]
||Open/close door of synced objects.
|-
|-
|Simulation Manager
| ppGLu
||Object Modifiers
|  
||Arma 3
|  
||[[BIS_fnc_moduleSimulationManager]]
||Keep all AI units disabled until someone from the player's group gets near.
|-
|-
|Open Strategic Map
| stpCBUpd
||Strategic
|  
||Arma 3
|  
||[[BIS_fnc_moduleStrategicMapOpen]]
||Open a strategic map.
|-
|-
|Support Requester
| ppQWt
||Supports
|  
||Arma 3
|  
||[[BIS_fnc_moduleSupportsInitRequester]]
||Supports framework. A support requester unit has to be synchronized with the Requester module. The Requester module has to be synchronized with Provider module(s). A Provider module has to be synchronized with a support provider unit(s), unless a Virtual Provider module is used.
|-
|-
|Posters
| ppCMAA
||Others
|  
||Arma 3
|  
||[[BIS_fnc_modulePoster]]
||Creates posters and leafets on walls of buildings. Those buildings are made indestructible.
|-
|-
|Animals
| hudDr
||Others
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleAnimals]]
||Creates a group of animals and handles their basic behavior. Deleting the module will delete the animals as well.
|-
|-
|Close Air Support (CAS)
| 3DEN_UI_OnDraw
||Effects
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCAS]]
||Send an air strike on the module position. It will take a few seconds before the plane arrives at the module’s position. Unless it's destroyed, it will be deleted after flying away.
|-
|-
|Game Master
| 3DEN_PrepareDraw
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCurator]]
||Zeus logic which provides access to the 3D real-time editor.
|-
|-
|Manage Addons
| clObL
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorAddAddons]]
||Manage addons (i.e. object packs) available to Zeus.
|-
|-
|Manage Resources
| 3DEN_Drawing
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorAddPoints]]
||Add or subtract resources available to Zeus. They are required for placing or editing objects.
|-
|-
|Add Editing Area
| stpTxtGS
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorAddEditingArea]]
||Add an area inside of which Zeus is allowed to place or edit objects.
|-
|-
|Restrict Editing Around Players
| txt2D
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorAddEditingAreaPlayers]]
||
|-
|-
|Set Editing Area Type
| mapDr
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorSetEditingAreaType]]
||Set whether editing in all editing areas is allowed or restricted.
|-
|-
|Add Camera Area
| mapSeaAndNormal
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorAddCameraArea]]
||Add an area inside of which Zeus can move with the camera.
|-
|-
|Set Camera Position
| mapPM
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorSetCamera]]
||Move the Zeus camera to the module position.
|-
|-
|Add Editable Objects
| lndPM
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorAddEditableObjects]]
||Add objects which Zeus can edit.
|-
|-
|Set Editing Costs
| MapObjectsPrepTask
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorSetCoefs]]
||Set coefficients for operations Zeus can perform. The object cost is multiplied by these. Use a large negative value (e.g. -1e10) to disable the operation.
|-
|-
|Set Costs (Default)
| mapSeaAndNormalDraw
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorSetCostsDefault]]
||
|-
|-
|Set Costs (Side)
| mapCntDraw
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorSetCostsSide]]
||Simplified definition of object costs. Can be combined with other "Set Costs" modules (e.g., cost of a BLUFOR soldier can be defined by "Set Costs - Sides" and "Set Costs - Soldiers & Vehicles" module. All matching values are multiplied together).
|-
|-
|Set Costs - Soldiers & Vehicles
| mapObjectsDraw
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorSetCostsVehicleClass]]
||Simplified definition of object costs. Can be combined with other "Set Costs" modules (e.g., cost of a BLUFOR soldier can be defined by "Set Costs - Sides" and "Set Costs - Soldiers & Vehicles" module. All matching values are multiplied together).
|-
|-
|Add Icon
| mapForestShape
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorAddIcon]]
||Show icon visible only to a specific Zeus.
|-
|-
|Set Attributes - Objects
| mapGrid
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCuratorSetAttributes]]
||Set which attributes are available for objects. The attribute window is accessed when Zeus double-clicks LMB on an object.
|-
|-
|Post-Process
| drwFn
||Environment
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_modulePostprocess]]
||Set a scene Post-Processing effect (e.g. color correction or film grain)
|-
|-
|IR Grenade
| dtTot
||Effects
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleGrenade]]
||
|-
|-
|Time Acceleration
| wFram
||Environment
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleTimeMultiplier]]
||
|-
|-
|Flare
| 3dSwp
||Effects
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleProjectile]]
||Creates a signal flare on the module position (visible only at night).
|-
|-
|End Scenario
| preLd
||Scenario Flow
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleEndMission]]
||End the scenario for all players.
|-
|-
|Scenario Name
| preLV
||Scenario Flow
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleMissionName]]
||Set the scenario name. It's shown to every player upon joining and after each respawn.
|-
|-
|Zeus Lightning Bolt
| actObjPrld
||Zeus
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleLightning]]
||Creates a lightning strike powerful enough to destroy an object where it impacts.
|-
|-
|Cover Map
| hashChk
||Others
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCoverMap]]
||Highlight an Area of Operations in the map by enclosing it and covering the unused part.
|-
|-
|Create Radio Channel
| sSim
||Others
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleRadioChannelCreate]]
||Creates a custom radio channel for the given sides / Zeus players.
|-
|-
|Zone Protection
| enfWorkShort
||Scenario Flow
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleZoneProtection]]
||Prevents players from entering the given area.
|-
|-
|Countdown
| updAttPos
||Scenario Flow
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleCountdown]]
||
|-
|-
|Respawn Tickets
| oSo1AN
||Scenario Flow
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleRespawnTickets]]
||Set the number of respawn tickets available to each side.
|-
|-
|Bleed Tickets
| prpAMCf
||Scenario Flow
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleBleedTickets]]
||Allow ticket bleeding when one side is holding the majority of sectors.
|-
|-
|Ordnance
| prpAMCSlt
||Effects
|  
||Arma 3 Zeus
|  
||[[BIS_fnc_moduleProjectile]]
||Create an artillery shell on the module position. It will take a few seconds until it hits the ground.
|-
|-
|Spawn AI
| prpSDM
||Others
|  
||Arma 3 Helicopters
|  
||[[BIS_fnc_moduleSpawnAI]]
||
|-
|-
|Spawn AI: Spawnpoint
| locL
||Others
|  
||Arma 3 Helicopters
|  
||[[BIS_fnc_moduleSpawnAIPoint]]
||
|-
|-
|Spawn AI: Sector Tactic
| mapSeaAndNormalWork
||Others
|  
||Arma 3 Helicopters
|  
||[[BIS_fnc_moduleSpawnAISectorTactic]]
||
|-
|-
|Spawn AI: Options
| mapObjectsPrepWork
||Others
|  
||Arma 3 Helicopters
|  
||[[BIS_fnc_moduleSpawnAIOptions]]
||
|-
|-
|Sling Load
| drwIdxPrm
||Others
|  
||Arma 3 Helicopters
|  
||[[BIS_fnc_moduleSlingload]]
||
|-
|-
|EndGame Objectives Instance
| oSo3
||Objectives
|  
||Arma 3 Marksmen
|  
||[[BIS_fnc_moduleHvtObjectives]]
||
|-
|-
|End Game Simple Objective
| lsCVB
||Objectives
|  
||Arma 3 Marksmen
|  
||[[BIS_fnc_moduleHvtObjectives]]
||
|-
|-
|End Game Start Game Objective
| oSo5
||Objectives
|  
||Arma 3 Marksmen
|  
||[[BIS_fnc_moduleHvtObjectives]]
||
|-
|-
|End Game - End Game Objective
| oSo2CL
||Objectives
|  
||Arma 3 Marksmen
|  
||[[BIS_fnc_moduleHvtObjectives]]
||
|-
|-
|Combat Patrol Init
| oSo1AF
||Combat Patrol
|  
||Arma 3 Malden
|  
||[[BIS_fnc_CPInit]]
||Initializes the Combat Patrol mode upon scenario start.
|-
|-
|Combat Patrol Location Add
| Visualize
||Combat Patrol
|  
||Arma 3 Malden
|  
||
||Adds a new selectable location to the map.
|-
|-
|Combat Patrol Location Remove
| visul
||Combat Patrol
|  
||Arma 3 Malden
|  
||
||Removes the nearest location in a 1000m radius from the map selection.
|-
|-
|Combat Patrol Location Reposition
| txMLo
||Combat Patrol
|  
||Arma 3 Malden
|  
||
||Moves the nearest location in a 1000m radius to this module's position.
|-
|-
|Combat Patrol Azimuth Blacklist
| oSo2Srt
||Combat Patrol
|  
||Arma 3 Malden
|  
||
||Blacklists the nearest location's in a 1000m radius azimuth range so it can't be used for the starting / ending position or reinforcements spawning point.
|-
|-
|Civilian Presence
| oSoSdw
||Ambient
|  
||Arma 3 Tac-Ops
|  
||[[BIS_fnc_moduleCivilianPresence]]
||
|-
|-
|Civilian Presence Spawnpoint
| prpAMCbsi
||Ambient
|  
||Arma 3 Tac-Ops
|  
||[[BIS_fnc_moduleCivilianPresenceUnit]]
||
|-
|-
|Civilian Presence Position
| prpAMCp
||Ambient
|  
||Arma 3 Tac-Ops
|  
||[[BIS_fnc_moduleCivilianPresenceSafeSpot]]
||
|-
|-
|Vanguard: Starting Area
| Render
||Gameplay Modes
|  
||Arma 3 Tanks
|  
||[[BIS_fnc_moduleVanguardFob]]
||
|-
|-
|Vanguard: Score Persistence
| bgD3D
||Gameplay Modes
|  
||Arma 3 Tanks
|  
||[[BIS_fnc_moduleVanguardScorePersistence]]
||
|-
|-
|Vanguard: Objective Area
| stpTxtVS
||Gameplay Modes
|  
||Arma 3 Tanks
|  
||[[BIS_fnc_moduleVanguardObjective]]
||
|-
|-
| ppHBAOPlus
|
|
|}
|}


'''Export Function'''
<sqf>
<spoiler>
private _ctrlTV = ctrlparent (_this select 0) displayCtrl 101;
<syntaxhighlight lang="cpp">private _modules = "(configName inheritsFrom _x) == 'Module_F'" configClasses (configFile >> "CfgVehicles");
private _version = format ["{{GVI|arma3|%1}}",productVersion # 2 / 100];


private _export = _version + endl + "{| class='mw-collapsible mw-collapsed wikitable'
private _export = "{| class=""wikitable sortable"""  + endl + "|-" + endl;
!Module Name !!Category !!Addon !!Function !!Description
_export = _export + "! Technical Name !! Descriptive Name !! Description";
|-" + endl;


private _fnc_logChilden =
{
{
if ((getNumber (_x >> "scope") > 1)) then
    params ["_path"];
{
private _name = getText (_x >> "displayName");
private _cat = getText (_x >> "category");
private _mod = configSourceMod _x;
private _fnc = getText (_x >> "function");
if !(_fnc isEqualTo "") then
{
_fnc = _fnc select [7];
_fnc = "[[BIS_fnc" + _fnc + "]]";
};
private _desc = getText (_x >> "ModuleDescription" >> "Description");
if (_desc isEqualTo "") then {_desc = ""};
if (_mod == "") then {_mod = "A3"};
private _modName = modParams [_mod,["name"]];
_modName = _modName select 0;
_cat = getText (configFile >> "CfgFactionClasses" >> _cat >> "displayName");
if (_cat isEqualto "") then {_cat = "Others"};
 
_export = _export + "|" + _name + endl + "||" + _cat + endl + "||" + _modName + endl + "||" + _fnc + endl + "||" + _desc + endl + "|-" + endl;
};


} forEach _modules;
    for "_i" from 0 to ((_ctrlTV tvCount _path) - 1) do
    {
        private _text = _ctrlTV tvText (_path + [_i]);
        _text = _text splitString " " select 0;


_export = _export + "|}";
        if !(_text in _export) then
        {
            _export = _export + endl + "|-" + endl + "| " + _text + endl + "| " + endl + "| ";
        };


copyToClipboard _export;</syntaxhighlight></spoiler>
        if (_ctrlTV tvCount (_path + [_i]) > 0 ) then
        {
            [_path + [_i]] call _fnc_logChilden;
        };
    };
};


== Module Documentation ==
[[]] call _fnc_logChilden;
Here you'll find link to modules which have been documented on this wiki.


=== Arma 2 ===
copyToClipboard (_export + endl + "|}" + endl);
*[[Simple Support Module]]
</sqf>
*[[Ambient Animals]]
*[[Environment - Colors]]
*[[:Category:ArmA 2: Editor Modules|Complete List]]


=== Arma 3 ===
== See Also ==
*[[Arma 3 Module: Sector]]
*[[Arma 3 Module: Animals]]
*[[Arma 3 Module: Combat Get In]]
*[[Arma 3 Module: Cover Map]]
*[[Arma 3 Module: Game Master]]


==See Also==
* [[Code Optimisation]]
*[[Eden Editor: System]]
* [[Mission Optimisation]]




[[Category:Arma 3: Editing]]
[[Category:Arma Scripting Tutorials]]
[[Category:Arma 3: Editing|Editor Modules]]
[[Category:Arma_3:_Editing|Module Framework]]

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