游戏AI的创造思路-技术基础-行为树

行为树源自于游戏,但又不单单局限在游戏中,现代的行为树为游戏提供了一套快速简洁的控制NPC/AI的方法。所以本篇来讲讲行为树这个老祖宗~~~~

目录

1. 行为树的定义

2. 发展历史

2.1. 起源与早期发展

2.2. 关键节点与重要进展

2.3. 当前现状与未来

3. 行为树用到的“公式”和函数

3.1. 节点类型与逻辑判断

3.2. 概率选择(Random Selector)

3.3. 权重计算(在某些扩展应用中)

3.4. 状态管理与转换

3.5. 性能优化与算法选择

3.6. 行为树的表示

4. 行为树的运行原理

4.1. 行为树的运行原理

4.2. Python代码实现

5. 行为树的优缺点和解决方法

5.1. 行为树的优点

5.2. 行为树的主要缺点和解决方法

5.2.1. 性能消耗

5.2.2. 灵活性不足

5.2.3. 调试困难

5.2.4. 设计复杂度高

6. 行为树的运用实例

6.1. 行为树在《光环》中的应用

6.1.1. 结构设计

6.1.2. NPC行为定义

6.1.3. 条件与决策

6.1.4. 灵活性与可扩展性

6.2. 《光环》中行为树的一种可能的实现方法


1. 行为树的定义

行为树(Behavior Tree, BT)是一种用于表示和执行智能体(如游戏中的角色)行为的图形化建模语言。

它由节点组成,这些节点按照树状结构排列,每个节点代表一个行为或决策。

行为树通过遍历树结构,根据节点的类型和状态来执行相应的行为或决策逻辑。

2. 发展历史

行为树(Behavior Tree,简称BT)的发展历程可以追溯到其在计算机科学、机器人学、控制系统和电子游戏等领域的应用与发展。以下是对行为树发展历程的详细介绍,包括关键节点:

2.1. 起源与早期发展

起源
行为树最初起源于电脑游戏产业,作为一种模拟非玩家角色(NPC)行为的强大工具。它们被设计用于以模块化的方式描述有限任务集之间的切换,从而创建复杂的AI行为。

早期发展

  • 概念提出:行为树的概念最初由某些研究者提出,用于解决状态机(FSM)在复杂系统中维护困难的问题。行为树通过树状结构表示AI的行为决策,使得系统更加模块化和易于管理。
  • 关键思想:行为树采用节点描述行为逻辑,节点之间通过父子关系连接,形成一棵树状结构。不同类型的节点(如组合节点、装饰器节点、条件节点、行为节点)在执行过程中返回不同的状态(成功、失败、运行中),从而控制整个行为树的执行流程。

2.2. 关键节点与重要进展

行为树理论的完善

  • 随着研究的深入,行为树的理论逐渐完善。研究者们提出了多种类型的节点和组合方式,如选择节点、顺序节点、并行节点等,以应对不同的行为决策需求。
  • 行为树的执行逻辑和状态管理机制也得到了进一步的优化和改进。

在游戏产业的应用与推广

  • 行为树因其直观、易于设计和调试的特点,在游戏产业中得到了广泛的应用。许多备受瞩目的电子游戏,如《光晕》、《生化奇兵》和《孢子》等,都采用了行为树来模拟NPC的行为。
  • 游戏开发者社区对行为树的支持和推广,进一步加速了其行为树技术的发展和普及。

在机器人学和控制系统中的应用

  • 近年来,行为树逐渐扩展到机器人学和控制系统领域。研究者们发现,行为树在描述复杂机器人的行为决策方面具有显著优势。
  • 行为树被用于控制无人机、复杂机器人以及多机器人系统的多任务执行,展现出强大的灵活性和可扩展性。

事件驱动行为树的提出

  • 为了解决经典行为树在可伸缩性方面的一些问题,研究者们提出了事件驱动行为树的概念。事件驱动行为树通过引入事件处理机制,使得行为树能够更灵活地响应外部事件和中断。
  • 事件驱动行为树的提出标志着行为树技术进入了一个新的发展阶段,其在复杂系统和实时控制系统中的应用前景更加广阔。

2.3. 当前现状与未来

