New src/dusk/perf module: a simple push/pop tick-stack (perfPush/perfPop/ perfReport) for measuring how long a labeled span of code takes, wired into engine.c's init/dispose. perfGetTick() is a placeholder - real time on DUSK_LINUX (clock_gettime) and DUSK_PSP (sceKernelGetSystemTimeWide), 0 elsewhere until a proper cross-platform answer is settled on. Used it this session to chase a reported PSP hitch when crossing a chunk boundary. Confirmed mapPositionSet itself (unload/load sweeps, chunk order rebuild, entity chunkIndex recompute) is consistently under ~3ms - not the cause. Along the way, found and fixed a real, unrelated bug: logDebug()/logError() on PSP did a fopen+write+fclose to the Memory Stick on every single call, which was massively inflating any perf measurement that logged from inside another measurement (the actual source of the ~29-128ms numbers first seen). That's now gated behind a new DUSK_PSP_LOG_FILE CMake option (default off). Also, as a real test based on this session's findings: - MAP_CHUNK_LOAD_CONCURRENCY dropped from 2 to 1 (8 and 4 both crashed/ were untested further on real PSP hardware; 1 is confirmed safe). - MAP_CHUNK_LOAD_DELAY_TEST: an intentionally exaggerated (now 50ms) artificial delay between starting successive chunk loads, gated in mapChunkLoadNext/mapUpdate, to observe the effect on framerate. All perf instrumentation call sites added during this investigation (assetChunkLoaderSync, assetMeshLoaderSync, mapPositionSet, the map area callback invocation, engine.c's frame boundary) were removed again once they'd served their purpose - only the reusable perf module itself and the two real fixes above remain. Co-Authored-By: Claude Sonnet 5 <[email protected]>
137 lines
4.5 KiB
CMake
137 lines
4.5 KiB
CMake
set(CMAKE_AR "$ENV{PSPDEV}/bin/psp-ar" CACHE FILEPATH "" FORCE)
|
|
set(CMAKE_RANLIB "$ENV{PSPDEV}/bin/psp-ranlib" CACHE FILEPATH "" FORCE)
|
|
set(CMAKE_C_COMPILER_AR "$ENV{PSPDEV}/bin/psp-ar" CACHE FILEPATH "" FORCE)
|
|
set(CMAKE_C_COMPILER_RANLIB "$ENV{PSPDEV}/bin/psp-ranlib" CACHE FILEPATH "" FORCE)
|
|
set(CMAKE_C_ARCHIVE_CREATE "$ENV{PSPDEV}/bin/psp-ar qc <TARGET> <LINK_FLAGS> <OBJECTS>")
|
|
set(CMAKE_C_ARCHIVE_APPEND "$ENV{PSPDEV}/bin/psp-ar q <TARGET> <LINK_FLAGS> <OBJECTS>")
|
|
set(CMAKE_C_ARCHIVE_FINISH "$ENV{PSPDEV}/bin/psp-ranlib <TARGET>")
|
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF CACHE BOOL "" FORCE)
|
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_C OFF CACHE BOOL "" FORCE)
|
|
|
|
find_package(SDL2 REQUIRED)
|
|
find_package(OpenGL REQUIRED)
|
|
target_link_libraries(${DUSK_BINARY_TARGET_NAME} PUBLIC
|
|
${SDL2_LIBRARIES}
|
|
SDL2
|
|
pthread
|
|
OpenGL::GL
|
|
zip
|
|
bz2
|
|
z
|
|
mbedtls
|
|
mbedcrypto
|
|
lzma
|
|
m
|
|
|
|
pspdebug
|
|
pspdisplay
|
|
pspge
|
|
pspctrl
|
|
pspgu
|
|
pspaudio
|
|
pspaudiolib
|
|
pspmp3
|
|
psputility
|
|
pspvfpu
|
|
pspvram
|
|
psphprm
|
|
pspnet
|
|
pspnet_inet
|
|
pspnet_apctl
|
|
psphttp
|
|
pspssl
|
|
)
|
|
|
|
target_include_directories(${DUSK_BINARY_TARGET_NAME} PRIVATE
|
|
${SDL2_INCLUDE_DIRS}
|
|
)
|
|
|
|
target_compile_definitions(${DUSK_BINARY_TARGET_NAME} PUBLIC
|
|
DUSK_SDL2
|
|
DUSK_OPENGL
|
|
DUSK_PSP
|
|
DUSK_INPUT_GAMEPAD
|
|
DUSK_PLATFORM_ENDIAN_LITTLE
|
|
DUSK_OPENGL_LEGACY
|
|
DUSK_DISPLAY_WIDTH=480
|
|
DUSK_DISPLAY_HEIGHT=272
|
|
DUSK_THREAD_PTHREAD
|
|
DUSK_TIME_DYNAMIC
|
|
DUSK_DISPLAY_OVERSCAN=6
|
|
)
|
|
|
|
# logDebug()/logError() additionally write every call to a file on the
|
|
# Memory Stick (ms0:/PSP/GAME/Dusk/*.log) - a real, measured source of
|
|
# per-call hitching (fopen+write+fclose every log line), not just a
|
|
# theoretical cost. Default off so a normal build doesn't pay it; opt in
|
|
# with -DDUSK_PSP_LOG_FILE=ON when the log file itself is actually needed
|
|
# (e.g. no way to see stdout on real hardware).
|
|
set(DUSK_PSP_LOG_FILE OFF CACHE BOOL "Also write PSP debug/error logs to ms0:/PSP/GAME/Dusk/*.log (slow - Memory Stick I/O per call).")
|
|
if(DUSK_PSP_LOG_FILE)
|
|
target_compile_definitions(${DUSK_BINARY_TARGET_NAME} PUBLIC
|
|
DUSK_PSP_LOG_FILE
|
|
)
|
|
endif()
|
|
|
|
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
target_compile_definitions(${DUSK_BINARY_TARGET_NAME} PUBLIC
|
|
DUSK_ASSERTIONS_FAKED
|
|
)
|
|
endif()
|
|
|
|
# Generate PARAM.SFO as a normal tracked build output (instead of letting
|
|
# create_pbp_file() auto-generate + delete it) so it can be reused below by
|
|
# a properly dependency-tracked EBOOT.PBP repack step.
|
|
set(DUSK_PSP_PARAM_SFO "${DUSK_BUILD_DIR}/PARAM.SFO")
|
|
add_custom_command(
|
|
OUTPUT "${DUSK_PSP_PARAM_SFO}"
|
|
COMMAND "$ENV{PSPDEV}/bin/mksfoex" "-d" "MEMSIZE=1" "-s" "APP_VER=01.00"
|
|
"${DUSK_BINARY_TARGET_NAME}" "${DUSK_PSP_PARAM_SFO}"
|
|
COMMENT "Generating PARAM.SFO for ${DUSK_BINARY_TARGET_NAME}"
|
|
VERBATIM
|
|
)
|
|
add_custom_target(DuskPspParamSfo DEPENDS "${DUSK_PSP_PARAM_SFO}")
|
|
|
|
# create_pbp_file()'s own POST_BUILD chain (below) also consumes
|
|
# DUSK_PSP_PARAM_SFO, so make sure it exists before that chain runs.
|
|
add_dependencies(${DUSK_BINARY_TARGET_NAME} DuskPspParamSfo)
|
|
|
|
# Postbuild, create .pbp file for PSP.
|
|
create_pbp_file(
|
|
TARGET "${DUSK_BINARY_TARGET_NAME}"
|
|
ICON_PATH NULL
|
|
BACKGROUND_PATH NULL
|
|
PREVIEW_PATH NULL
|
|
TITLE "${DUSK_BINARY_TARGET_NAME}"
|
|
PSAR_PATH ${DUSK_ASSETS_ZIP}
|
|
VERSION 01.00
|
|
SFO_PATH "${DUSK_PSP_PARAM_SFO}"
|
|
OUTPUT_DIR "${DUSK_BUILD_DIR}"
|
|
)
|
|
|
|
# CreatePBP.cmake's pack-pbp step is a POST_BUILD command tied to the
|
|
# executable target, so it only reruns when the ELF itself relinks. That
|
|
# means regenerating dusk.dsk (assets) alone, without touching any C
|
|
# source, silently leaves EBOOT.PBP embedding a stale asset pak. Repack it
|
|
# here as a normal file-tracked custom command depending on both the
|
|
# executable and the asset zip, so EBOOT.PBP always reflects the current
|
|
# assets even when nothing else about the build changed.
|
|
set(DUSK_PSP_EBOOT "${DUSK_BUILD_DIR}/EBOOT.PBP")
|
|
if(BUILD_PRX)
|
|
set(DUSK_PSP_EXECUTABLE "$<TARGET_FILE:${DUSK_BINARY_TARGET_NAME}>.prx")
|
|
else()
|
|
set(DUSK_PSP_EXECUTABLE "$<TARGET_FILE:${DUSK_BINARY_TARGET_NAME}>")
|
|
endif()
|
|
add_custom_command(
|
|
OUTPUT "${DUSK_PSP_EBOOT}"
|
|
COMMAND "$ENV{PSPDEV}/bin/pack-pbp" "${DUSK_PSP_EBOOT}" "${DUSK_PSP_PARAM_SFO}"
|
|
"NULL" "NULL" "NULL" "NULL" "NULL"
|
|
"${DUSK_PSP_EXECUTABLE}" "${DUSK_ASSETS_ZIP}"
|
|
DEPENDS
|
|
"$<TARGET_FILE:${DUSK_BINARY_TARGET_NAME}>"
|
|
"${DUSK_PSP_PARAM_SFO}"
|
|
"${DUSK_ASSETS_ZIP}"
|
|
COMMENT "Repacking EBOOT.PBP (tracks executable + asset pak freshness)"
|
|
VERBATIM
|
|
)
|
|
add_custom_target(DuskPspEbootRepack ALL DEPENDS "${DUSK_PSP_EBOOT}") |