zrrz111

Scheduler

Apr 1st, 2016
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.56 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. public class Scheduler : MonoBehaviour {
  6.  
  7.     Queue<Task> tasks;
  8.     Stack<Task> repeatingTasksToAdd;
  9.  
  10.     static Scheduler s_instance;
  11.  
  12.     public delegate void TaskDelegate();
  13.    
  14.     Dictionary<TaskDelegate, TaskData> taskTimes;
  15.  
  16.     [System.Serializable]
  17.     public class TaskTemp {
  18.         public TaskTemp(TaskDelegate t, TaskData p_data) {
  19.             task = t.Method.Name; data = p_data;
  20.         }
  21.         public TaskTemp(){}
  22.         public string task;
  23.         public TaskData data;
  24.     }
  25.  
  26.     public List<TaskTemp> taskListTemp;
  27.  
  28.     [System.Serializable]
  29.     public class TaskData {
  30.         public TaskData(float p_time) {
  31.             time = p_time;
  32.             numTimes = 0;
  33.         }
  34.         public float time;
  35.         public int numTimes;
  36.     }
  37.  
  38.     const float MAX_FRAME_TIME = 1f/240f;
  39.  
  40.     const int RUNS_TILL_SAMPLE = 10;
  41.  
  42.     public bool run = false;
  43.  
  44.     class Task {
  45.         public Task(TaskDelegate p_myDelegate, bool p_repeating) {
  46.             myDelegate = p_myDelegate;
  47.             repeating = p_repeating;
  48.         }
  49.         public Task() {}
  50.         public TaskDelegate myDelegate;
  51.         public bool repeating;
  52.     }
  53.  
  54.     public static void AddTask(TaskDelegate task, bool repeating) {
  55.         instance.tasks.Enqueue(new Task(task, repeating));
  56.     }
  57.    
  58.     void Awake () {
  59.         s_instance = this;
  60.         tasks = new Queue<Task>();
  61.         repeatingTasksToAdd = new Stack<Task>();
  62.         taskTimes = new Dictionary<TaskDelegate, TaskData>();
  63.     }
  64.    
  65.     void Update () {
  66.         while (repeatingTasksToAdd.Count > 0)
  67.             tasks.Enqueue (repeatingTasksToAdd.Pop ());
  68.  
  69.         if(!run)
  70.             return;
  71.         if(tasks.Count > 0) {
  72.             int tasksDone = 0;                      //Debug
  73.             Task task = tasks.Dequeue();
  74.             if(taskTimes.ContainsKey(task.myDelegate)) {
  75.                 taskTimes[task.myDelegate].numTimes++;
  76.                 if(taskTimes[task.myDelegate].numTimes > RUNS_TILL_SAMPLE) {
  77.                     TimeTask(task);
  78.                     taskTimes[task.myDelegate].numTimes = 1;
  79.                 } else {
  80.                     DoTask(task);
  81.                 }
  82.                 float curTasktime = taskTimes[task.myDelegate].time;
  83.                 tasksDone++;                        //Debug
  84.  
  85.                 bool moreTasks = true;
  86.                 while(moreTasks) {
  87.                     if(tasks.Count == 0) {
  88.                         moreTasks = false;
  89.                         break;
  90.                     }
  91.                     if(taskTimes.ContainsKey(tasks.Peek().myDelegate)) {
  92.                         float addTime = taskTimes[tasks.Peek().myDelegate].time;
  93.                         if(curTasktime + addTime < MAX_FRAME_TIME) {
  94.                             task = tasks.Dequeue();
  95.                             DoTask(task);
  96.                             tasksDone++;            //Debug
  97.                             curTasktime += taskTimes[task.myDelegate].time;
  98.                             if(curTasktime > MAX_FRAME_TIME) {
  99.                                 moreTasks = false;
  100.                             }
  101.                         } else {
  102.                             moreTasks = false;
  103.                         }
  104.                     } else {
  105.                         moreTasks = false;
  106.                     }
  107.                 }
  108.             } else {
  109.                 TimeTask(task);
  110.                 tasksDone++;                        //Debug
  111.             }
  112.             print ("Tasks done: " + tasksDone);     //Debug
  113.         }
  114.     }
  115.  
  116.     void TimeTask(Task task) {
  117.         float curTime = Time.realtimeSinceStartup;
  118.         DoTask(task);      
  119.         float taskTime = Time.realtimeSinceStartup - curTime;
  120.  
  121.         if(taskTimes.ContainsKey(task.myDelegate)) {
  122.             taskTimes[task.myDelegate].time = (taskTimes[task.myDelegate].time + taskTime)/2f;
  123.         } else {
  124.             taskTimes.Add(task.myDelegate, new TaskData(taskTime));
  125.             taskListTemp.Add(new TaskTemp(task.myDelegate, taskTimes[task.myDelegate]));
  126.         }
  127.         print ("Task " + task.myDelegate.Method.Name + " takes " + (taskTime));
  128.     }
  129.  
  130.     void DoTask(Task task) {
  131.         task.myDelegate();
  132.         if(task.repeating)
  133.             repeatingTasksToAdd.Push(task);
  134.     }
  135.    
  136.     public static Scheduler instance {
  137.         get {
  138.             return s_instance;
  139.         }
  140.     }
  141.  
  142.     void OnGUI() {
  143.         GUILayout.BeginVertical();
  144.         foreach(Task task in tasks) {
  145.             GUILayout.Label(task.myDelegate.Method.Name);
  146.         }
  147.         GUILayout.EndVertical();
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment