Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ArrayCache.cs
浏览该文件的文档.
1using Engine;
2
3namespace Game {
4 public class ArrayCache<T> {
5 public ArrayCache(IEnumerable<int> bucketSizes, float minCacheRatio1, float minCacheTime1, float minCacheRatio2, float minCacheTime2) {
6 m_buckets = bucketSizes.OrderBy(s => s).Select(s => new Bucket { Capacity = s }).ToArray();
7 m_minCacheRatio1 = minCacheRatio1;
8 m_minCacheDuration1 = minCacheTime1;
9 m_minCacheRatio2 = minCacheRatio2;
10 m_minCacheDuration2 = minCacheTime2;
15 }
16
17 public T[] Rent(int capacity, bool clearArray) {
18 object @lock = m_lock;
19 T[] array2;
20 lock (@lock) {
21 Bucket bucket = GetBucket(capacity);
22 if (bucket != null) {
23 if (bucket.Stack.Count > 0) {
24 T[] array = bucket.Stack.Pop();
25 if (clearArray) {
26 Array.Clear(array, 0, array.Length);
27 }
28 m_cachedCount -= array.Length;
29 m_usedCount += array.Length;
30 array2 = array;
31 }
32 else {
33 m_usedCount += bucket.Capacity;
34 array2 = new T[bucket.Capacity];
35 }
36 }
37 else {
38 array2 = new T[capacity];
39 }
40 }
41 return array2;
42 }
43
44 public void Return(T[] array) {
45 object @lock = m_lock;
46 lock (@lock) {
47 Bucket bucket = GetBucket(array.Length);
48 if (bucket != null) {
49 bucket.Stack.Push(array);
50 m_cachedCount += array.Length;
51 m_usedCount -= array.Length;
52 }
53 float num = CalculateCacheRatio();
54 if (num >= m_minCacheRatio1) {
56 }
57 if (num >= m_minCacheRatio2) {
59 }
60 }
61 }
62
63 void CheckCache() {
64 object @lock = m_lock;
65 lock (@lock) {
66 float num = CalculateCacheRatio();
67 if ((num < m_minCacheRatio1 && Time.FrameStartTime - m_minCacheRatioLastTime1 > m_minCacheDuration1)
68 || (num < m_minCacheRatio2 && Time.FrameStartTime - m_minCacheRatioLastTime2 > m_minCacheDuration2)) {
69 ClearCache();
70 }
72 }
73 }
74
75 Bucket GetBucket(int capacity) {
76 for (int i = 0; i < m_buckets.Length; i++) {
77 if (m_buckets[i].Capacity >= capacity) {
78 return m_buckets[i];
79 }
80 }
81 return null;
82 }
83
84 void ClearCache() {
85 Bucket[] buckets = m_buckets;
86 for (int i = 0; i < buckets.Length; i++) {
87 buckets[i].Stack.Clear();
88 }
89 m_cachedCount = 0L;
92 }
93
95 if (m_cachedCount <= 0L) {
96 return 1f;
97 }
98 return m_usedCount / (float)(m_usedCount + m_cachedCount);
99 }
100
101 object m_lock = new();
102
104
106
108
110
112
114
116
118
120
121 class Bucket {
122 public int Capacity;
123
124 public Stack<T[]> Stack = new();
125 }
126 }
127}
static int Min(int x1, int x2)
static void QueueTimeDelayedExecution(double time, Action action)
定义 Time.cs:69
static double FrameStartTime
定义 Time.cs:42
static Action LowMemory
Bucket GetBucket(int capacity)
void Return(T[] array)
ArrayCache(IEnumerable< int > bucketSizes, float minCacheRatio1, float minCacheTime1, float minCacheRatio2, float minCacheTime2)
T[] Rent(int capacity, bool clearArray)