Browse Source

engine: minor changes in ticker.

legacy
Sam Hocevar 6 years ago
parent
commit
615c968e2d
7 changed files with 63 additions and 76 deletions
  1. +2
    -1
      src/application/sdl-app.cpp
  2. +5
    -16
      src/engine/entity.cpp
  3. +2
    -24
      src/engine/entity.h
  4. +37
    -30
      src/engine/ticker.cpp
  5. +4
    -2
      src/engine/ticker.h
  6. +9
    -0
      src/lol/engine/tickable.h
  7. +4
    -3
      src/lol/sys/thread.h

+ 2
- 1
src/application/sdl-app.cpp View File

@@ -177,7 +177,7 @@ SdlApp::SdlApp(char const *title, ivec2 res, float fps) :
ivec2 screen_size = res; ivec2 screen_size = res;


/* Initialise everything */ /* Initialise everything */
Ticker::Setup(fps);
ticker::setup(fps);
audio::init(); audio::init();


/* Autoreleased objects */ /* Autoreleased objects */
@@ -210,6 +210,7 @@ SdlApp::~SdlApp()
SDL_Quit(); SDL_Quit();
#endif #endif
delete data; delete data;
ticker::teardown();
} }


} /* namespace lol */ } /* namespace lol */


+ 5
- 16
src/engine/entity.cpp View File

@@ -27,7 +27,7 @@ Entity::Entity() :
m_destroy(0) m_destroy(0)
{ {
#if !LOL_BUILD_RELEASE #if !LOL_BUILD_RELEASE
m_tickstate = STATE_IDLE;
m_tickstate = tickable::state::idle;
#endif #endif
m_gamegroup = tickable::group::game::entity; m_gamegroup = tickable::group::game::entity;
m_drawgroup = tickable::group::draw::entity; m_drawgroup = tickable::group::draw::entity;
@@ -61,9 +61,9 @@ void Entity::tick_game(float seconds)
{ {
UNUSED(seconds); UNUSED(seconds);
#if !LOL_BUILD_RELEASE #if !LOL_BUILD_RELEASE
if (m_tickstate != STATE_PRETICK_GAME)
if (m_tickstate != tickable::state::pre_game)
msg::error("invalid entity game tick\n"); msg::error("invalid entity game tick\n");
m_tickstate = STATE_POSTTICK_GAME;
m_tickstate = tickable::state::post_game;
#endif #endif
} }


@@ -71,22 +71,11 @@ void Entity::tick_draw(float seconds, Scene &scene)
{ {
UNUSED(seconds, scene); UNUSED(seconds, scene);
#if !LOL_BUILD_RELEASE #if !LOL_BUILD_RELEASE
if (m_tickstate != STATE_PRETICK_DRAW)
if (m_tickstate != tickable::state::pre_draw)
msg::error("invalid entity draw tick\n"); msg::error("invalid entity draw tick\n");
m_tickstate = STATE_POSTTICK_DRAW;
m_tickstate = tickable::state::post_draw;
#endif #endif
} }


void Entity::SetState(uint32_t state)
{
Ticker::SetState(this, state);
}

void Entity::SetStateWhenMatch(uint32_t state,
Entity *other_entity, uint32_t other_state)
{
Ticker::SetStateWhenMatch(this, state, other_entity, other_state);
}

} /* namespace lol */ } /* namespace lol */



+ 2
- 24
src/engine/entity.h View File

