1291 lines
43 KiB
Scheme
Executable File
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
|
|
|