调度器(scheduler)

本文介绍了游戏开发中调度器的设计原理与实现方法。调度器用于提供定时事件和调用服务,与事件监听器相似但无需手动触发。文章详细解释了如何通过封装类来实现调度器,并提出了一种优化方案,即按回调时间排序以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调度器(schedule)为游戏提供定时事件和定时调用服务。

调度器(schedule)的功能和事件监听器(eventlistener)的功能有点类似:都是在特定情况下调用某个事先准备好的回调函数。

不同之处在于:事件监听器需要通过手动触发(Trigger)来调用这个准备好的回调函数,而调度器是需要等到游戏运行了一个时间段(delta_time)后来调用这个回调函数

一般会把调度器封装成一个类:

一、需要一个注册回调函数的接口,这个接口的参数可能包括1:time,指需要运行多久后调用注册好的回调函数2,需要调用的回调函数的相关信息

二、需要定义一个结构体来保存,注册的回调函数的整体信息。可能包括:回调的时机(time),函数本身,需要传递的参数等

三、把上面的结构体保存在一个容器中,然后在一个update中遍历这个容器,一旦时机到了,立刻调用。

 

大概就是这样了,具体代码我就不贴了。

 补充:

第三步,其实如果把容器里的元素按回调的时间来排序的话,其实并不需要遍历整个容器,每次只要访问容器的首或者尾元素,比较一下是否到可调用的时间点。到了之后再把首或者尾元素删除。这样就能确保容器的首或者尾元素每次都是最先要调用的回调函数。而不必遍历整个容器。

转载于:https://www.cnblogs.com/dongerlei/p/5382863.html

### 学习率调度器的用法与配置 学习率调度器Scheduler)是深度学习训练过程中的重要工具之一,其主要功能在于动态调整优化器的学习率,从而提升模型的收敛速度、稳定性以及最终性能。以下是关于如何使用和配置学习率调度器的具体说明。 #### 1. 配置基本参数 在 PyTorch 中,`StepLR` 是一种常见的学习率调度器,它的核心参数包括 `step_size` 和 `gamma`。 - 参数 `step_size` 控制每隔多少个 epoch 调整一次学习率[^4]。 - 参数 `gamma` 则定义了每次调整时学习率的衰减比例。 例如,在初始化 `StepLR` 调度器时可以这样设置: ```python import torch.optim as optim optimizer = optim.SGD(model.parameters(), lr=0.01) scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.8) ``` 上述代码表示每经过 20 个 epoch 后,当前学习率将以 0.8 的倍数递减。 --- #### 2. 动态更新学习率 为了使学习率随训练进程变化,需在每个 epoch 结束后调用调度器的 `.step()` 方法来触发学习率的变化: ```python for epoch in range(num_epochs): train_model() # 训练模型逻辑 validate_model() # 验证模型逻辑 scheduler.step() # 更新学习率 ``` 通过这种方式,可以在不同阶段自动调节学习率,满足不同的训练需求[^2]。 --- #### 3. 更复杂的调度策略 除了简单的步进式调度外,PyTorch 还提供了其他多种类型的调度器以适应更多场景的需求。下面列举几种常用的方法及其特点: ##### (1) **ExponentialLR** 指数方式降低学习率,适合希望平滑减少学习率的情况。 ```python scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9) ``` 这里 `gamma` 定义了每次迭代后的学习率缩放因子。 ##### (2) **ReduceLROnPlateau** 基于验证指标的表现决定是否降低学习率,适用于需要监控特定条件下的情况。 ```python scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10) ``` 此方法会在验证损失不再下降的情况下逐渐缩小学习率。 ##### (3) **CosineAnnealingLR** 采用余弦退火的方式改变学习率,有助于探索更大的超参空间。 ```python scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50) ``` 其中 `T_max` 表示周期长度。 --- #### 4. 自定义调度器 如果内置选项无法完全匹配具体应用场景,则可以通过继承 `torch.optim.lr_scheduler._LRScheduler` 类来自定义调度行为。例如: ```python class CustomScheduler(optim.lr_scheduler._LRScheduler): def __init__(self, optimizer, last_epoch=-1): super(CustomScheduler, self).__init__(optimizer, last_epoch) def get_lr(self): return [base_lr * math.pow(0.95, self.last_epoch) for base_lr in self.base_lrs] # 初始化自定义调度器 custom_scheduler = CustomScheduler(optimizer) ``` 这种灵活性允许开发者针对特殊任务设计专属方案[^3]。 --- ### 总结 合理运用学习率调度器能够显著改善深度学习模型的训练表现。无论是基础的固定间隔调整还是高级的动态响应机制,都应依据实际项目背景选取最合适的策略[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值