@@ -47,8 +47,7 @@ class Entity
{ {
friend class Scene; friend class Scene;
friend class ticker; friend class ticker;
friend class TickerData;
friend class Emcee;
friend class ticker_data;


public: public:
virtual std::string GetName() const; virtual std::string GetName() const;
@@ -70,33 +69,12 @@ protected:
InitState m_initstate; InitState m_initstate;


#if !LOL_BUILD_RELEASE #if !LOL_BUILD_RELEASE
enum
{
STATE_IDLE = 0,
STATE_PRETICK_GAME,
STATE_POSTTICK_GAME,
STATE_PRETICK_DRAW,
STATE_POSTTICK_DRAW,
}
m_tickstate;
tickable::state m_tickstate;
#endif #endif


tickable::group::game m_gamegroup; tickable::group::game m_gamegroup;
tickable::group::draw m_drawgroup; tickable::group::draw m_drawgroup;


// Emcee begin
private:
void SetState(uint32_t newstate);
void SetStateWhenMatch(uint32_t newstate,
Entity *other_entity, uint32_t other_state);
virtual uint32_t OnStateChanged(uint32_t newstate)
{
return LOLm_state = newstate;
}

uint32_t LOLm_state;
// Emcee end

private: private:
int m_ref, m_autorelease, m_destroy; int m_ref, m_autorelease, m_destroy;
uint64_t m_scene_mask = 0; uint64_t m_scene_mask = 0;


+ 37
- 30
src/engine/ticker.cpp View File

@@ -23,13 +23,13 @@ namespace lol
* Ticker implementation class * Ticker implementation class
*/ */


static class TickerData
class ticker_data
{ {
friend class ticker; friend class ticker;


public: public:
TickerData() :
DEPRECATED_nentities(0),
ticker_data()
: DEPRECATED_nentities(0),
frame(0), recording(0), deltatime(0), bias(0), fps(0), frame(0), recording(0), deltatime(0), bias(0), fps(0),
#if LOL_BUILD_DEBUG #if LOL_BUILD_DEBUG
keepalive(0), keepalive(0),
@@ -38,7 +38,7 @@ public:
{ {
} }


~TickerData()
~ticker_data()
{ {
ASSERT(DEPRECATED_nentities == 0, ASSERT(DEPRECATED_nentities == 0,
"still %d entities in ticker\n", DEPRECATED_nentities); "still %d entities in ticker\n", DEPRECATED_nentities);
@@ -51,6 +51,7 @@ public:
disktick.push(0); disktick.push(0);
gamethread.release(); gamethread.release();
diskthread.release(); diskthread.release();
ASSERT(drawtick.size() == 0);
#endif #endif
} }


@@ -90,10 +91,9 @@ private:


/* Shutdown management */ /* Shutdown management */
int quit, quitframe, quitdelay, panic; int quit, quitframe, quitdelay, panic;
}
tickerdata;
};


static TickerData * const data = &tickerdata;
static std::unique_ptr<ticker_data> data;


// //
// Add/remove tickable objects // Add/remove tickable objects
@@ -167,7 +167,7 @@ int Ticker::Unref(Entity *entity)
} }