当前现状

  • 行为树已经成为一种成熟且广泛应用的AI行为决策工具。在游戏开发、机器人学、控制系统等多个领域都能看到其行为树的身影。
  • 随着技术的不断发展,行为树的性能和效率也在不断提高,以满足更复杂和实时性要求更高的应用场景。

未来

  • 行为树技术将继续在各个领域得到深入应用和发展。随着人工智能和机器人技术的不断进步,行为树作为一种重要的行为决策工具,其重要性将日益凸显。
  • 未来,我们可以期待看到更多创新性的行为树变体和应用案例的出现,以应对更加复杂和多样化的AI行为决策需求。

3. 行为树用到的“公式”和函数

行为树算法(Behavior Tree, BT)是一种用于控制任务执行流程的分层节点树模型,它广泛应用于计算机科学、机器人、控制系统和视频游戏等领域。行为树通过模块化的方式描述任务集之间的切换,使得复杂任务的实现变得简单且易于管理。然而,行为树算法本身并不直接依赖于复杂的数学公式或函数,而是更多地依赖于逻辑判断和状态管理。以下是对行为树算法中可能涉及的一些数学元素和函数概念的详细介绍:

3.1. 节点类型与逻辑判断

行为树由不同类型的节点组成,包括根节点、复合节点(如Selector、Sequence、Parallel等)和叶子节点(条件节点和动作节点)。这些节点在执行过程中,会根据内部逻辑或外部条件进行判断,从而决定下一步的执行路径。

  • 条件节点:通常用于判断某个条件是否满足,返回布尔值(true或false)。条件节点的内部实现可能涉及简单的比较运算(如==!=<>等),但这些并不构成复杂的数学公式。
  • 动作节点:执行具体的行为或操作,并返回执行结果(通常是成功或失败)。动作节点的执行可能依赖于一些参数或变量,但这些参数的处理通常也是基于简单的赋值或条件判断。

3.2. 概率选择(Random Selector)

在Random Selector节点中,子节点的选择是随机的。这通常通过生成随机数并与子节点关联的权重进行比较来实现。这里涉及的数学函数主要是随机数生成函数(如C++中的rand()函数或特定库中的随机数生成器)。虽然随机数生成背后可能有复杂的算法支持,但在行为树的上下文中,这些算法被抽象为简单的函数调用。

3.3. 权重计算(在某些扩展应用中)

在一些高级应用中,行为树节点可能会被赋予权重,以表示其优先级或重要性。权重的计算可能涉及简单的算术运算(如加法、乘法),但这些运算并不构成复杂的数学公式。权重的使用通常是在选择节点时进行的,通过比较权重来决定哪个节点应该被执行。

3.4. 状态管理与转换

行为树通过节点的状态(如成功、失败、运行中)来管理任务的执行流程。状态之间的转换通常基于节点的执行结果和逻辑判断。虽然状态管理本身不涉及复杂的数学公式,但它要求开发者对任务执行流程有清晰的理解,并能够正确地设计节点之间的逻辑关系。

3.5. 性能优化与算法选择

在行为树的实现过程中,可能会考虑性能优化的问题。例如,通过减少不必要的节点遍历、优化条件判断的逻辑等方式来提高执行效率。这些优化措施可能涉及到算法的选择和应用,但通常不会涉及复杂的数学公式或函数。

3.6. 行为树的表示

行为树算法本身并不直接依赖于复杂的数学公式或函数。它更多地是通过逻辑判断和状态管理来实现任务的控制和执行。

然而,在行为树的实现和优化过程中,可能会涉及一些简单的数学运算和算法选择。

对于想要深入了解行为树算法的开发者来说,掌握基本的编程逻辑和算法知识是非常重要的。

虽然行为树的核心并不在于数学公式,但节点中确实会用到一些条件函数或行为函数来决定节点的执行。

这些函数通常是根据智能体的状态或环境参数来定义的,例如:

def is_enemy_in_range(entity, enemy):  # 检查敌人是否在实体的攻击范围内  return distance(entity.position, enemy.position) < entity.attack_range  def attack(entity, enemy):  # 实体攻击敌人的行为  print(f"{entity.name} is attacking {enemy.name}!")

