00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00036 class PG_API pgTaskMgr
00037 {
00038 friend class pgTask;
00039
00040 public:
00041 pgDefineException(ExceptionDeleteTaskInDestructor);
00042 pgDefineException(ExceptionInvalidArgument);
00043 pgDefineException(ExceptionNewTaskInDestructor);
00044 pgDefineException(ExceptionNotInitialized);
00045
00046 static bool isCreated();
00047 static void createAfterSys(u16 aim_fps);
00048 static void destroyFirst();
00049
00050 static u16 getAimFPS();
00051 static r32 getCurFPS();
00052 static u64 getExecuteUsecTime();
00053 static u64 getRenderUsecTime();
00054 static u32 getFrameCount();
00055
00056 static pgTask* getFirstTaskN(pgTask::TaskOrder order);
00057 static pgTask* getLastTaskN(pgTask::TaskOrder order);
00058
00059 static bool isOrderActive(pgTask::TaskOrder order);
00060 static void setOrderActive(pgTask::TaskOrder from, pgTask::TaskOrder to, bool is_active);
00061 static void deleteOrder(pgTask::TaskOrder from, pgTask::TaskOrder to);
00062
00063 static void sendMessage(pgID msg_id, pgMsg<4>& msg);
00064
00065 static void resetFrameSkip();
00066
00067 static void updateForSystem();
00068 static void measureRenderTimeForSystem(void (*render_func)());
00069 static u32 setNextTaskNameForSystem(const char* name);
00070 static void deleteTaskForSystem(pgTask* task, bool is_direct_delete);
00071 static bool isFrameSkipResetForSystem();
00072
00073 private:
00074 static const u32 ORDER_NUM = 8 + 1 + 8;
00075 static const u32 FPS_MEASURE_FRAME_NUM = 10;
00076
00077 pgTaskMgr(u16 aim_fps);
00078 ~pgTaskMgr();
00079 void operator=(const pgTaskMgr&);
00080
00081 static pgTaskMgr* instance();
00082
00083 pgTask m_root_task[ORDER_NUM];
00084 u16 m_aim_fps;
00085 r32 m_cur_fps;
00086 u64 m_execute_time;
00087 u64 m_render_time;
00088 u64 m_last_update_time;
00089 u32 m_frame_count;
00090 u64 m_fps_measure_time;
00091 u32 m_fps_measure_count;
00092 pgTask* m_cur_task;
00093 pgTask* m_next_task;
00094 const char* m_next_task_name;
00095 bool m_is_frame_skip_reset;
00096 bool m_is_in_destructor;
00097
00098 static pgTaskMgr* m_instance;
00099 };