#if LOL_FEATURE_THREADS #if LOL_FEATURE_THREADS
void TickerData::GameThreadMain()
void ticker_data::GameThreadMain()
{ {
#if LOL_BUILD_DEBUG #if LOL_BUILD_DEBUG
msg::debug("ticker game thread initialised\n"); msg::debug("ticker game thread initialised\n");
@@ -193,7 +193,7 @@ void TickerData::GameThreadMain()
#endif /* LOL_FEATURE_THREADS */ #endif /* LOL_FEATURE_THREADS */


#if LOL_FEATURE_THREADS #if LOL_FEATURE_THREADS
void TickerData::DrawThreadMain() /* unused */
void ticker_data::DrawThreadMain() /* unused */
{ {
#if LOL_BUILD_DEBUG #if LOL_BUILD_DEBUG
msg::debug("ticker draw thread initialised\n"); msg::debug("ticker draw thread initialised\n");
@@ -217,7 +217,7 @@ void TickerData::DrawThreadMain() /* unused */
#endif /* LOL_FEATURE_THREADS */ #endif /* LOL_FEATURE_THREADS */


#if LOL_FEATURE_THREADS #if LOL_FEATURE_THREADS
void TickerData::DiskThreadMain()
void ticker_data::DiskThreadMain()
{ {
/* FIXME: temporary hack to avoid crashes on the PS3 */ /* FIXME: temporary hack to avoid crashes on the PS3 */
disktick.pop(); disktick.pop();
@@ -225,7 +225,7 @@ void TickerData::DiskThreadMain()
#endif /* LOL_FEATURE_THREADS */ #endif /* LOL_FEATURE_THREADS */


//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void TickerData::GameThreadTick()
void ticker_data::GameThreadTick()
{ {
Profiler::Stop(Profiler::STAT_TICK_FRAME); Profiler::Stop(Profiler::STAT_TICK_FRAME);
Profiler::Start(Profiler::STAT_TICK_FRAME); Profiler::Start(Profiler::STAT_TICK_FRAME);
@@ -419,17 +419,17 @@ void TickerData::GameThreadTick()
if (!e->m_destroy) if (!e->m_destroy)
{ {
#if !LOL_BUILD_RELEASE #if !LOL_BUILD_RELEASE
if (e->m_tickstate != Entity::STATE_IDLE)
if (e->m_tickstate != tickable::state::idle)
msg::error("entity %s [%p] not idle for game tick\n", msg::error("entity %s [%p] not idle for game tick\n",
e->GetName().c_str(), e); e->GetName().c_str(), e);
e->m_tickstate = Entity::STATE_PRETICK_GAME;
e->m_tickstate = tickable::state::pre_game;
#endif #endif
e->tick_game(data->deltatime); e->tick_game(data->deltatime);
#if !LOL_BUILD_RELEASE #if !LOL_BUILD_RELEASE
if (e->m_tickstate != Entity::STATE_POSTTICK_GAME)
if (e->m_tickstate != tickable::state::post_game)
msg::error("entity %s [%p] missed super game tick\n", msg::error("entity %s [%p] missed super game tick\n",
e->GetName().c_str(), e); e->GetName().c_str(), e);
e->m_tickstate = Entity::STATE_IDLE;
e->m_tickstate = tickable::state::idle;
#endif #endif
} }
} }
@@ -439,7 +439,7 @@ void TickerData::GameThreadTick()
} }


//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void TickerData::DrawThreadTick()
void ticker_data::DrawThreadTick()
{ {
Profiler::Start(Profiler::STAT_TICK_DRAW); Profiler::Start(Profiler::STAT_TICK_DRAW);


@@ -473,17 +473,17 @@ void TickerData::DrawThreadTick()
if (!e->m_destroy) if (!e->m_destroy)
{ {
#if !LOL_BUILD_RELEASE #if !LOL_BUILD_RELEASE
if (e->m_tickstate != Entity::STATE_IDLE)
if (e->m_tickstate != tickable::state::idle)
msg::error("entity %s [%p] not idle for draw tick\n", msg::error("entity %s [%p] not idle for draw tick\n",
e->GetName().c_str(), e); e->GetName().c_str(), e);
e->m_tickstate = Entity::STATE_PRETICK_DRAW;
e->m_tickstate = tickable::state::pre_draw;
#endif #endif
e->tick_draw(data->deltatime, scene); e->tick_draw(data->deltatime, scene);
#if !LOL_BUILD_RELEASE #if !LOL_BUILD_RELEASE
if (e->m_tickstate != Entity::STATE_POSTTICK_DRAW)
if (e->m_tickstate != tickable::state::post_draw)
msg::error("entity %s [%p] missed super draw tick\n", msg::error("entity %s [%p] missed super draw tick\n",
e->GetName().c_str(), e); e->GetName().c_str(), e);
e->m_tickstate = Entity::STATE_IDLE;
e->m_tickstate = tickable::state::idle;
#endif #endif
} }
} }
@@ -501,7 +501,7 @@ void TickerData::DrawThreadTick()
Profiler::Stop(Profiler::STAT_TICK_DRAW); Profiler::Stop(Profiler::STAT_TICK_DRAW);
} }


void TickerData::DiskThreadTick()
void ticker_data::DiskThreadTick()
{ {
; ;
} }
@@ -517,28 +517,35 @@ void Ticker::SetStateWhenMatch(Entity * /* entity */, uint32_t /* state */,


} }


//-----------------------------------------------------------------------------
void Ticker::Setup(float fps)
void ticker::setup(float fps)
{ {
data = std::make_unique<ticker_data>();
data->fps = fps; data->fps = fps;


#if LOL_FEATURE_THREADS #if LOL_FEATURE_THREADS
data->gamethread = std::make_unique<thread>(std::bind(&TickerData::GameThreadMain, data));
data->gamethread = std::make_unique<thread>(std::bind(&ticker_data::GameThreadMain, data.get()));
data->drawtick.push(1); data->drawtick.push(1);


data->diskthread = std::make_unique<thread>(std::bind(&TickerData::DiskThreadMain, data));
data->diskthread = std::make_unique<thread>(std::bind(&ticker_data::DiskThreadMain, data.get()));
#endif #endif
} }


void Ticker::tick_draw()
void ticker::teardown()
{
data.release();
}

void ticker::tick_draw()
{ {
#if LOL_FEATURE_THREADS #if LOL_FEATURE_THREADS
data->drawtick.pop();
int n = data->drawtick.pop();
if (n == 0)
return;
#else #else
TickerData::GameThreadTick();
ticker_data::GameThreadTick();
#endif #endif


TickerData::DrawThreadTick();
ticker_data::DrawThreadTick();


Profiler::Start(Profiler::STAT_TICK_BLIT); Profiler::Start(Profiler::STAT_TICK_BLIT);


@@ -546,7 +553,7 @@ void Ticker::tick_draw()
#if LOL_FEATURE_THREADS #if LOL_FEATURE_THREADS
data->gametick.push(1); data->gametick.push(1);
#else #else
TickerData::DiskThreadTick();
ticker_data::DiskThreadTick();
#endif #endif


/* Clamp FPS */ /* Clamp FPS */


+ 4
- 2
src/engine/ticker.h View File

@@ -29,6 +29,10 @@ namespace lol
class ticker class ticker
{ {
public: public:
static void setup(float fps);
static void tick_draw();
static void teardown();

static void add(std::shared_ptr<tickable> entity); static void add(std::shared_ptr<tickable> entity);
static void remove(std::shared_ptr<tickable> entity); static void remove(std::shared_ptr<tickable> entity);


@@ -37,8 +41,6 @@ public:
static void Ref(class Entity *entity); static void Ref(class Entity *entity);
static int Unref(class Entity *entity); static int Unref(class Entity *entity);


static void Setup(float fps);
static void tick_draw();
static void StartBenchmark(); static void StartBenchmark();
static void StopBenchmark(); static void StopBenchmark();
static void StartRecording(); static void StartRecording();


+ 9
- 0
src/lol/engine/tickable.h View File

@@ -45,6 +45,15 @@ public:
return p; return p;
} }


enum class state
{
idle,
pre_game,
post_game,
pre_draw,
post_draw,
};

// Tick groups // Tick groups
struct group struct group
{ {


+ 4
- 3
src/lol/sys/thread.h View File

@@ -1,7 +1,7 @@
// //
// Lol Engine // Lol Engine
// //
// Copyright © 2010—2017 Sam Hocevar <sam@hocevar.net>
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net>
// //
// Lol Engine is free software. It comes without any warranty, to // Lol Engine is free software. It comes without any warranty, to
// the extent permitted by applicable law. You can redistribute it // the extent permitted by applicable law. You can redistribute it
@@ -94,8 +94,9 @@ public:
queue() queue()
: m_start(0), : m_start(0),
m_count(0) m_count(0)
{
}
{}

int size() const { return m_count; }


// Will block the thread if another has already locked // Will block the thread if another has already locked
void push(T value) void push(T value)


Loading…
Cancel
Save