在行为树中,这些函数会被用作装饰器节点或任务节点的条件或行为。

4. 行为树的运行原理

行为树(Behavior Tree, BT)的运行原理基于树状结构的遍历和执行。

行为树由不同类型的节点组成,包括任务节点(Task Nodes)、装饰器节点(Decorator Nodes)和组合节点(Composite Nodes)。

每种节点类型在执行时都有其特定的行为或决策逻辑。

4.1. 行为树的运行原理

  1. 根节点开始:行为树的执行从根节点开始。

  2. 节点遍历:根据节点的类型,行为树遍历器(或称为“执行器”)决定如何遍历子节点。

    • 对于组合节点,遍历器会根据其特定的逻辑(如顺序执行、选择执行等)遍历其子节点。
    • 对于装饰器节点,遍历器会先执行装饰器节点的逻辑,然后根据结果决定是否遍历其子节点。
    • 对于任务节点,遍历器会直接执行任务节点的行为,并返回执行结果。
  3. 状态返回:每个节点在执行完毕后都会返回一个状态,通常包括成功(SUCCESS)、失败(FAILURE)和运行中(RUNNING)。这些状态会被传递给父节点,并最终影响整个行为树的执行结果。

  4. 递归执行:行为树的执行是一个递归过程。遍历器会递归地遍历和执行每个节点,直到达到叶子节点或满足特定的终止条件。

4.2. Python代码实现

下面是一个简单的Python代码示例,实现了一个完整的行为树构建并进行简单行为决策的过程。

# 定义行为树节点的基类  
class BTNode:  def tick(self, context):  raise NotImplementedError  # 定义任务节点  
class ActionNode(BTNode):  def __init__(self, name, action):  self.name = name  self.action = action  def tick(self, context):  print(f"Executing action: {self.name}")  self.action(context)  return "SUCCESS"  # 定义装饰器节点  
class ConditionNode(BTNode):  def __init__(self, name, condition):  self.name = name  self.condition = condition  self.child = None  def tick(self, context):  print(f"Checking condition: {self.name}")  if self.condition(context):  if self.child:  return self.child.tick(context)  return "SUCCESS"  else:  return "FAILURE"  # 定义组合节点(选择器)  
class SelectorNode(BTNode):  def __init__(self, name):  self.name = name  self.children = []  def tick(self, context):  print(f"Executing selector: {self.name}")  for child in self.children:  result = child.tick(context)  if result == "SUCCESS":  return "SUCCESS"  return "FAILURE"  # 定义上下文环境  
class Context:  def __init__(self):  self.has_enemy = True  self.is_hungry = False  # 定义具体的行为和条件函数  
def attack_enemy(context):  print("Attacking enemy!")  def is_enemy_present(context):  return context.has_enemy  def eat_food(context):  print("Eating food!")  def is_hungry(context):  return context.is_hungry  # 构建行为树  
root = SelectorNode("Root")  attack_sequence = SelectorNode("AttackSequence")  
attack_sequence.children.append(ConditionNode("IsEnemyPresent", is_enemy_present).set_child(ActionNode("AttackEnemy", attack_enemy)))  eat_sequence = SelectorNode("EatSequence")  
eat_sequence.children.append(ConditionNode("IsHungry", is_hungry).set_child(ActionNode("EatFood", eat_food)))  root.children.append(attack_sequence)  
root.children.append(eat_sequence)  # 执行行为树  
context = Context()  
result = root.tick(context)  
print(f"Behavior tree execution result: {result}")

这个例子中我们定义了一个简单的行为树,它包括两个选择器节点(AttackSequence 和 EatSequence),每个选择器节点下都有一个条件节点和一个动作节点。

行为树从根节点开始执行,并根据条件节点的结果选择执行相应的动作节点。

最后,打印出行为树的执行结果。

5. 行为树的优缺点和解决方法

5.1. 行为树的优点

优点

  1. 模块化:行为树的结构使得行为可以很容易地被添加、修改和重用。
  2. 可扩展性:通过添加新的节点类型或组合现有节点,可以处理复杂的决策逻辑。
  3. 可视化:行为树的可视化表示使得开发者能够更容易地理解和调试AI行为。

