CSAPI

数据结构

线程概念

  • 并发 分配时间
  • 并行 多核运行 计算量密集
  • 同步 需要等待
  • 异步 不需要等待 网络操作
英文名 中文名 描述
Queue 队列
Stack
Dictionary<TKey, TValue> 字典
List 动态数组/列表
array 普通数组

队列(Queue)

  1. 事件队列:游戏中经常会有各种事件需要按顺序处理,如用户输入、AI行为、动画帧等。这些事件可以被放入一个队列中,然后按照它们被添加的顺序进行处理。

  2. 渲染队列:在图形渲染中,对象可能需要按照特定的顺序进行渲染(例如,先渲染背景,再渲染前景)。通过将渲染任务放入队列中,可以确保它们按照正确的顺序执行。

  3. 音频队列:在游戏中,可能需要播放多个音频文件,如背景音乐、音效等。通过使用队列,可以确保音频文件按照正确的顺序播放,并且不会出现重叠或混乱。

  4. 网络消息队列:在网络游戏中,客户端和服务器之间需要传递大量的消息。这些消息可以被放入队列中,然后按照接收的顺序进行处理。这有助于确保消息的及时处理和同步。

  5. AI寻路:在某些情况下,AI角色可能需要按照特定的顺序访问多个目标点。通过将目标点放入队列中,AI可以依次访问它们,而不会错过或跳过任何一个。

栈(Stack)

  1. 撤销/重做功能:许多游戏都提供了撤销或重做玩家操作的功能。这可以通过使用栈来实现。当玩家执行一个操作时,可以将该操作的状态信息压入栈中。如果玩家选择撤销操作,可以从栈中弹出最近的状态信息,并将游戏恢复到该状态。同样地,重做功能可以通过再次将状态信息压入栈中来实现。

  2. 递归算法:在游戏开发中,递归算法经常被用于处理复杂的逻辑问题,如树的遍历、图的搜索等。栈是递归算法的重要工具,因为它可以保存函数调用的上下文信息(如局部变量和返回地址),以便在函数返回时能够正确地恢复这些信息。

  3. UI导航:在某些UI界面中,如菜单或对话框,用户可能需要通过一系列层级进行导航。栈可以用于跟踪用户的导航历史,以便在用户点击“返回”按钮时能够返回到上一个层级。

  4. 动画状态管理:在游戏中,角色的动画状态可能会根据角色的行为或环境条件而发生变化。通过将不同的动画状态压入栈中,并在需要时弹出它们,可以实现复杂的动画状态管理。

  5. 内存管理:在某些情况下,栈也可以用于内存管理。例如,在编写一些需要频繁分配和释放小块内存的代码时,可以使用栈来存储这些内存块,以减少内存碎片和提高内存访问速度。然而,需要注意的是,栈的大小通常是有限的,因此不能用于存储大量数据或长期存储数据。

Array

