BGE Animations: Adding an option to let users choose whether or not to lock animation updates to the framerate. If this option is enabled, animations are only updated at the same speed as the animation framerate. This can give a significant speed up in performance, but at the cost of smoothness in animations. I'm defaulting this behavior to off for now, which is the behavior seen in trunk.

This commit is contained in:
2011-08-12 20:53:29 +00:00
parent 83f0c6e569
commit c5ef9b62c1
7 changed files with 56 additions and 12 deletions

View File

@@ -342,6 +342,7 @@ class RENDER_PT_game_performance(RenderButtonsPanel, bpy.types.Panel):
row = layout.row()
row.prop(gs, "use_frame_rate")
row.prop(gs, "use_display_lists")
row.prop(gs, "restrict_animation_updates")
class RENDER_PT_game_display(RenderButtonsPanel, bpy.types.Panel):

View File

@@ -479,6 +479,7 @@ typedef struct GameData {
#define WOPHY_BULLET 5
/* GameData.flag */
#define GAME_RESTRICT_ANIM_UPDATES (1 << 0)
#define GAME_ENABLE_ALL_FRAMES (1 << 1)
#define GAME_SHOW_DEBUG_PROPS (1 << 2)
#define GAME_SHOW_FRAMERATE (1 << 3)
@@ -494,6 +495,7 @@ typedef struct GameData {
#define GAME_ENABLE_ANIMATION_RECORD (1 << 13)
#define GAME_SHOW_MOUSE (1 << 14)
#define GAME_GLSL_NO_COLOR_MANAGEMENT (1 << 15)
/* Note: GameData.flag is a short (max 16 flags). To add more flags, GameData.flag needs to be an int */
/* GameData.matmode */
#define GAME_MAT_TEXFACE 0

View File

@@ -1919,6 +1919,10 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_auto_start", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_GameSettings_auto_start_get", "rna_GameSettings_auto_start_set");
RNA_def_property_ui_text(prop, "Auto Start", "Automatically start game at load time");
prop= RNA_def_property(srna, "restrict_animation_updates", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_RESTRICT_ANIM_UPDATES);
RNA_def_property_ui_text(prop, "Restrict Animation Updates", "Restrict the number of animation updates to the animation FPS. This is better for performance, but can cause issues with smooth playback.");
/* materials */
prop= RNA_def_property(srna, "material_mode", PROP_ENUM, PROP_NONE);

View File

@@ -187,6 +187,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
#endif
bool novertexarrays = (SYS_GetCommandLineInt(syshandle, "novertexarrays", 0) != 0);
bool mouse_state = startscene->gm.flag & GAME_SHOW_MOUSE;
bool restrictAnimFPS = startscene->gm.flag & GAME_RESTRICT_ANIM_UPDATES;
if(animation_record) usefixed= true; /* override since you's always want fixed time for sim recording */
@@ -237,6 +238,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
ketsjiengine->SetNetworkDevice(networkdevice);
ketsjiengine->SetUseFixedTime(usefixed);
ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
ketsjiengine->SetRestrictAnimationFPS(restrictAnimFPS);
#ifdef WITH_PYTHON
CValue::SetDeprecationWarnings(nodepwarnings);

View File

@@ -545,6 +545,7 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
bool frameRate = (SYS_GetCommandLineInt(syshandle, "show_framerate", 0) != 0);
bool useLists = (SYS_GetCommandLineInt(syshandle, "displaylists", gm->flag & GAME_DISPLAY_LISTS) != 0);
bool nodepwarnings = (SYS_GetCommandLineInt(syshandle, "ignore_deprecation_warnings", 1) != 0);
bool restrictAnimFPS = gm->flag & GAME_RESTRICT_ANIM_UPDATES;
if(GLEW_ARB_multitexture && GLEW_VERSION_1_1)
m_blendermat = (SYS_GetCommandLineInt(syshandle, "blender_material", 1) != 0);
@@ -627,6 +628,7 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
m_ketsjiengine->SetUseFixedTime(fixed_framerate);
m_ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
m_ketsjiengine->SetRestrictAnimationFPS(restrictAnimFPS);
m_engineInitialized = true;
}

View File