5.2. 行为树的主要缺点和解决方法

5.2.1. 性能消耗

问题描述:行为树在每一帧都会从根节点开始执行,这可能导致相对于状态机(FSM)消耗更多的CPU资源。特别是当行为树结构复杂、节点众多时,性能问题尤为突出。

解决方法

  • 优化树结构:通过简化行为树结构,减少不必要的节点和层次,可以降低性能消耗。
  • 使用记忆节点:对于某些控制流节点(如Sequence和Fallback节点),可以实现记忆功能,即缓存子节点的执行结果,避免重复执行相同的子节点。
  • 并行处理:利用并行计算技术,同时处理多个子节点的执行,提高整体执行效率。

5.2.2. 灵活性不足

问题描述:行为树的设计依赖于固定的架构,不够灵活。在设计时做出的选择可能不是最优的,且每次执行都需要经过大量的逻辑判断。

解决方法

  • 动态调整:设计允许在运行时动态调整行为树结构的机制,以应对不同的情况和需求。
  • 引入其他算法:结合其他算法(如GOAP,目标导向型行动计划)来弥补行为树在灵活性方面的不足。
  • 模块化设计:将行为树拆分为多个模块,每个模块负责特定的功能,通过模块的组合和替换来实现不同的行为逻辑。

5.2.3. 调试困难

问题描述:行为树的调试相对于状态机来说可能更为复杂,因为行为树的执行流程更加动态和复杂。

解决方法

  • 可视化工具:使用行为树的可视化工具来构建和调试行为树,可以直观地看到节点的执行状态和流程变化。
  • 日志记录:在行为树的执行过程中记录详细的日志信息,包括节点的执行结果、状态变化等,以便于调试和问题分析。
  • 单元测试:对行为树中的关键节点和逻辑进行单元测试,确保它们的正确性和稳定性。

5.2.4. 设计复杂度高

问题描述:设计一个高效且合理的行为树需要较高的设计复杂度和对任务逻辑的深入理解。

解决方法

  • 文档和设计规范:制定详细的设计文档和规范,明确行为树的设计目标和原则,降低设计复杂度。
  • 经验分享:借鉴其他成功项目中的行为树设计经验,通过交流和分享来提高设计水平。
  • 迭代优化:在项目开发过程中不断迭代和优化行为树的设计,根据实际情况进行调整和改进。

6. 行为树的运用实例

6.1. 行为树在《光环》中的应用

《光环》系列游戏是一款知名的科幻第一人称射击游戏,由微软旗下的343 Industries开发。

6.1.1. 结构设计

在《光环》中,行为树的结构被精心设计以应对复杂的游戏场景。行为树可能包含多个层级,每个层级处理不同级别的决策。例如,顶层节点可能负责选择当前的主要行为(如进攻、防御、撤退等),而子节点则负责执行具体的动作(如移动、射击、使用道具等)。

6.1.2. NPC行为定义

通过行为树,开发者可以为NPC定义一系列行为,这些行为可以根据游戏状态和NPC状态动态调整。例如:

  • 进攻行为:当NPC检测到敌人时,可能会触发进攻行为。进攻行为可能包括移动到攻击位置、瞄准敌人、射击等动作。
  • 防御行为:当NPC受到威胁或生命值较低时,可能会采取防御行为,如寻找掩体、躲避攻击等。
  • 协助玩家行为:在某些情况下,NPC可能会协助玩家完成任务,如跟随玩家、提供火力支援等。
  • 撤退行为:当NPC无法有效对抗敌人或生命值极低时,可能会选择撤退以保存实力。

6.1.3. 条件与决策

行为树中的条件节点用于评估当前游戏状态和NPC状态,以决定是否执行某个动作。

例如,一个条件节点可能检查NPC是否能看到敌人,如果能看到,则继续执行进攻行为;

如果看不到,则可能执行搜索或巡逻行为。

6.1.4. 灵活性与可扩展性

行为树的设计使得NPC行为具有高度的灵活性和可扩展性。开发者可以轻松添加、删除或修改节点,以适应游戏需求的变化。

此外,行为树还支持模块化设计,不同的行为可以封装成独立的子树,便于复用和维护。

