Browse Source

Improve efficiency of executing next command in a Sequence #76

Switched to use command indices instead of scanning the command list to
find the current command.
master
chrisgregan 10 years ago
parent
commit
4ecee9c332
  1. 3
      Assets/Fungus/FungusScript/Scripts/Command.cs
  2. 39
      Assets/Fungus/FungusScript/Scripts/Commands/If.cs
  3. 50
      Assets/Fungus/FungusScript/Scripts/Sequence.cs

3
Assets/Fungus/FungusScript/Scripts/Command.cs

@ -37,6 +37,9 @@ namespace Fungus
[HideInInspector]
public int indentLevel;
[NonSerialized]
public int commandIndex;
/**
* Reference to the Sequence object that this command belongs to.
* This reference is only set at runtime (null in editor).

39
Assets/Fungus/FungusScript/Scripts/Commands/If.cs

@ -152,27 +152,36 @@ namespace Fungus
else
{
// Find the next Else or EndIf command at the same indent level as this If command
bool foundThisCommand = false;
int indent = indentLevel;
foreach(Command command in parentSequence.commandList)
for (int i = commandIndex + 1; i < parentSequence.commandList.Count; ++i)
{
if (foundThisCommand &&
command.indentLevel == indent)
Command nextCommand = parentSequence.commandList[i];
// Find next command at same indent level as this If command
// Skip disabled commands & comments
if (!nextCommand.enabled ||
nextCommand.GetType() == typeof(Comment) ||
nextCommand.indentLevel != indentLevel)
{
continue;
}
System.Type type = nextCommand.GetType();
if (type == typeof(Else) ||
type == typeof(EndIf) || // Legacy support for old EndIf command
type == typeof(End))
{
System.Type type = command.GetType();
if (type == typeof(Else) ||
type == typeof(EndIf) || // Legacy support for old EndIf command
type == typeof(End))
if (i >= parentSequence.commandList.Count - 1)
{
// Execute command immediately after the Else or EndIf command
Continue(command);
// Last command in Sequence, so stop
Stop();
}
else
{
// Execute command immediately after the Else or End command
Continue(nextCommand);
return;
}
}
else if (command == this)
{
foundThisCommand = true;
}
}
// No matching End command found, so just stop the sequence

50
Assets/Fungus/FungusScript/Scripts/Sequence.cs

@ -37,12 +37,28 @@ namespace Fungus
protected virtual void Awake()
{
// Give each child command a reference back to its parent sequence
int index = 0;
foreach (Command command in commandList)
{
command.parentSequence = this;
command.commandIndex = index++;
}
}
#if UNITY_EDITOR
// The user can modify the command list order while playing in the editor,
// so we keep the command indices updated every frame. There's no need to
// do this in player builds so we compile this bit out for those builds.
void Update()
{
int index = 0;
foreach (Command command in commandList)
{
command.commandIndex = index++;
}
}
#endif
public virtual FungusScript GetFungusScript()
{
FungusScript fungusScript = GetComponent<FungusScript>();
@ -97,27 +113,27 @@ namespace Fungus
FungusScript fungusScript = GetFungusScript();
activeCommand = null;
Command nextCommand = null;
executingIconTimer = 0.5f;
int commandIndex = 0;
if (currentCommand != null)
{
commandIndex = currentCommand.commandIndex + 1;
}
bool executeNext = (currentCommand == null);
foreach (Command command in commandList)
while (commandIndex < commandList.Count &&
(!commandList[commandIndex].enabled || commandList[commandIndex].GetType() == typeof(Comment)))
{
if (command == currentCommand)
{
executeNext = true;
}
else if (executeNext)
{
if (command.enabled && command.GetType() != typeof(Comment))
{
nextCommand = command;
break;
}
}
commandIndex = commandList[commandIndex].commandIndex + 1;
}
Command nextCommand = null;
if (commandIndex < commandList.Count)
{
nextCommand = commandList[commandIndex];
}
activeCommand = null;
executingIconTimer = 0.5f;
if (nextCommand == null)
{
Stop();

Loading…
Cancel
Save