@@ -110,6 +110,7 @@ double KX_KetsjiEngine::m_anim_framerate = 25.0;
double KX_KetsjiEngine::m_suspendedtime = 0.0;
double KX_KetsjiEngine::m_suspendeddelta = 0.0;
double KX_KetsjiEngine::m_average_framerate = 0.0;
bool KX_KetsjiEngine::m_restrict_anim_fps = false;
/**
@@ -660,7 +661,14 @@ else
m_logger->StartLog(tc_scenegraph, m_kxsystem->GetTimeInSeconds(), true);
SG_SetActiveStage(SG_STAGE_ACTUATOR_UPDATE);
scene->UpdateParents(m_frameTime);
if (!GetRestrictAnimationFPS())
{
m_logger->StartLog(tc_animations, m_kxsystem->GetTimeInSeconds(), true);
SG_SetActiveStage(SG_STAGE_ANIMATION_UPDATE);
scene->UpdateAnimations(m_frameTime);
}
m_logger->StartLog(tc_physics, m_kxsystem->GetTimeInSeconds(), true);
SG_SetActiveStage(SG_STAGE_PHYSICS2);
scene->GetPhysicsEnvironment()->beginFrame();
@@ -769,21 +777,24 @@ else
// Handle the animations independently of the logic time step
m_logger->StartLog(tc_animations, m_kxsystem->GetTimeInSeconds(), true);
SG_SetActiveStage(SG_STAGE_ANIMATION_UPDATE);
double anim_timestep = 1.0/KX_GetActiveScene()->GetAnimationFPS();
if (m_clockTime - m_previousAnimTime > anim_timestep)
if (GetRestrictAnimationFPS())
{
// Sanity/debug print to make sure we're actually going at the fps we want (should be close to anim_timestep)
// printf("Anim fps: %f\n", 1.0/(m_clockTime - m_previousAnimTime));
m_previousAnimTime = m_clockTime;
for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); ++sceneit)
m_logger->StartLog(tc_animations, m_kxsystem->GetTimeInSeconds(), true);
SG_SetActiveStage(SG_STAGE_ANIMATION_UPDATE);
double anim_timestep = 1.0/KX_GetActiveScene()->GetAnimationFPS();
if (m_clockTime - m_previousAnimTime > anim_timestep)
{
(*sceneit)->UpdateAnimations(m_frameTime);
// Sanity/debug print to make sure we're actually going at the fps we want (should be close to anim_timestep)
// printf("Anim fps: %f\n", 1.0/(m_clockTime - m_previousAnimTime));
m_previousAnimTime = m_clockTime;
for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); ++sceneit)
{
(*sceneit)->UpdateAnimations(m_frameTime);
}
}
m_previousClockTime = m_clockTime;
}
m_previousClockTime = m_clockTime;
// Start logging time spend outside main loop
m_logger->StartLog(tc_outside, m_kxsystem->GetTimeInSeconds(), true);
@@ -1821,6 +1832,16 @@ void KX_KetsjiEngine::SetMaxPhysicsFrame(int frame)
m_maxPhysicsFrame = frame;
}
bool KX_KetsjiEngine::GetRestrictAnimationFPS()
{
return m_restrict_anim_fps;
}
void KX_KetsjiEngine::SetRestrictAnimationFPS(bool bRestrictAnimFPS)
{
m_restrict_anim_fps = bRestrictAnimFPS;
}
double KX_KetsjiEngine::GetAnimFrameRate()
{
return m_anim_framerate;

View File

@@ -116,6 +116,8 @@ private:
static double m_ticrate;
static double m_anim_framerate; /* for animation playback only - ipo and action */
static bool m_restrict_anim_fps;
static double m_suspendedtime;
static double m_suspendeddelta;
@@ -322,6 +324,16 @@ public:
*/
static void SetMaxPhysicsFrame(int frame);
/**
* Gets whether or not to lock animation updates to the animframerate
*/
static bool GetRestrictAnimationFPS();
/**
* Sets whether or not to lock animation updates to the animframerate
*/
static void SetRestrictAnimationFPS(bool bRestrictAnimFPS);
/**
* Gets the framerate for playing animations. (actions and ipos)
*/