6.2. 《光环》中行为树的一种可能的实现方法

《光环》游戏中使用行为树算法控制NPC行为是一种高效且灵活的方法。通过行为树,开发者可以定义复杂的NPC行为逻辑,并根据游戏状态动态调整NPC的行为。尽管存在性能开销和设计复杂度的挑战,但行为树的优点使得它在游戏AI领域得到了广泛应用。

需要注意的是,由于《光环》游戏的具体实现细节并未完全公开,以上信息主要基于行为树算法的一般原理和游戏AI领域的通用知识进行推断和总结。

尽管《光环》游戏本身并没有公开其具体的AI实现细节,可以肯定的是至少使用了行为树算法来控制NPC(非玩家角色)的行为。

我们可以根据行为树算法的一般原理来构想一个在《光环》游戏中可能的应用实例。

在《光环》游戏中,NPC的行为可能非常复杂,包括策略制定、进攻、防御、协助玩家、指挥撤退以及使用各种道具。行为树算法可以很好地组织和管理这些行为,使得NPC能够根据当前的游戏环境和玩家的行为做出合理的反应。

《光环》游戏中使用行为树算法控制NPC(非玩家角色)行为是一个复杂的系统,它允许游戏开发者以灵活且可维护的方式定义NPC在各种游戏情境下的反应和行为。以下是对《光环》游戏中使用行为树算法控制NPC行为的详细介绍:

以下是一个简化的行为树结构,用于控制《光环》游戏中的NPC行为:

Root  
├── Selector (Priority Selector)  
│   ├── Strategy (制定策略)  
│   ├── Attack (进攻)  
│   ├── Defend (防御)  
│   ├── AssistPlayer (协助玩家)  
│   └── Retreat (指挥撤退)  
└── Sequence (执行一系列动作)  ├── UseItem (使用道具)  │   ├── UseGrenade (使用手雷)  │   ├── UseMedikit (使用医疗包)  │   └── UseStimpack (注射兴奋剂)  └── ... (其他可能的行为)

Python代码实现

完整的Python实现代码,它模拟了《光环》游戏中NPC使用行为树算法来控制其行为。这个实现包含了进攻、防御、协助玩家和撤退等行为的简单逻辑。

import random  # 行为节点类
class BehaviorNode:  def execute(self, context):  pass  #  选择器节点
class SelectorNode(BehaviorNode):  def __init__(self, children):  self.children = children  def execute(self, context):  for child in self.children:  if child.execute(context):  return True  return False  # 序列节点类  
class SequenceNode(BehaviorNode):  def __init__(self, children):  self.children = children  def execute(self, context):  for child in self.children:  if not child.execute(context):  return False  return True  # 行为节点类  
class ActionNode(BehaviorNode):  def __init__(self, action):  self.action = action  def execute(self, context):  return self.action(context)  # 条件节点类  
class ConditionNode(BehaviorNode):  def __init__(self, condition):  self.condition = condition  def execute(self, context):  return self.condition(context)  # 定义特别条件
# 看到敌人 
def can_see_enemy(context):  return context.get('enemy_visible', False)  # 健康低  
def is_health_low(context):  return context.get('health', 100) < 30  # 玩家靠近  
def player_nearby(context):  return context.get('player_distance', float('inf')) < 10  # 攻击行为  
def attack_action(context):  print("NPC is attacking.")  return True  # 防御行为  
def defend_action(context):  print("NPC is defending.")  return True  # 协助玩家行为  
def assist_player_action(context):  print("NPC is assisting the player.")  return True  # 撤退行为  
def retreat_action(context):  print("NPC is retreating.")  return True  # 策略动作行为 
def strategy_action(context):  # Implement strategy logic  print("NPC is formulating a strategy.")  return True  # 构建行为树
root = SelectorNode([  SequenceNode([  ConditionNode(can_see_enemy),  ActionNode(attack_action)  ]),  SequenceNode([  ConditionNode(is_health_low),  ActionNode(retreat_action)  ]),  SequenceNode([  ConditionNode(player_nearby),  ActionNode(assist_player_action)  ]),  ActionNode(defend_action)  # Fallback behavior  
])  # 执行行为树
context = {  'enemy_visible': True,  'health': 80,  'player_distance': 5  
}  root.execute(context)