简介

  • 普通数组,

  • Add

  • AddRange<>

  • Array()

  • Array.Array(Godot.Variant[])

  • Array.Array(System.Collections.Generic.IEnumerable<Godot.Variant>)

  • Array.Array(System.ReadOnlySpan<Godot.GodotObject>)

  • Array.Array(System.Span<Godot.NodePath>)

  • Array.Array(System.Span<Godot.Rid>)

  • Array.Array(System.Span<Godot.StringName>)

  • Array.BinarySearch(Godot.Variant)

  • Array.BinarySearch(int, int, Godot.Variant)

  • Array.Clear()

  • Array.Contains(Godot.Variant)

  • Array.CopyTo(Godot.Variant[], int)

  • Array.Dispose()

  • Array.Dispose(bool)

  • Array.Duplicate(bool)

  • Array.Fill(Godot.Variant)

  • Array.GetEnumerator()

  • Array.GetSliceRange(int, int, int, bool)

  • Array.IndexOf(Godot.Variant)

  • Array.IndexOf(Godot.Variant, int)

  • Array.Insert(int, Godot.Variant)

  • Array.LastIndexOf(Godot.Variant)

  • Array.LastIndexOf(Godot.Variant, int)

  • Array.MakeReadOnly()

  • Array.Max()

  • Array.Min()

  • Array.PickRandom()

  • Array.RecursiveEqual(Godot.Collections.Array)

  • Array.Remove(Godot.Variant)

  • Array.RemoveAt(int)

  • Array.Resize(int)

  • Array.Reverse()

  • Array.Shuffle()

  • Array.Slice(int)

  • Array.Slice(int, int)

  • Array.Sort()

  • Array.ToString()

  • 当然,以下是将这些Godot.Collections.Array的方法写为Markdown文件,每个方法使用二级标题(##)的格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# Godot.Collections.Array 方法

## Array()

- 创建一个新的空数组。

## Array(Godot.Variant[])

-`Godot.Variant`数组创建一个新的数组。

## Array(System.Collections.Generic.IEnumerable<Godot.Variant>)

- 从实现了`IEnumerable<Godot.Variant>`的集合创建一个新的数组。

## Array(System.ReadOnlySpan<Godot.GodotObject>)

-`ReadOnlySpan<Godot.GodotObject>`创建一个新的数组。

## Array(System.Span<Godot.NodePath>)

-`Span<Godot.NodePath>`创建一个新的数组。

## Array(System.Span<Godot.Rid>)

-`Span<Godot.Rid>`创建一个新的数组。

## Array(System.Span<Godot.StringName>)

-`Span<Godot.StringName>`创建一个新的数组。

## Add(Godot.Variant value)

- 向数组添加一个元素。

## BinarySearch(Godot.Variant value)

- 搜索数组中元素的索引,使用二分查找算法(需要数组已排序)。

## BinarySearch(int index, int length, Godot.Variant value)

- 在指定范围内搜索数组中元素的索引,使用二分查找算法(需要数组已排序)。

## Clear()

- 清除数组中的所有元素。

## Contains(Godot.Variant value)

- 检查数组中是否包含指定的元素。

## CopyTo(Godot.Variant[] array, int arrayIndex)

- 将数组中的元素复制到另一个`Variant`数组中。

## Dispose()

- 释放数组占用的资源(通常不需要手动调用)。

## Dispose(bool disposing)

- 释放数组占用的资源,并指定是否也释放托管对象(通常不需要手动调用)。

## Duplicate(bool deep = false)

- 复制数组并返回新数组(可选参数决定是否深复制)。

## Fill(Godot.Variant value)

- 使用指定的值填充整个数组。

## GetEnumerator()

- 获取数组的枚举器,用于遍历数组中的元素。

## GetSliceRange(int begin, int end, int step = 1, bool deep = false)

- 获取数组的切片(子数组),具有可选的步长和是否包含边界的选项。

## IndexOf(Godot.Variant value)

- 获取指定元素在数组中的索引。

## IndexOf(Godot.Variant value, int startIndex)

- 从指定索引开始搜索元素并返回其索引。

## Insert(int index, Godot.Variant value)

- 在指定索引处插入一个元素。

## LastIndexOf(Godot.Variant value)

- 获取指定元素在数组中最后一次出现的索引。

## LastIndexOf(Godot.Variant value, int startIndex)

- 从指定索引开始向后搜索元素并返回其最后一次出现的索引。

## Max()

- 返回数组中的最大值。

## Min()

- 返回数组中的最小值。

## PickRandom()

- 从数组中随机选择一个元素并返回。

## RecursiveEqual(Godot.Collections.Array other)

- 递归地比较两个数组是否相等(包括子数组和嵌套数组)。

## Remove(Godot.Variant value)

- 从数组中移除指定的元素。

## RemoveAt(int index)

- 移除指定索引处的元素。

## Resize(int size)

- 调整数组的大小。

## Reverse()

- 反转数组中的元素顺序。

## Shuffle()

- 打乱数组中的元素顺序。

## Slice(int begin)

- 返回从指定索引开始的数组的切片(子数组)。

## Slice(int begin, int end)

- 返回从指定开始索引到结束索引(不包含结束索引)的数组的切片(子数组)。

## Sort()

- 对数组中的元素进行排序。

## ToString()

- 将数组转换为字符串表示形式。

## Count

- 获取数组的长度(元素数量)。

## IsEmpty

- 检查数组是否为空(没有元素)。

## this[int index]

- 获取或设置指定索引处的元素值(索引器属性)。

---

请注意,一些方法和属性(如`Count``IsEmpty`和索引器