Files
gtav-src/script/dev_ng/singleplayer/include/debug/profiler.sch
T
2025-09-29 00:52:08 +02:00

1291 lines
43 KiB
Scheme
Executable File

/*
Add commands in this order:
//Create your widgets
CREATE_SCRIPT_PROFILER_WIDGET() // ***** ESSENTIAL COMMAND ****** in order to active the display screen
//At the start of the main loop
WHILE (TRUE)
WAIT(0)
SCRIPT_PROFILER_START_OF_FRAME() // ***** ESSENTIAL COMMAND ****** place it just after your wait(0)
ADD_SCRIPT_PROFILE_MARKER("marker 1") //Add this where you want to add a profile point
ADD_SCRIPT_PROFILE_MARKER("marker 2") //Add this where you want to add a profile point
// ****************************************************
// LOOP PROFILING
// You may wish to profile functions within
// a loop.
// ****************************************************
//Use this for any repeats
ADD_SCRIPT_PROFILE_PRE_LOOP_MARKER("Loop profile") // to profile a loop, place this just before the loop starts
REPEAT LOOP_SIZE i
ADD_SCRIPT_PROFILE_MARKER("loop marker 1") //Add this where you want to add a profile point
ADD_SCRIPT_PROFILE_MARKER("loop marker 2") //Add this where you want to add a profile point
ENDREPEAT
ADD_SCRIPT_PROFILE_POST_LOOP_MARKER() // when profiling a loop remember to call this just after the loop
// ****************************************************
// NESTING MARKERS
// You can nest markers inside other markers
// and expand and colapse them on the display
// screen
// Note: the top level of the nest will be
// the FOLLOWING marker, see below:
// ****************************************************
OPEN_SCRIPT_PROFILE_MARKER_GROUP("marker 3")
ADD_SCRIPT_PROFILE_MARKER("marker 3.1")
ADD_SCRIPT_PROFILE_MARKER("marker 3.2")
OPEN_SCRIPT_PROFILE_MARKER_GROUP(TRUE)
ADD_SCRIPT_PROFILE_MARKER("marker 3.3.1")
ADD_SCRIPT_PROFILE_MARKER("marker 3.3.2")
CLOSE_SCRIPT_PROFILE_MARKER_GROUP()
ADD_SCRIPT_PROFILE_MARKER("marker 3.3")
CLOSE_SCRIPT_PROFILE_MARKER_GROUP()
//Add this to the end of the main loop
SCRIPT_PROFILER_END_OF_FRAME() // ***** ESSENTIAL COMMAND ****** place just before your wait(0)
END WHILE
*/
USING "rage_builtins.sch"
USING "globals.sch"
USING "profiler_globals.sch"
USING "commands_misc.sch"
USING "commands_debug.sch"
USING "script_network.sch"
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
STRUCT SCRIPT_PROFILER_DATA
BOOL bSPWidgetCreated
BOOL bIsActive = FALSE
BOOL bRenderSP //= TRUE
BOOL bOutputToFile
BOOL bClearData
ENDSTRUCT
SCRIPT_PROFILER_DATA SPData
TWEAK_FLOAT fSPTextX 0.022
TWEAK_FLOAT fSPStartX 0.355
TWEAK_FLOAT fSPNumbersX 0.730
TWEAK_FLOAT fSPNumbersX2 0.845
TWEAK_FLOAT fSPStartY 0.037
TWEAK_FLOAT fSPHeight 0.007
TWEAK_FLOAT fSPWidthPerMS 0.140
TWEAK_FLOAT fSPWidthPer1000Commands 0.026
TWEAK_FLOAT fProfTextScale 0.242
TWEAK_FLOAT fYSpacer 0.022
TWEAK_FLOAT fTextAdjustmentY -0.008
TWEAK_FLOAT fSPScrollValue 0.004
TWEAK_FLOAT fRowWidth 0.975
TWEAK_INT PROFILER_INTERNAL_COST 13
TWEAK_INT PROFILER_LOOP_INTERNAL_COST 21
TWEAK_INT PROFILER_INTERNAL_TIME_COST 6
STRING sp_PATHNAME = "X:/gta5/titleupdate/dev_ng/"
STRING sp_FILENAME = "SPLog.txt"
PROC CREATE_SCRIPT_PROFILER_WIDGET()
INT i
TEXT_LABEL_63 strLabel
IF NOT (SPData.bSPWidgetCreated)
strLabel = "Script Profiler - "
strLabel += GET_THIS_SCRIPT_NAME()
START_WIDGET_GROUP(strLabel)
ADD_WIDGET_BOOL("Is Active", SPData.bIsActive)
ADD_WIDGET_BOOL("Render Bars", SPData.bRenderSP)
ADD_WIDGET_BOOL("Output to File", SPData.bOutputToFile)
ADD_WIDGET_BOOL("Clear Data", SPData.bClearData)
START_WIDGET_GROUP("debug")
START_WIDGET_GROUP("rendering")
ADD_WIDGET_FLOAT_SLIDER("fSPTextX", fSPTextX, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fSPStartX", fSPStartX, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fSPNumbersX", fSPNumbersX, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fSPNumbersX2", fSPNumbersX2, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fSPStartY", fSPStartY, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fSPHeight", fSPHeight, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fSPWidthPerMS", fSPWidthPerMS, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fProfTextScale", fProfTextScale, 0.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fYSpacer", fYSpacer, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fSPWidthPer1000Commands", fSPWidthPer1000Commands, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fTextAdjustmentY", fTextAdjustmentY, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fSPScrollValue", fSPScrollValue, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fRowWidth", fRowWidth, -1.0, 1.0, 0.001)
STOP_WIDGET_GROUP()
ADD_WIDGET_INT_SLIDER("iActiveThread", GlobalScriptProfileData.iActiveThread, -1, 999, 1)
ADD_WIDGET_INT_SLIDER("iMarkerCount", GlobalScriptProfileData.iMarkerCount, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iFailedMarkerCount", GlobalScriptProfileData.iFailedMarkerCount, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iStartRowToRender", GlobalScriptProfileData.iStartRowToRender, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iNumberOfRowsToRender", GlobalScriptProfileData.iNumberOfRowsToRender, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iRowToRender", GlobalScriptProfileData.iRowToRender, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iTotalRowsRendered", GlobalScriptProfileData.iTotalRowsRendered, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iRowToHighlight", GlobalScriptProfileData.iRowToHighlight, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iHighlightedMarkerID", GlobalScriptProfileData.iHighlightedMarkerID, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iOpenNestGroups", GlobalScriptProfileData.iOpenNestGroups, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("PROFILER_INTERNAL_COST", PROFILER_INTERNAL_COST, -999, 999, 1)
ADD_WIDGET_INT_SLIDER("PROFILER_LOOP_INTERNAL_COST", PROFILER_LOOP_INTERNAL_COST, -999, 999, 1)
ADD_WIDGET_INT_SLIDER("PROFILER_INTERNAL_TIME_COST", PROFILER_INTERNAL_TIME_COST, -100, 100, 1)
ADD_WIDGET_INT_SLIDER("iLastMarkerTime", GlobalScriptProfileData.iLastMarkerTime, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iLastMarkerIns", GlobalScriptProfileData.iLastMarkerIns, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iSuspendTime", GlobalScriptProfileData.iSuspendTime, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iSuspendIns", GlobalScriptProfileData.iSuspendIns, -1, HIGHEST_INT, 1)
START_WIDGET_GROUP("Markers")
REPEAT MAX_SCRIPT_PROFILE_MARKERS i
strLabel = "MarkerData["
strLabel += i
strLabel += "]"
START_WIDGET_GROUP(strLabel)
ADD_WIDGET_INT_SLIDER("iIndex", GlobalScriptProfileData.MarkerData[i].iIndex, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iParentID", GlobalScriptProfileData.MarkerData[i].iParentID, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iHash", GlobalScriptProfileData.MarkerData[i].iHash, LOWEST_INT, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iTime", GlobalScriptProfileData.MarkerData[i].iTime, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iIns", GlobalScriptProfileData.MarkerData[i].iIns, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iPeakTime", GlobalScriptProfileData.MarkerData[i].iPeakTime, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iPeakIns", GlobalScriptProfileData.MarkerData[i].iPeakIns, -1, HIGHEST_INT, 1)
ADD_WIDGET_BOOL("bCalledThisFrame", GlobalScriptProfileData.MarkerData[i].bCalledThisFrame)
ADD_WIDGET_STRING(GlobalScriptProfileData.MarkerData[i].strName)
ADD_WIDGET_BOOL("bIsLoopParent", GlobalScriptProfileData.MarkerData[i].bIsLoopParent)
ADD_WIDGET_BOOL("bIsLoopChild", GlobalScriptProfileData.MarkerData[i].bIsLoopChild)
ADD_WIDGET_BOOL("bShowChildren", GlobalScriptProfileData.MarkerData[i].bShowChildren)
ADD_WIDGET_BOOL("bHasChildren", GlobalScriptProfileData.MarkerData[i].bHasChildren)
ADD_WIDGET_BOOL("bIsRendering", GlobalScriptProfileData.MarkerData[i].bIsRendering)
ADD_WIDGET_INT_SLIDER("iTimeTotal", GlobalScriptProfileData.MarkerData[i].iTimeTotal, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iInsTotal", GlobalScriptProfileData.MarkerData[i].iInsTotal, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iTimeAvg", GlobalScriptProfileData.MarkerData[i].iTimeAvg, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iInsAvg", GlobalScriptProfileData.MarkerData[i].iInsAvg, -1, HIGHEST_INT, 1)
ADD_WIDGET_INT_SLIDER("iCalls", GlobalScriptProfileData.MarkerData[i].iCalls, -1, HIGHEST_INT, 1)
STOP_WIDGET_GROUP()
ENDREPEAT
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
SPData.bSPWidgetCreated = TRUE
ENDIF
ENDPROC
PROC ClearPeaks()
INT i
REPEAT MAX_SCRIPT_PROFILE_MARKERS i
GlobalScriptProfileData.MarkerData[i].iPeakTime = 0
GlobalScriptProfileData.MarkerData[i].iPeakIns = 0
GlobalScriptProfileData.MarkerData[i].iCalls = 0
GlobalScriptProfileData.MarkerData[i].iTimeTotal = 0
GlobalScriptProfileData.MarkerData[i].iInsTotal = 0
GlobalScriptProfileData.MarkerData[i].iTimeAvg = 0
GlobalScriptProfileData.MarkerData[i].iInsAvg = 0
ENDREPEAT
ENDPROC
PROC ClearProfilerData()
SCRIPT_PROFILE_MARKER_DATA EmptyMarker
INT iMarker
REPEAT MAX_SCRIPT_PROFILE_MARKERS iMarker
GlobalScriptProfileData.iMarkerIDs[iMarker] = 0
GlobalScriptProfileData.MarkerData[iMarker] = EmptyMarker
ENDREPEAT
GlobalScriptProfileData.iStartRowToRender = 0
GlobalScriptProfileData.iNumberOfRowsToRender = NUMBER_OF_ROWS_TO_RENDER
GlobalScriptProfileData.iRowToHighlight = 0
GlobalScriptProfileData.iMarkerCount = 0
GlobalScriptProfileData.iLastMarkerTime = 0
GlobalScriptProfileData.iLastMarkerIns = 0
INT i
REPEAT MAX_NUMBER_OF_SCRIPT_PROFILER_NESTS i
GlobalScriptProfileData.iPreviousParentID[i] = -1
ENDREPEAT
GlobalScriptProfileData.iCurrentParentID = -1
GlobalScriptProfileData.iLastMarkerID = -1
GlobalScriptProfileData.iSuspendTime = 0
GlobalScriptProfileData.iSuspendIns = 0
GlobalScriptProfileData.bCountingSuspended = FALSE
GlobalScriptProfileData.iRowToRender = 0
GlobalScriptProfileData.iTotalRowsRendered = 0
GlobalScriptProfileData.iHighlightedMarkerID = 0
GlobalScriptProfileData.iStartOfFrameCommands = 0
GlobalScriptProfileData.iCommandsSinceStartOfFrame = 0
GlobalScriptProfileData.iCommandsSinceStartOfFramePeak = 0
GlobalScriptProfileData.bStartOfFrameCalled = FALSE
GlobalScriptProfileData.bLoopProfilerStarted = FALSE
GlobalScriptProfileData.iMarkerCount = 0
GlobalScriptProfileData.iFailedMarkerCount = 0
GlobalScriptProfileData.bGoodToOutput = FALSE
GlobalScriptProfileData.iLastBackground = 0
GlobalScriptProfileData.iActiveThread = -1
GlobalScriptProfileData.iTotalAccumulatedTime = 0
GlobalScriptProfileData.iTotalAccumulatedCommands = 0
GlobalScriptProfileData.iTotalAccumulatedTimePeak = 0
GlobalScriptProfileData.iOpenNestGroups = 0
ENDPROC
PROC SP_PRINT_TAG()
PRINTSTRING("[script_profiler][") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("] ")
ENDPROC
FUNC BOOL IsThisScriptProfilerThreadActive()
IF (SPData.bClearData)
ClearProfilerData()
SPData.bClearData = FALSE
ENDIF
IF (SPData.bIsActive)
IF (GlobalScriptProfileData.iActiveThread = -1)
ClearProfilerData()
ClearPeaks()
GlobalScriptProfileData.iActiveThread = NATIVE_TO_INT(GET_ID_OF_THIS_THREAD())
CLEAR_NAMED_DEBUG_FILE(sp_PATHNAME, sp_FILENAME)
OPEN_NAMED_DEBUG_FILE(sp_PATHNAME, sp_FILENAME)
SP_PRINT_TAG() PRINTSTRING("] - made the active thread") PRINTNL()
ENDIF
IF (GlobalScriptProfileData.iActiveThread = NATIVE_TO_INT(GET_ID_OF_THIS_THREAD()))
RETURN(TRUE)
ELSE
//SP_PRINT_TAG() SP_PRINTSTRING("Another script is currently active - this script is waiting") SP_PRINTNL()
ENDIF
ELSE
IF (GlobalScriptProfileData.iActiveThread = NATIVE_TO_INT(GET_ID_OF_THIS_THREAD()))
OR NOT IS_THREAD_ACTIVE(INT_TO_NATIVE(THREADID, GlobalScriptProfileData.iActiveThread))
GlobalScriptProfileData.iActiveThread = -1
CLOSE_DEBUG_FILE()
ENDIF
ENDIF
RETURN(FALSE)
ENDFUNC
FUNC BOOL IsThisScriptGoodToOutputToFile()
IF (SPData.bOutputToFile)
RETURN(GlobalScriptProfileData.bGoodToOutput)
ENDIF
RETURN(FALSE)
ENDFUNC
PROC SET_SCRIPT_PROFILER_ACTIVE(BOOL bSet)
SPData.bIsActive = bSet
ENDPROC
PROC SET_SCRIPT_PROFILER_RENDER_BARS(BOOL bSet)
SPData.bRenderSP = bSet
ENDPROC
PROC OUTPUT_ALL_SCRIPT_PROFILER_DATA_TO_FILE()
SPData.bOutputToFile = TRUE
ENDPROC
PROC SP_PRINTSTRING(sTRING str)
PRINTSTRING(str)
SAVE_STRING_TO_NAMED_DEBUG_FILE(str, sp_PATHNAME, sp_FILENAME)
ENDPROC
PROC SP_PRINTINT(INT iInt)
PRINTINT(iInt)
SAVE_INT_TO_NAMED_DEBUG_FILE(iInt, sp_PATHNAME, sp_FILENAME)
ENDPROC
PROC SP_PRINTFLOAT(FLOAT fFloat)
PRINTFLOAT(fFloat)
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(fFloat, sp_PATHNAME, sp_FILENAME)
ENDPROC
PROC SP_PRINTNL()
PRINTNL()
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(sp_PATHNAME, sp_FILENAME)
ENDPROC
PROC FILL_STRING_TO_LENGTH(INT iLength, STRING str)
INT i
REPEAT (iLength - GET_LENGTH_OF_LITERAL_STRING(str)) i
SP_PRINTSTRING(" ")
ENDREPEAT
ENDPROC
PROC PROFILER_TEST_NUMBER_OF_COMMMANDS(INT iNumber)
INT i
REPEAT iNumber i
// do nothing
ENDREPEAT
ENDPROC
// ************* new procs ********************
FUNC INT GetMarkerIndexFromString(STRING strName)
INT iStringAsHash = GET_HASH_KEY(strName)
INT i
REPEAT MAX_SCRIPT_PROFILE_MARKERS i
IF (GlobalScriptProfileData.iMarkerIDs[i] = iStringAsHash)
RETURN i
ENDIF
ENDREPEAT
// else need to add it
REPEAT MAX_SCRIPT_PROFILE_MARKERS i
IF (GlobalScriptProfileData.iMarkerIDs[i] = 0)
GlobalScriptProfileData.iMarkerIDs[i] = iStringAsHash
RETURN i
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
FUNC INT GET_SCRIPT_TIME_IN_MICROSECONDS()
RETURN FLOOR(GET_SCRIPT_TIME_WITHIN_FRAME_IN_MICROSECONDS())
ENDFUNC
PROC SUSPEND_COUNTING(BOOL bSet)
IF IsThisScriptProfilerThreadActive()
IF (bSet)
IF (GlobalScriptProfileData.bCountingSuspended)
SCRIPT_ASSERT("SUSPEND_COUNTING - already called with TRUE")
ELSE
GlobalScriptProfileData.iSuspendTime = GET_SCRIPT_TIME_IN_MICROSECONDS()
GlobalScriptProfileData.iSuspendIns = GET_NUMBER_OF_INSTRUCTIONS_EXECUTED()
ENDIF
ELSE
IF NOT (GlobalScriptProfileData.bCountingSuspended)
SCRIPT_ASSERT("SUSPEND_COUNTING - already called with FALSE")
ELSE
INT iDiff
iDiff = GET_SCRIPT_TIME_IN_MICROSECONDS() - GlobalScriptProfileData.iSuspendTime
IF (iDiff > 0)
GlobalScriptProfileData.iLastMarkerTime += iDiff
ENDIF
iDiff = GET_NUMBER_OF_INSTRUCTIONS_EXECUTED() - GlobalScriptProfileData.iSuspendIns
IF (iDiff > 0)
GlobalScriptProfileData.iLastMarkerIns += iDiff
ENDIF
ENDIF
ENDIF
GlobalScriptProfileData.bCountingSuspended = bSet
ENDIF
ENDPROC
FUNC INT GET_TOTAL_FOR_MARKER(INT iMarkerID, INT iType)
INT iTotal = 0
FLOAT fAverage
IF (iMarkerID > -1)
SWITCH iType
CASE 0
iTotal = GlobalScriptProfileData.MarkerData[iMarkerID].iTime
BREAK
CASE 1
iTotal = GlobalScriptProfileData.MarkerData[iMarkerID].iPeakTime
BREAK
CASE 2
iTotal = GlobalScriptProfileData.MarkerData[iMarkerID].iIns
BREAK
CASE 3
iTotal = GlobalScriptProfileData.MarkerData[iMarkerID].iPeakIns
BREAK
CASE 4
fAverage = TO_FLOAT(GlobalScriptProfileData.MarkerData[iMarkerID].iTimeTotal) / TO_FLOAT(GlobalScriptProfileData.MarkerData[iMarkerID].iCalls)
iTotal = ROUND(fAverage)
//iTotal = GlobalScriptProfileData.MarkerData[iMarkerID].iTimeAvg
BREAK
CASE 5
fAverage = TO_FLOAT(GlobalScriptProfileData.MarkerData[iMarkerID].iInsTotal) / TO_FLOAT(GlobalScriptProfileData.MarkerData[iMarkerID].iCalls)
iTotal = ROUND(fAverage)
//iTotal += GlobalScriptProfileData.MarkerData[iMarkerID].iInsAvg
BREAK
ENDSWITCH
IF (GlobalScriptProfileData.MarkerData[iMarkerID].bHasChildren)
INT iChild
REPEAT MAX_SCRIPT_PROFILE_MARKERS iChild
IF (GlobalScriptProfileData.MarkerData[iChild].iParentID = iMarkerID)
iTotal += GET_TOTAL_FOR_MARKER(iChild, iType)
ENDIF
ENDREPEAT
ENDIF
ENDIF
RETURN iTotal
ENDFUNC
PROC OUTPUT_MARKER_TO_FILE(INT iMarkerID, INT iIndent)
IF IsThisScriptGoodToOutputToFile()
INT iLength
INT i
TEXT_LABEL_63 str63
INT iTotal[6]
REPEAT 6 i
iTotal[i] = GET_TOTAL_FOR_MARKER(iMarkerID, i)
IF (iTotal[i] < 0)
iTotal[i] = 0
ENDIF
ENDREPEAT
iLength = 0
PRINTSTRING("[script_profiler] - ") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("] ")
REPEAT iIndent i
SP_PRINTSTRING(" ")
iLength += GET_LENGTH_OF_LITERAL_STRING(" ")
ENDREPEAT
SP_PRINTSTRING(GlobalScriptProfileData.MarkerData[iMarkerID].strName)
FILL_STRING_TO_LENGTH(100 - iLength, GlobalScriptProfileData.MarkerData[iMarkerID].strName)
str63 = " Av Time: "
str63 += iTotal[4]
SP_PRINTSTRING(str63)
FILL_STRING_TO_LENGTH(25, str63)
str63 = " Av Ins: "
str63 += iTotal[5]
SP_PRINTSTRING(str63)
FILL_STRING_TO_LENGTH(25, str63)
str63 = " Peak Time: "
str63 += iTotal[1]
SP_PRINTSTRING(str63)
FILL_STRING_TO_LENGTH(25, str63)
str63 = " Peak Ins: "
str63 += iTotal[3]
SP_PRINTSTRING(str63)
FILL_STRING_TO_LENGTH(25, str63)
SP_PRINTNL()
ENDIF
ENDPROC
PROC OUTPUT_MARKER(INT iMarkerID, INT iIndent)
OUTPUT_MARKER_TO_FILE(iMarkerID, iIndent)
INT iChild
REPEAT MAX_SCRIPT_PROFILE_MARKERS iChild
IF (GlobalScriptProfileData.MarkerData[iChild].iParentID = iMarkerID)
OUTPUT_MARKER(iChild, iIndent+1)
ENDIF
ENDREPEAT
ENDPROC
PROC OUTPUT_ALL_MARKERS_TO_FILE()
INT iMarker
REPEAT MAX_SCRIPT_PROFILE_MARKERS iMarker
IF (GlobalScriptProfileData.MarkerData[iMarker].iIndex > -1)
AND (GlobalScriptProfileData.MarkerData[iMarker].iParentID = -1)
OUTPUT_MARKER(iMarker, 0)
ENDIF
ENDREPEAT
ENDPROC
PROC RENDER_MARKER_BARS(INT iMarkerID, INT iIndent)
IF (GlobalScriptProfileData.iRowToRender >= GlobalScriptProfileData.iStartRowToRender)
AND (GlobalScriptProfileData.iRowToRender < (GlobalScriptProfileData.iStartRowToRender + GlobalScriptProfileData.iNumberOfRowsToRender))
FLOAT fThisY
FLOAT fThisWidth
TEXT_LABEL_63 strLabel
INT r,g,b,a
INT i
INT iTotal[6]
REPEAT 6 i
iTotal[i] = GET_TOTAL_FOR_MARKER(iMarkerID, i)
IF (iTotal[i] < 0)
iTotal[i] = 0
ENDIF
ENDREPEAT
fThisY = fSPStartY + (fYSpacer * TO_FLOAT((GlobalScriptProfileData.iRowToRender + 1) - GlobalScriptProfileData.iStartRowToRender))
SET_TEXT_SCALE(fProfTextScale, fProfTextScale)
IF NOT (GlobalScriptProfileData.MarkerData[iMarkerID].bCalledThisFrame)
SET_TEXT_COLOUR(128, 128, 128, 255)
ELSE
SET_TEXT_COLOUR(255, 255, 255, 255)
ENDIF
strLabel = ""
REPEAT iIndent i
strLabel += " "
ENDREPEAT
IF (GlobalScriptProfileData.MarkerData[iMarkerID].bHasChildren)
IF (GlobalScriptProfileData.MarkerData[iMarkerID].bShowChildren)
strLabel += "[-]"
ELSE
strLabel += "[+]"
ENDIF
ENDIF
IF (GlobalScriptProfileData.MarkerData[iMarkerID].bIsLoopParent)
strLabel += "[L]"
ENDIF
strLabel += GlobalScriptProfileData.MarkerData[iMarkerID].strName
strLabel += ":"
DISPLAY_TEXT_WITH_LITERAL_STRING(fSPTextX, fThisY + fTextAdjustmentY + fSPScrollValue, "STRING", strLabel)
SET_TEXT_SCALE(fProfTextScale, fProfTextScale)
SET_TEXT_COLOUR(255, 255, 255, 255)
strLabel = "~HC_YELLOW~"
strLabel += iTotal[0]
strLabel += "~s~,~HC_ORANGE~"
strLabel += iTotal[4]
strLabel += "~s~,~HC_RED~"
strLabel += iTotal[1]
DISPLAY_TEXT_WITH_LITERAL_STRING(fSPNumbersX, fThisY + fTextAdjustmentY + fSPScrollValue, "STRING", strLabel)
SET_TEXT_SCALE(fProfTextScale, fProfTextScale)
SET_TEXT_COLOUR(255, 255, 255, 255)
strLabel = "~HC_BLUELIGHT~"
strLabel += iTotal[2]
strLabel += "~s~,~HC_BLUE~"
strLabel += iTotal[5]
strLabel += "~s~,~HC_PURPLE~"
strLabel += iTotal[3]
DISPLAY_TEXT_WITH_LITERAL_STRING(fSPNumbersX2, fThisY + fTextAdjustmentY + fSPScrollValue, "STRING", strLabel)
// alterternate background row colours
IF (GlobalScriptProfileData.iLastBackground = 0)
GlobalScriptProfileData.iLastBackground = 1
ELSE
GlobalScriptProfileData.iLastBackground = 0
ENDIF
// draw background
IF (GlobalScriptProfileData.iRowToHighlight = GlobalScriptProfileData.iRowToRender)
r = 255
g = 0
b = 0
a = 128
ELSE
SWITCH iIndent
CASE 0
r = 0
g = 0
b = 0
BREAK
CASE 1
r = 0
g = 0
b = 64
BREAK
CASE 2
r = 64
g = 0
b = 0
BREAK
CASE 3
r = 0
g = 64
b = 0
BREAK
CASE 4
r = 0
g = 64
b = 64
BREAK
CASE 5
r = 64
g = 0
b = 64
BREAK
CASE 6
r = 64
g = 64
b = 0
BREAK
CASE 7
r = 32
g = 32
b = 128
BREAK
CASE 8
r = 32
g = 128
b = 32
BREAK
CASE 9
r = 128
g = 32
b = 32
BREAK
CASE 10
r = 128
g = 128
b = 32
BREAK
ENDSWITCH
IF (GlobalScriptProfileData.iLastBackground = 0)
a = 192
ELSE
a = 128
ENDIF
ENDIF
DRAW_RECT_FROM_CORNER(fSPTextX, fThisY + fTextAdjustmentY + fSPScrollValue, fRowWidth, fYSpacer, r,g,b,a)
// draw bar for time
fThisWidth = TO_FLOAT(iTotal[0]) * 0.001 * fSPWidthPerMS
GET_HUD_COLOUR(HUD_COLOUR_YELLOW, r,g,b,a)
a = 192
DRAW_RECT_FROM_CORNER(fSPStartX, fThisY - (fSPHeight * 0.5) + fSPScrollValue, fThisWidth, fSPHeight, r,g,b,a)
// draw orrange average
IF (iTotal[4] > 0)
fThisWidth = TO_FLOAT(iTotal[4]) * 0.001 * fSPWidthPerMS
GET_HUD_COLOUR(HUD_COLOUR_ORANGE, r,g,b,a)
DRAW_RECT_FROM_CORNER(fSPStartX + fThisWidth, fThisY - (fSPHeight * 0.5) + fSPScrollValue, 0.001, fSPHeight, r,g,b,a)
ENDIF
// draw red peak
IF (iTotal[1] > 0)
fThisWidth = TO_FLOAT(iTotal[1]) * 0.001 * fSPWidthPerMS
GET_HUD_COLOUR(HUD_COLOUR_RED, r,g,b,a)
DRAW_RECT_FROM_CORNER(fSPStartX + fThisWidth, fThisY - (fSPHeight * 0.5) + fSPScrollValue, 0.001, fSPHeight, r,g,b,a)
ENDIF
// draw bar for commands
fThisWidth = (TO_FLOAT(iTotal[2]) * 0.001) * fSPWidthPer1000Commands
GET_HUD_COLOUR(HUD_COLOUR_BLUELIGHT, r,g,b,a)
a = 192
DRAW_RECT_FROM_CORNER(fSPStartX, fThisY + (fSPHeight * 0.5) + fSPScrollValue, fThisWidth, fSPHeight, r,g,b,a)
// draw blue average
IF (iTotal[5] > 0)
fThisWidth = TO_FLOAT(iTotal[5]) * 0.001 * fSPWidthPer1000Commands
GET_HUD_COLOUR(HUD_COLOUR_BLUE, r,g,b,a)
DRAW_RECT_FROM_CORNER(fSPStartX + fThisWidth, fThisY + (fSPHeight * 0.5) + fSPScrollValue, 0.001, fSPHeight, r,g,b,a)
ENDIF
// draw purple peak
IF (iTotal[3] > 0)
fThisWidth = TO_FLOAT(iTotal[3]) * 0.001 * fSPWidthPer1000Commands
GET_HUD_COLOUR(HUD_COLOUR_PURPLE, r,g,b,a)
DRAW_RECT_FROM_CORNER(fSPStartX + fThisWidth, fThisY + (fSPHeight * 0.5) + fSPScrollValue, 0.001, fSPHeight, r,g,b,a)
ENDIF
GlobalScriptProfileData.MarkerData[iMarkerID].bIsRendering = TRUE
ENDIF
IF (GlobalScriptProfileData.iRowToHighlight = GlobalScriptProfileData.iRowToRender)
GlobalScriptProfileData.iHighlightedMarkerID = iMarkerID
ENDIF
GlobalScriptProfileData.iRowToRender++
ENDPROC
PROC RENDER_MARKER(INT iMarkerID, INT iIndent)
IF NOT (GlobalScriptProfileData.MarkerData[iMarkerID].bIsHidden)
RENDER_MARKER_BARS(iMarkerID, iIndent)
IF (GlobalScriptProfileData.MarkerData[iMarkerID].bShowChildren)
INT iChild
REPEAT MAX_SCRIPT_PROFILE_MARKERS iChild
IF (GlobalScriptProfileData.MarkerData[iChild].iParentID = iMarkerID)
RENDER_MARKER(iChild, iIndent+1)
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDPROC
PROC RENDER_TOP_PARENTS()
INT iMarker
REPEAT MAX_SCRIPT_PROFILE_MARKERS iMarker
GlobalScriptProfileData.MarkerData[iMarker].bIsRendering = FALSE
ENDREPEAT
REPEAT MAX_SCRIPT_PROFILE_MARKERS iMarker
IF (GlobalScriptProfileData.MarkerData[iMarker].iIndex > -1)
AND (GlobalScriptProfileData.MarkerData[iMarker].iParentID = -1)
RENDER_MARKER(iMarker, 0)
ENDIF
ENDREPEAT
ENDPROC
PROC RENDER_PROFILER_SCREEN()
IF (SPData.bRenderSP)
TEXT_LABEL_63 strLabel
// display total commands and time
DRAW_RECT_FROM_CORNER(fSPTextX, fSPStartY + fTextAdjustmentY, 0.8, fYSpacer, 0, 0, 0, 128)
SET_TEXT_SCALE(fProfTextScale, fProfTextScale)
SET_TEXT_COLOUR(255, 0, 0, 255)
strLabel = "Total Time = "
strLabel += GlobalScriptProfileData.iTotalAccumulatedTime
strLabel += ", Total Commands = "
strLabel += GlobalScriptProfileData.iCommandsSinceStartOfFrame
strLabel += ","
strLabel += GlobalScriptProfileData.iTotalAccumulatedCommands
DISPLAY_TEXT_WITH_LITERAL_STRING(fSPTextX, fSPStartY + fTextAdjustmentY, "STRING", strLabel)
// draw peak total commands and time
SET_TEXT_SCALE(fProfTextScale, fProfTextScale)
SET_TEXT_COLOUR(255, 0, 0, 255)
strLabel = "Peak Total Time = "
strLabel += GlobalScriptProfileData.iTotalAccumulatedTimePeak
strLabel += ", Peak Total Commands = "
strLabel += GlobalScriptProfileData.iCommandsSinceStartOfFramePeak
DISPLAY_TEXT_WITH_LITERAL_STRING(fSPTextX + 0.25, fSPStartY + fTextAdjustmentY, "STRING", strLabel)
// how many markers are there?
SET_TEXT_SCALE(fProfTextScale, fProfTextScale)
SET_TEXT_COLOUR(255, 0, 0, 255)
strLabel = "Number of markers = "
strLabel += GlobalScriptProfileData.iMarkerCount
DISPLAY_TEXT_WITH_LITERAL_STRING(fSPTextX + 0.65, fSPStartY + fTextAdjustmentY, "STRING", strLabel)
RENDER_TOP_PARENTS()
ENDIF
ENDPROC
PROC SCRIPT_PROFILER_END_OF_FRAME()
SUSPEND_COUNTING(TRUE)
IF IsThisScriptProfilerThreadActive()
IF (GlobalScriptProfileData.bStartOfFrameCalled)
GlobalScriptProfileData.iCommandsSinceStartOfFrame = GET_NUMBER_OF_INSTRUCTIONS_EXECUTED() - GlobalScriptProfileData.iStartOfFrameCommands
IF IsThisScriptGoodToOutputToFile()
PRINTSTRING("************************* Script Profiler - END - ") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("**********************************") PRINTNL()
//OUTPUT_PEAK_ARRAY_INFO()
OUTPUT_ALL_MARKERS_TO_FILE()
SPData.bOutputToFile = FALSE
//SPData.bIsActive = FALSE // after we have out put then switch this thread off to allow others to be output
//ClearPeaks()
ENDIF
GlobalScriptProfileData.bStartOfFrameCalled = FALSE
RENDER_PROFILER_SCREEN()
ENDIF
ENDIF
SUSPEND_COUNTING(FALSE)
ENDPROC
PROC SCRIPT_PROFILER_START_OF_FRAME()
INT i
//SUSPEND_COUNTING(TRUE)
IF IS_DEBUG_KEY_JUST_PRESSED(KEY_1, KEYBOARD_MODIFIER_SHIFT, "Output script profiler info")
ClearPeaks()
SPData.bIsActive = TRUE
SPData.bOutputToFile = TRUE
SP_PRINT_TAG() PRINTSTRING("- detected key 1 press") PRINTNL()
// clear the SPLog.txt
IF IsThisScriptProfilerThreadActive()
CLOSE_DEBUG_FILE()
CLEAR_NAMED_DEBUG_FILE(sp_PATHNAME, sp_FILENAME)
OPEN_NAMED_DEBUG_FILE(sp_PATHNAME, sp_FILENAME)
ENDIF
ENDIF
IF IsThisScriptProfilerThreadActive()
IF (GlobalScriptProfileData.bStartOfFrameCalled)
SCRIPT_PROFILER_END_OF_FRAME()
ENDIF
IF (GET_TIME_DIFFERENCE(GET_NETWORK_TIME(), GlobalScriptProfileData.iClearPeakTime) > 10000)
GlobalScriptProfileData.bGoodToOutput = TRUE
ELSE
GlobalScriptProfileData.bGoodToOutput = FALSE
ENDIF
IF NOT (SPData.bSPWidgetCreated)
SCRIPT_ASSERT("Need to call CREATE_SCRIPT_PROFILER_WIDGET in your widget group")
ENDIF
// update peaks
IF (GlobalScriptProfileData.iTotalAccumulatedTime > GlobalScriptProfileData.iTotalAccumulatedTimePeak)
GlobalScriptProfileData.iTotalAccumulatedTimePeak = GlobalScriptProfileData.iTotalAccumulatedTime
ENDIF
IF (GlobalScriptProfileData.iCommandsSinceStartOfFrame > GlobalScriptProfileData.iCommandsSinceStartOfFramePeak)
GlobalScriptProfileData.iCommandsSinceStartOfFramePeak = GlobalScriptProfileData.iCommandsSinceStartOfFrame
ENDIF
// get current number of rows being rendered
GlobalScriptProfileData.iTotalRowsRendered = 0
REPEAT MAX_SCRIPT_PROFILE_MARKERS i
IF (GlobalScriptProfileData.MarkerData[i].bIsRendering)
GlobalScriptProfileData.iTotalRowsRendered++
ENDIF
ENDREPEAT
IF (SPData.bRenderSP)
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2)
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_DOWN)
GlobalScriptProfileData.iRowToHighlight++
IF (GlobalScriptProfileData.iRowToHighlight >= GlobalScriptProfileData.iStartRowToRender + GlobalScriptProfileData.iTotalRowsRendered)
// loop round
IF (GlobalScriptProfileData.iRowToHighlight >= GlobalScriptProfileData.iRowToRender)
GlobalScriptProfileData.iRowToHighlight--
ELSE
// scroll down
GlobalScriptProfileData.iStartRowToRender++
IF (GlobalScriptProfileData.iStartRowToRender > (GlobalScriptProfileData.iMarkerCount - (GlobalScriptProfileData.iNumberOfRowsToRender-1)))
GlobalScriptProfileData.iStartRowToRender = (GlobalScriptProfileData.iMarkerCount - (GlobalScriptProfileData.iNumberOfRowsToRender-1))
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD8)
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_UP)
GlobalScriptProfileData.iRowToHighlight--
IF (GlobalScriptProfileData.iRowToHighlight < GlobalScriptProfileData.iStartRowToRender)
// loop round?
IF (GlobalScriptProfileData.iRowToHighlight < 0 )
GlobalScriptProfileData.iRowToHighlight = GlobalScriptProfileData.iStartRowToRender + (GlobalScriptProfileData.iTotalRowsRendered - 1)
ELSE
// scroll up
GlobalScriptProfileData.iStartRowToRender--
IF (GlobalScriptProfileData.iStartRowToRender < 0)
GlobalScriptProfileData.iStartRowToRender = 0
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1)
REPEAT MAX_SCRIPT_PROFILE_MARKERS i
GlobalScriptProfileData.MarkerData[i].bShowChildren = FALSE
ENDREPEAT
GlobalScriptProfileData.iStartRowToRender = 0
GlobalScriptProfileData.iRowToHighlight = 0
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD3)
REPEAT MAX_SCRIPT_PROFILE_MARKERS i
GlobalScriptProfileData.MarkerData[i].bShowChildren = TRUE
ENDREPEAT
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD5)
ClearPeaks()
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD6)
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_RIGHT)
IF (GlobalScriptProfileData.iHighlightedMarkerID > -1)
IF (GlobalScriptProfileData.MarkerData[GlobalScriptProfileData.iHighlightedMarkerID].bHasChildren)
OR (GlobalScriptProfileData.MarkerData[GlobalScriptProfileData.iHighlightedMarkerID].bIsLoopParent)
GlobalScriptProfileData.MarkerData[GlobalScriptProfileData.iHighlightedMarkerID].bShowChildren = TRUE
ENDIF
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD4)
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_LEFT)
IF (GlobalScriptProfileData.iHighlightedMarkerID > -1)
IF (GlobalScriptProfileData.MarkerData[GlobalScriptProfileData.iHighlightedMarkerID].bShowChildren)
GlobalScriptProfileData.MarkerData[GlobalScriptProfileData.iHighlightedMarkerID].bShowChildren = FALSE
ENDIF
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_B)
IF (SPData.bRenderSP)
SPData.bRenderSP = FALSE
ELSE
SPData.bRenderSP = TRUE
ENDIF
ENDIF
GlobalScriptProfileData.iLastBackground = 0
ENDIF
IF IsThisScriptGoodToOutputToFile()
SP_PRINTNL()
SP_PRINTSTRING("************************* Script Profiler - ") SP_PRINTSTRING(GET_THIS_SCRIPT_NAME()) SP_PRINTSTRING(" **********************************") SP_PRINTNL()
SP_PRINTNL()
// count number of players?
INT iCount
IF NETWORK_IS_GAME_IN_PROGRESS()
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
SP_PRINT_TAG() SP_PRINTSTRING("Host:YES") SP_PRINTNL()
ELSE
SP_PRINT_TAG() SP_PRINTSTRING("Host:NO") SP_PRINTNL()
ENDIF
REPEAT NUM_NETWORK_PLAYERS i
IF IS_NET_PLAYER_OK(INT_TO_NATIVE(PLAYER_INDEX, i), FALSE, TRUE)
iCount++
ENDIF
ENDREPEAT
SP_PRINT_TAG() SP_PRINTSTRING("No of players:") SP_PRINTINT(iCount) SP_PRINTNL()
ENDIF
// total commands
SP_PRINT_TAG() SP_PRINTSTRING("Total Commands:") SP_PRINTINT(GlobalScriptProfileData.iCommandsSinceStartOfFrame) SP_PRINTNL()
SP_PRINT_TAG() SP_PRINTSTRING("Total Time:") SP_PRINTINT(GlobalScriptProfileData.iTotalAccumulatedTime) SP_PRINTNL()
// peak totals
SP_PRINT_TAG() SP_PRINTSTRING("Peak Total Commands:") SP_PRINTINT(GlobalScriptProfileData.iCommandsSinceStartOfFramePeak) SP_PRINTNL()
SP_PRINT_TAG() SP_PRINTSTRING("Peak Total Time:") SP_PRINTINT(GlobalScriptProfileData.iTotalAccumulatedTimePeak) SP_PRINTNL()
SP_PRINT_TAG() SP_PRINTSTRING("Time since peak clear:") SP_PRINTINT(GET_TIME_DIFFERENCE(GET_NETWORK_TIME(), GlobalScriptProfileData.iClearPeakTime)) SP_PRINTNL()
SP_PRINTNL()
ENDIF
GET_NUMBER_OF_MICROSECONDS_SINCE_LAST_CALL()
GlobalScriptProfileData.iStartOfFrameCommands = GET_NUMBER_OF_INSTRUCTIONS_EXECUTED()
GlobalScriptProfileData.iTotalAccumulatedTime = 0
GlobalScriptProfileData.iTotalAccumulatedCommands = 0
GlobalScriptProfileData.bStartOfFrameCalled = TRUE
GlobalScriptProfileData.iCurrentParentID = -1
GlobalScriptProfileData.iRowToRender = 0
GlobalScriptProfileData.iFailedMarkerCount = 0
GlobalScriptProfileData.iOpenNestGroups = 0
REPEAT MAX_NUMBER_OF_SCRIPT_PROFILER_NESTS i
GlobalScriptProfileData.iPreviousParentID[i] = -1
ENDREPEAT
REPEAT MAX_SCRIPT_PROFILE_MARKERS i
GlobalScriptProfileData.MarkerData[i].bHasChildren = FALSE
GlobalScriptProfileData.MarkerData[i].bIsLoopParent = FALSE
GlobalScriptProfileData.MarkerData[i].bCalledThisFrame = FALSE
GlobalScriptProfileData.MarkerData[i].iTime = 0
GlobalScriptProfileData.MarkerData[i].iIns = 0
ENDREPEAT
GlobalScriptProfileData.iLastMarkerTime = GET_SCRIPT_TIME_IN_MICROSECONDS()
GlobalScriptProfileData.iLastMarkerIns = GET_NUMBER_OF_INSTRUCTIONS_EXECUTED()
ENDIF
//SUSPEND_COUNTING(FALSE)
ENDPROC
PROC ADD_SCRIPT_PROFILE_MARKER( STRING strName, BOOL bIsHidden=FALSE, BOOL bForceAdd=FALSE)
SUSPEND_COUNTING(TRUE)
INT iThisMarkerID = -1
INT iTime = GET_SCRIPT_TIME_IN_MICROSECONDS() - GlobalScriptProfileData.iLastMarkerTime
INT iInsThis = GET_NUMBER_OF_INSTRUCTIONS_EXECUTED()
INT iIns = iInsThis - GlobalScriptProfileData.iLastMarkerIns
IF IsThisScriptProfilerThreadActive()
IF (iTime < 0)
INT iTime1 = GET_SCRIPT_TIME_IN_MICROSECONDS()
SP_PRINT_TAG() PRINTLN(" NEG TIME - GET_SCRIPT_TIME_IN_MICROSECONDS = ", iTime1, " iLastMarkerTime = ", GlobalScriptProfileData.iLastMarkerTime )
ENDIF
IF (iIns < 0)
SP_PRINT_TAG() PRINTLN(" NEG INS - GET_NUMBER_OF_INSTRUCTIONS_EXECUTED = ", GET_NUMBER_OF_INSTRUCTIONS_EXECUTED(), " iLastMarkerIns = ", GlobalScriptProfileData.iLastMarkerIns )
ENDIF
iThisMarkerID = GetMarkerIndexFromString(strName)
IF (iThisMarkerID > -1)
// //IF ((GlobalScriptProfileData.iLastMarkerID > iThisMarkerID) AND (iThisMarkerID > 0))
// IF (iThisMarkerID = 17)
// PRINTLN("ADD_SCRIPT_PROFILE_MARKER - iLastMarkerID ", GlobalScriptProfileData.iLastMarkerID, " > iThisMarkerID ", iThisMarkerID)
// PRINTLN("ADD_SCRIPT_PROFILE_MARKER - iInsThis ", iInsThis, " GlobalScriptProfileData.iLastMarkerIns ", GlobalScriptProfileData.iLastMarkerIns, " iIns = ", iIns)
// ENDIF
GlobalScriptProfileData.MarkerData[iThisMarkerID].bIsHidden = bIsHidden
// update this marker's data
IF GlobalScriptProfileData.MarkerData[iThisMarkerID].iIndex = -1
OR GlobalScriptProfileData.MarkerData[iThisMarkerID].iIndex = iThisMarkerID
OR (bForceAdd)
IF ((iTime >= 0) OR (iIns >= 0))
OR (bForceAdd)
IF NOT (GlobalScriptProfileData.MarkerData[iThisMarkerID].bCalledThisFrame) // only update if not been called already this frame
OR (bForceAdd)
OR (GlobalScriptProfileData.bLoopProfilerStarted)
// if the parent has changed then it must be getting called from somewhere else
IF (GlobalScriptProfileData.MarkerData[iThisMarkerID].iIndex != -1)
AND (GlobalScriptProfileData.MarkerData[iThisMarkerID].iParentID != -1)
AND (GlobalScriptProfileData.iCurrentParentID != GlobalScriptProfileData.MarkerData[iThisMarkerID].iParentID)
SP_PRINT_TAG() PRINTLN("ADD_SCRIPT_PROFILE_MARKER - already registered in another location!. ", strName, ", ID ", iThisMarkerID, " hash ", GlobalScriptProfileData.iMarkerIDs[iThisMarkerID])
ELSE
IF (GlobalScriptProfileData.MarkerData[iThisMarkerID].iIndex = -1)
SP_PRINT_TAG() PRINTLN("ADD_SCRIPT_PROFILE_MARKER - new marker registerd. ", strName, ", ID ", iThisMarkerID, " hash ", GlobalScriptProfileData.iMarkerIDs[iThisMarkerID])
DEBUG_PRINTCALLSTACK()
GlobalScriptProfileData.iMarkerCount++
ENDIF
GlobalScriptProfileData.MarkerData[iThisMarkerID].iHash = GlobalScriptProfileData.iMarkerIDs[iThisMarkerID]
GlobalScriptProfileData.MarkerData[iThisMarkerID].iIndex = iThisMarkerID
GlobalScriptProfileData.MarkerData[iThisMarkerID].iParentID = GlobalScriptProfileData.iCurrentParentID
IF (GlobalScriptProfileData.bLoopProfilerStarted)
GlobalScriptProfileData.MarkerData[iThisMarkerID].iTime += iTime
GlobalScriptProfileData.MarkerData[iThisMarkerID].iIns += iIns
ELSE
GlobalScriptProfileData.MarkerData[iThisMarkerID].iTime = iTime
GlobalScriptProfileData.MarkerData[iThisMarkerID].iIns = iIns
ENDIF
// get averages
GlobalScriptProfileData.MarkerData[iThisMarkerID].iTimeTotal += iTime
GlobalScriptProfileData.MarkerData[iThisMarkerID].iInsTotal += iIns
IF NOT (GlobalScriptProfileData.MarkerData[iThisMarkerID].bCalledThisFrame)
GlobalScriptProfileData.MarkerData[iThisMarkerID].iCalls++
ENDIF
//FLOAT fAverage
//fAverage = TO_FLOAT(GlobalScriptProfileData.MarkerData[iThisMarkerID].iTimeTotal) / TO_FLOAT(GlobalScriptProfileData.MarkerData[iThisMarkerID].iCalls)
//GlobalScriptProfileData.MarkerData[iThisMarkerID].iTimeAvg = FLOOR(fAverage)
//fAverage = TO_FLOAT(GlobalScriptProfileData.MarkerData[iThisMarkerID].iInsTotal) / TO_FLOAT(GlobalScriptProfileData.MarkerData[iThisMarkerID].iCalls)
//GlobalScriptProfileData.MarkerData[iThisMarkerID].iInsAvg = FLOOR(fAverage)
IF (GlobalScriptProfileData.MarkerData[iThisMarkerID].iTime > GlobalScriptProfileData.MarkerData[iThisMarkerID].iPeakTime)
GlobalScriptProfileData.MarkerData[iThisMarkerID].iPeakTime = GlobalScriptProfileData.MarkerData[iThisMarkerID].iTime
ENDIF
IF (GlobalScriptProfileData.MarkerData[iThisMarkerID].iIns > GlobalScriptProfileData.MarkerData[iThisMarkerID].iPeakIns)
GlobalScriptProfileData.MarkerData[iThisMarkerID].iPeakIns = GlobalScriptProfileData.MarkerData[iThisMarkerID].iIns
ENDIF
GlobalScriptProfileData.MarkerData[iThisMarkerID].bCalledThisFrame = TRUE
GlobalScriptProfileData.MarkerData[iThisMarkerID].strName = strName
GlobalScriptProfileData.MarkerData[iThisMarkerID].bIsLoopChild = GlobalScriptProfileData.bLoopProfilerStarted
GlobalScriptProfileData.iLastMarkerID = iThisMarkerID
GlobalScriptProfileData.iLastMarkerTime = GET_SCRIPT_TIME_IN_MICROSECONDS()
GlobalScriptProfileData.iLastMarkerIns = GET_NUMBER_OF_INSTRUCTIONS_EXECUTED()
GlobalScriptProfileData.bCountingSuspended = FALSE
GlobalScriptProfileData.iTotalAccumulatedTime += iTime
GlobalScriptProfileData.iTotalAccumulatedCommands += iIns
EXIT
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
GlobalScriptProfileData.iFailedMarkerCount++
ENDIF
ENDIF
SUSPEND_COUNTING(FALSE)
ENDPROC
PROC NEST_SCRIPT_PROFILE_MARKERS(BOOL bNest, BOOL bLoop=FALSE)
SUSPEND_COUNTING(TRUE)
IF IsThisScriptProfilerThreadActive()
IF (bNest)
IF (GlobalScriptProfileData.iOpenNestGroups < MAX_NUMBER_OF_SCRIPT_PROFILER_NESTS)
GlobalScriptProfileData.iPreviousParentID[GlobalScriptProfileData.iOpenNestGroups] = GlobalScriptProfileData.iCurrentParentID
GlobalScriptProfileData.iCurrentParentID = GlobalScriptProfileData.iLastMarkerID
GlobalScriptProfileData.MarkerData[GlobalScriptProfileData.iCurrentParentID].bHasChildren = TRUE
GlobalScriptProfileData.MarkerData[GlobalScriptProfileData.iCurrentParentID].bIsLoopParent = bLoop
GlobalScriptProfileData.iOpenNestGroups++
ELSE
SCRIPT_ASSERT("NEST_SCRIPT_PROFILE_MARKERS - hit MAX_NUMBER_OF_SCRIPT_PROFILER_NESTS ")
ENDIF
ELSE
IF (GlobalScriptProfileData.iOpenNestGroups > 0)
GlobalScriptProfileData.iOpenNestGroups--
ELSE
SCRIPT_ASSERT("NEST_SCRIPT_PROFILE_MARKERS - open nest groups < 0 ")
ENDIF
GlobalScriptProfileData.iCurrentParentID = GlobalScriptProfileData.iPreviousParentID[GlobalScriptProfileData.iOpenNestGroups]
ENDIF
ENDIF
SUSPEND_COUNTING(FALSE)
ENDPROC
PROC OPEN_SCRIPT_PROFILE_MARKER_GROUP(STRING strName)
ADD_SCRIPT_PROFILE_MARKER(strName, FALSE, TRUE)
NEST_SCRIPT_PROFILE_MARKERS(TRUE)
ENDPROC
PROC CLOSE_SCRIPT_PROFILE_MARKER_GROUP()
IF IsThisScriptProfilerThreadActive()
TEXT_LABEL_63 str = ""
str += GlobalScriptProfileData.MarkerData[GlobalScriptProfileData.iCurrentParentID].iIndex
str += " end group"
ADD_SCRIPT_PROFILE_MARKER(str, TRUE, TRUE)
ENDIF
NEST_SCRIPT_PROFILE_MARKERS(FALSE)
ENDPROC
PROC ADD_SCRIPT_PROFILE_PRE_LOOP_MARKER(STRING strName)
SUSPEND_COUNTING(TRUE)
IF IsThisScriptProfilerThreadActive()
IF NOT (GlobalScriptProfileData.bLoopProfilerStarted)
ADD_SCRIPT_PROFILE_MARKER(strName, FALSE, TRUE)
NEST_SCRIPT_PROFILE_MARKERS(TRUE, TRUE)
GlobalScriptProfileData.bLoopProfilerStarted = TRUE
ELSE
SCRIPT_ASSERT("ADD_SCRIPT_PROFILE_PRE_LOOP_MARKER - called without an END")
ENDIF
ENDIF
SUSPEND_COUNTING(FALSE)
ENDPROC
PROC ADD_SCRIPT_PROFILE_POST_LOOP_MARKER()
SUSPEND_COUNTING(TRUE)
IF IsThisScriptProfilerThreadActive()
IF (GlobalScriptProfileData.bLoopProfilerStarted)
CLOSE_SCRIPT_PROFILE_MARKER_GROUP()
GlobalScriptProfileData.bLoopProfilerStarted = FALSE
ELSE
SCRIPT_ASSERT("END_SCRIPT_PROFILE_ACCUMULATOR - called without a START")
ENDIF
ENDIF
SUSPEND_COUNTING(FALSE)
ENDPROC
#ENDIF
#ENDIF