在这个实现中,我们定义了四种类型的节点:

  • BehaviorNode(所有节点的基类),
  • SelectorNode(选择器节点,用于从子节点中选择一个执行),
  • SequenceNode(序列节点,用于按顺序执行所有子节点),
  • ActionNode(动作节点,用于执行具体的动作),
  • ConditionNode(条件节点,用于评估某个条件是否满足)。

我们还定义了几个具体的条件和动作,用于模拟NPC的不同行为。

最后,我们创建了一个行为树,并将其与一个包含游戏状态的上下文对象一起执行。

根据上下文中的状态,NPC将执行相应的行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/45571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能大模型讲师培训老师叶梓介绍及多模态大模型原理与实践提纲

培训需要解决的问题 通过本次培训&#xff0c;拓展对多模态AI应用领域的视野&#xff0c;帮助团队聚焦AI赋能创新突破&#xff0c;提升对AI服务的技术认知与理解&#xff0c;更好地助力业务智能化业务建设。 培训时长 1天 培训老师介绍 叶梓&#xff0c;工学博士&#xff0…

python零基础爬虫教程,(实战案例手把手教你Python爬虫教程!)

前言 女朋友看了都能学会的爬虫教学 自己断断续续学习练习了两三年python爬虫&#xff0c;从网上看了无数教程&#xff0c;跟大神们学习了各种神奇的操作&#xff0c;现在虽然没成为大神&#xff0c;但是想通过这篇教程来分享自己学习的爬虫实战案例。 通过本教程&#xff0c;你…

Linux程序替换

前言 上一期对进程的创建、终止、以及等待做了详细的介绍&#xff0c;对于进程控制的内容基本介绍的差不多了&#xff0c;本期来介绍进程控制的最后一个内容即进程的程序替换&#xff01; 本期内容介绍 • 什么是进程的程序替换 • 单进程的程序替换 • 程序替换的基本原理 •…

在 IVS 2024 加密盛会上开拓创新:CESS 引领去中心化云存储和 CD²N 之发展

作为基于区块链的去中心化云存储网络和 CDN 基础设施网络&#xff0c;CESS 在日本年度加密创业大会 IVS 2024 上成为焦点&#xff01;此次活动在历史悠久的京都举办&#xff0c;围绕“跨越边界”这一主题&#xff0c;吸引了超过15,000 名参会者&#xff0c;其中包括 3,000 创始…

SpringCloudAlibaba基础五 Nacos配置中心

一 Nacos配置中心介绍 官方文档&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config Nacos 提供用于存储配置和其他元数据的 key/value 存储&#xff0c;为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos C…

2024 福州市延安中学“拿云杯”复赛试题

回忆版&#xff08;持续更新&#xff09; 目录 答案 答案

风光摄影:相机设置和镜头选择

写在前面 博文内容为《斯科特凯尔比的风光摄影手册》读书笔记整理涉及在风景拍摄中一些相机设置&#xff0c;镜头选择的建议对小白来讲很实用&#xff0c;避免拍摄一些过曝或者过暗的风景照片理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好…

【matlab】周期性信号分析

目录 信号预处理 周期性特征提取方法 频谱分析 傅里叶变换 快速傅里叶变换&#xff08;FFT&#xff09; 周期图法 Welch法 自相关分析 时频分析 基于模型的方法 时间序列分解 应用实例 提取信号的周期性特征是一个在信号处理领域广泛应用的技术&#xff0c;特别是在…

每日一练:奇怪的TTL字段(python实现图片操作实战)

打开图片&#xff0c;只有四种数字&#xff1a;127&#xff0c;191&#xff0c;63&#xff0c;255 最大数字为255&#xff0c;想到进制转换 将其均转换为二进制&#xff1a; 发现只有前2位不一样 想着把每个数的前俩位提取出来&#xff0c;组成新的二进制&#xff0c;然后每…

做3D渲染,选择什么显卡好?

对于设计行业的小伙伴来说&#xff0c;电脑配置的优劣是个尤为关键的要素&#xff0c;特别是显卡&#xff0c;对于很多人而言&#xff0c;如何选择一张最适合的 3D 渲染显卡确实一大难关&#xff01; 在目前市场上&#xff0c;主流的显卡分别是 AMD 显卡和 NVIDIA 显卡&#x…

Java基础面试题大全

Java基础 语法基础 aab 和 ab 操作隐式的将操作的结果类型强制转换成持有结果的类型&#xff0c;而不会 比如对byte&#xff0c;short&#xff0c;int类型的操作&#xff0c;会先将他们提升到int类型&#xff0c;然后在执行操作。所以比如我定义了两个byte类型的a和b&#x…

KEIL 5项目中源文件图标带有雪花(四叶草)消除办法

今天在使用KEIL 5写STM32程序的时候&#xff0c;出现了一个错误&#xff1a; Error: L6218E: Undefined symbol test_for_diaodu (referred from main.o). 具体表现为&#xff0c;不管我把自己写的一个my.c里的什么函数或者变量名&#xff0c;即使在main.c中声明、引用了&#…

PCL从理解到应用【04】Octree 原理分析 | 案例分析 | 代码实现

前言 Octree 作为一种高效的空间分割数据结构&#xff0c;具有重要的应用价值。 本文将深入分析 Octree 的原理&#xff0c;通过多个实际案例帮助读者全面理解其功能和应用&#xff0c;包括最近邻搜索、半径搜索、盒子搜索以及点云压缩&#xff08;体素化&#xff09;。 特性…

搞懂负载均衡,零基础也可以!

本文作者&#xff1a;程序员鱼皮 免费编程学习 - 编程导航网&#xff1a;https://www.code-nav.cn 大家好&#xff0c;我是鱼皮。 周末在家写代码&#xff0c;无意中跟朋友提了下 LB&#xff0c;还说 LB 好的呱呱叫。 朋友笑了笑&#xff0c;问我 LB 是谁&#xff1f; 我解释…

加密软件|让数据传输更安全

加密软件在当今数字化时代扮演着至关重要的角色&#xff0c;它们通过先进的加密算法和技术&#xff0c;确保数据在存储、传输和分享过程中的安全性&#xff0c;从而保护个人隐私和企业机密。一、加密软件的基本作用数据加密&#xff1a;加密软件通过应用复杂的加密算法&#xf…

Python转换PDF为PowerPoint演示文件

PDF文件以其跨平台兼容性和版面固定性成为了分享和存储文档资料的首选格式。然而&#xff0c;在需要进行生动、互动性强的演示时&#xff0c;PDF的静态特性便难以满足个性化演示需求。将PDF文件转换为PowerPoint演示文稿可以解决这一问题。PowerPoint不仅提供了丰富的动画和过渡…

网关设备BL122实现Modbus RTU/TCP转Profinet协议

Modbus与Profinet是两种广泛应用于工业自动化领域的通信协议&#xff1a;Modbus因其简单性和兼容性&#xff0c;在许多工业设备中得到广泛应用&#xff1b;而Profinet提供了高速、高精度的通信能力&#xff0c;适合于复杂控制系统和实时应用&#xff0c;但两者之间的差异导致了…

uniapp easycom组件冲突

提示信息 ​easycom组件冲突&#xff1a;[/components/uni-icons/uni-icons.vue,/uni_modules/uni-icons/components/uni-icons/uni-icons.vue]​ 问题描述 老项目&#xff0c;在uniapp插件商城导入了一个新的uniapp官方开发的组件》uni-data-picker 数据驱动的picker选择器 …

测试人必会 K8S 操作之 Dashboard

在云计算和微服务架构的时代&#xff0c;Kubernetes (K8S) 已成为管理容器化应用的标准。然而&#xff0c;对于许多新手来说&#xff0c;K8S 的操作和管理常常显得复杂而神秘。特别是&#xff0c;当你第一次接触 K8S Dashboard 时&#xff0c;你是否也感到有些无所适从&#xf…

【Python】一文详细向您介绍 scipy.cluster.vq.kmeans() 的原理、常见用法和使用场景举例等

【Python】一文详细向您介绍 scipy.cluster.vq.kmeans() 的原理、常见用法和使用场景举例等 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; …