欢迎来到皮皮网网首页

【砸地鼠源码】【rpm源码解析】【arrayblockqueue源码阅读】gas源码分析

来源:快递聚合平台源码 时间:2024-11-25 00:31:25

1.UnrealGAS——GameplayTag(玩法标签)
2.死磕以太坊源码分析之挖矿流程
3.以太坊GasLimit的码分计算方法
4.UE记录GAS中AttributeSet初始化流程
5.虚幻四Gameplay Ability System入门(5)-冲刺奔跑和深入Attribute
6.虚幻插件GAS分析09 TargetData、TargetActor和WorldReticle

gas源码分析

UnrealGAS——GameplayTag(玩法标签)

       GameplayTag(玩法标签):玩法标签是码分一种层级命名,由GameplayTagManager进行注册与管理,码分形式为Parent.Child.Grandchild...。码分这些标签被用于明确描述对象的码分状态。例如,码分砸地鼠源码当一个角色处于击晕状态时,码分我们可以为其贴上State.Debuff.Stun的码分玩法标签。

       FGameplayTag:此标签在UE中的码分类名为FGameplayTag,由FGameplayTagContainer进行存储与管理。码分通过搜索源码,码分FGameplayTag的码分注释说明了它的表示形式与功能。

       FGameplayTagContainer:此容器用于存储FGameplayTag集合。码分它与FGameplayTag共同受UGameplayTagsManager管理。码分

       UGameplayTagsManager:该管理者通过GameplayTagNodeMap成员,码分将FGameplayTag存储在FGameplayTagNode节点中,并通过构造节点树来管理不同的玩法标签。

       FGameplayTagNode:此节点结构展示了UGameplayTagsManager如何组织并管理玩法标签。

       UGameplayTagsManager::ShouldImportTagsFromINI:这个函数涉及到UGameplayTagsSettings对象,因此我们接下来会探讨UGameplayTagsSettings类。

       UGameplayTagsSettings:这个类继承自UGameplayTagsList。从源码解释中,我们可以看出其主要功能与用途。

死磕以太坊源码分析之挖矿流程

       以太坊的挖矿流程主要由miner包负责,它通过miner对象来管理操作,内部使用worker对象实现整体功能。miner决定矿工的启动与停止,并能设置矿工地址以获取奖励。

       worker.go文件中的worker对象负责挖矿的细节,其工作流程包含四个主要循环,通过多个channel完成任务调度、新任务提交、任务结果处理等。

       新任务由newWorkLoop循环产生,此过程中,rpm源码解析resubmitAdjustCh与resubmitIntervalCh两个辅助信号用于调整计时器的频率,resubmitAdjustCh根据历史情况计算合理的间隔时间,而resubmitIntervalCh则允许外部实时修改间隔时间。

       mainLoop循环则负责提交新任务并处理结果。TaskLoop提交任务,resultLoop则在新块成功生成后执行相关操作。

       启动挖矿的参数设置定义在cmd/utils/flags.go文件中,提供了一系列选项,如开启自动挖矿、设置并行PoW计算的协程数、配置挖矿通知、控制区块验证、设置Gas价格、确定Gas上限、指定挖矿奖励账户、自定义区块头额外数据、设置重新挖矿间隔等。

       可以采用多种方式启动挖矿,例如通过控制台命令、RPC接口等。设置参数时,可参考官方文档或相关指南进行调整。

       分析代码从miner.go的New函数开始,初始化canStart状态以控制挖矿流程。若Downloader模块正在同步或已完成,则启动挖矿,否则停止。随后进入mainLoop处理startCh,清除旧任务、提交新任务。

       生成新任务通过newWorkCh完成,进入CommitNewWork函数,其中包含组装header、初始化共识字段、arrayblockqueue源码阅读创建挖矿环境、添加叔块等步骤。添加叔块时进行校验,确保区块符合规定。若条件允许,任务会提交空块、填充交易,并执行交易以生成最终块。

       交易执行成功后,块数据被存入数据库,并广播至网络。若执行出错,则回滚至上一个快照状态。成功出块后,新区块被验证、确认,并纳入未确认区块集中。若新区块稳定,将正式插入链中。

       整个挖矿流程相对简单,主要由四个循环相互协作完成从挖矿启动到新任务生成、任务提交、成功出块的全过程。共识处理细节将在后续文章中详细阐述。

以太坊GasLimit的计算方法

       以太坊黄皮书上说的gasLimit的计算方法:

        gasLimit = Gtransaction + Gtxdatanonzero × dataByteLength

        需要注意的是这只是静态的gas消耗,实际gas消耗还需要加上合约执行的开销。

        计算 IntrinsicGas的源码位置 core/state_transition.go

        相关源码位置:internal/ethapi/api.go

        EstimateGas 采用二分查找法获取要评估交易的gas值。二分查找的下限是 param.TxGas , 如果 args 参数指定 Gas 大于 param.Gas ,那么二分查找的上限就是 args.Gas ,否则以当前pending块的block gas limit(后面简称BGL)作为二分查找的上限。 doCall 函数模拟智能合约的执行,经过多次尝试找到智能合约能够成功运行的最佳gas值。

        由于二分查找的上限和BGL有关,而BGL和不是ygbook修复源码固定不变的,因此每次gas评估的结果不一定都是相同的,可能每个区块周期就会变动一次。

        在实际进行gas评估的时候,可能会出现类似下面的错误

        该错误出现的最可能是合约执行中出错。

        How do you calculate gas limit for transaction with data in Ethereum?

UE记录GAS中AttributeSet初始化流程

       本文旨在清晰阐述AttributeSet初始化流程,并附带部分源码解析。若需跟随操作,请确保准备了自定义的AttributeSet、ASC以及挂载位置,如Actor、武器或角色等,才能执行初始化。

       FAttributeMetaData初始化流程:

       创建DataTable,RowStruct设定为AttributeMetaData。添加行,RowName设为[AttributeSet].[Attribute],并保存DataTable。注意,尽管官方及注释使用UAttributeSet,但此处的AttributeSet指属性集名称,而非类名。Attribute为属性集中的属性,如Health。

       在Character蓝图中,选中ASC,在细节面板的Attribute Test栏下,配置Attributes为对应的Class,Default String Table为创建的DataTable。

       至此配置完成,运行游戏,即可查看效果。

       读源码流程:

       初始化DataTable逻辑位于ASC的OnRegister函数中,该函数直接调用InitFromMetaDataTable函数。InitFromMetaDataTable函数通过迭代AttributeSet下的docker源码讲解所有属性,处理数值或FGameplayAttributeData类型。

       最终,创建的AttributeSet被缓存至SpawnedAttributes的TArray中。实际缓存的是引用而非对象。

       评价:

       一般,无法配置属性的Level。可通过创建不同初始的AttributeSet来解决,但较为繁琐。使用AttributeSetInitter可简化此过程。

       AttributeSetInitter初始化流程:

       创建UCurveTable,选择Linear插值类型。配置[GroupName].[AttributeSet].[Attribute],并保存。Group为自定义组名,AttributeSet为属性集名称,Attribute为属性名。

       创建并打开UCurveTable,根据配置添加数据。回到代码中,添加初始化UCurveTable的代码。

       配置完成后,运行游戏,即可查看效果。

       深入源码解析:

       在ASC初始化时,OnRegister函数调用FGameplayAbilitiesModule并获取AbilitySystemGlobals。通过接口,获取GlobalAttributeSetDefaultsTableNames内的SoftPath,并加载对应的CurveTable。

       加载完成后,CurveTable被缓存,执行ReloadAttributeDefaults函数。在该函数中,通过SoftPath加载CurveTable,缓存后执行InitAttributeDefaults函数。

       InitAttributeDefaults函数执行AllocAttributeSetInitter,并通过PreloadAttributeSetData加载CurveTable。PreloadAttributeSetData函数分割配置字符串,查找对应数据集和属性,存储于FAttributeSetInitterDiscreteLevels。

       总结:

       AttributeSet初始化流程包括自定义DataTable配置、ASC配置与源码解析。AttributeSetInitter提供简化配置方式,而通过GameplayEffect初始化则提供动态属性修改。整体流程清晰,但需注意配置管理与效率问题。

       评价:流程有效,但配置管理需优化,考虑集中化配置与简化流程。

虚幻四Gameplay Ability System入门(5)-冲刺奔跑和深入Attribute

       在深入探讨虚幻四Gameplay Ability System(GAS)的实现细节前,先分享一段小插曲:我在源码中不慎添加了两句注释,竟导致项目编译失败,面临+错误。这让我意识到GAS的复杂性和严谨性。在这篇文章中,我们将聚焦于实现角色的冲刺奔跑功能,以及对GAS中属性(Attribute)的深入理解。如有疑问,欢迎在评论区提问或私信交流。

       实现冲刺奔跑功能分为以下几个步骤:

       点击shift后激活冲刺技能。

       激活技能后,添加一个Gameplay Effect(GE),以提升角色的移动速度属性。

       在角色的Character.h/cpp中实现一个函数,将移动速度改变的事件绑定到该函数。在该函数中,提高角色Movement Component的移动速度。

       当shift键松开时,发送Gameplay Event以终止冲刺能力。

       接下来,我们创建MoveSpeed属性。

       在AttributeSetBase.h/cpp中添加MoveSpeed属性。此操作已多次执行,假设读者已掌握流程。重要的是了解属性数据结构,查看AttributeSetBase的父类AttributeSet.h。这里展示了属性包含Base Value和Current Value两个浮点值。

       Base Value是永久属性的基础值,而Current Value是临时值。例如,加速奔跑功能实际上改变的是Current Value,当效果结束后,Current Value会恢复至默认值。类似地,增益效果会暂时提升角色的生命值或护甲等属性。

       与Base Value不同,角色生命值的扣减直接作用于Health属性的Base Value。攻击造成的伤害被视为永久改变,除非有其他影响,否则生命值不会改变。

       Base值与Current值的变更方式取决于Gameplay Effect(GE)的Duration Policy。Instant模式改变Base值,Infinite和Has Duration模式改变Current值,因为这些效果有持续时间。当Duration policy包含period时,同样改变Base值,因为Period Duration可视为每个period触发一次的instant。

       创建完毕后,给MoveSpeed属性赋予初始值。

       实现Sprint技能。创建名为GA_Sprint的游戏能力,作为冲刺技能。创建名为GE_Sprint_SpeedUp的游戏效果,负责提高移动速度。在GE_Sprint_SpeedUp中设置技能效果为永久性,提高MoveSpeed属性,同时添加标签Ability.Sprint.SpeedUp。

       在GA_Sprint中,向拥有该技能的角色申请一个GE,并等待带有标签Ability.Sprint.EndAbility的Gameplay Event。接收到该事件后,移除带有Ability.Sprint.SpeedUp标签的GE,然后结束能力。

       在角色蓝图中,添加能力(Give Ability),绑定输入。当shift松开时,向自己发送带有标签Ability.Sprint.EndSprint的Gameplay Event,作为能力中等待的事件。

       实现MoveSpeed属性的改变处理。在CharacterBase.h/cpp中创建一个函数,用于处理移动速度属性值的改变。注意,直接通过GetCharacterMovement()修改移动速度可能导致性能问题。在BeginPlay中将该函数与MoveSpeed的Change Delegate绑定。

       处理属性改变的响应。GAS系统提供了接口,在属性值发生改变前进行预处理。重写PreAttributeChange和PostGameplayEffectExecute方法,以设置属性值的范围。例如,确保生命值始终在0到之间。

       通过本文,我们不仅实现了角色的冲刺奔跑功能,还深入探讨了GAS中的属性机制。希望这些知识能帮助你更好地理解和利用GAS系统,以创造更丰富、更细腻的游戏体验。

虚幻插件GAS分析 TargetData、TargetActor和WorldReticle

       各位好,我是阿棍儿。本篇将深入分析虚幻插件GAS中的TargetData、TargetActor和WorldReticle概念。

       引言

       在GAS中,技能往往涉及指向性和目标过滤。例如,抛射直线或抛物线子弹的技能需要确定方向或参数;范围技能则需筛选目标范围内的Actor。在瞄准阶段,往往需要选中目标表现。例如,抛物线子弹可见轨迹的显示。选中表现与命中表现不同,后者在技能命中目标后通过GameplayCue实现。

       本文将探讨选中表现的解决方案,涉及TargetData、TargetActor和WorldReticle的概念。

       在GAS中,目标选择和表现需求引出了这三者的配合使用。它们通常通过以下步骤协同工作:

       由技能选择目标并在此过程中的表现需求,我们讨论的概念如下:

       由虚幻官方提供的参考资料和GASShooter项目的实例,我们可以学习如何正确应用它们。

       Confirm和Cancel

       在GAS源码中,Confirm和Cancel是常见但含义不明的词汇。它们涉及技能绑定输入时的特定操作。

       通常,Confirm和Cancel用于表示目标选择过程中的确认和取消。它们在技能输入处理中扮演关键角色。例如,在AGSHeroCharacter::BindASCInput中配置输入,以正确接收确认或取消输入。

       此外,Client预测激活技能时的状态,如Confirmed或Rejected,与Confirm和Cancel概念紧密相关。

       核心类TargetActor

       AGameplayAbilityTargetActor类是实现目标选择逻辑的基础。它需要子类实现选择目标的逻辑,通常在确认目标时通过代理将TargetData广播出去。

       在实际应用中,推荐在选择目标逻辑触发时,通过代理将TargetData广播出去。GASShooter项目展示了如何实现枪械子弹和火箭发射器选择目标的逻辑。

       TargetActor生成时可以使用FGameplayTargetDataFilterHandle过滤目标,通过自定义过滤器实现更精细的选择。官方建议复用TargetActor以提高效率。

       TargetData

       FGameplayAbilityTargetData结构体定义了数据访问方法,但未定义数据本身。GAS提供了常见情况适用的子结构体。广播TargetData时,应使用FGameplayAbilityTargetDataHandle实例。

       在GASShooter项目中,展示了如何正确封装和广播TargetData。

       WorldReticle

       AGameplayAbilityWorldReticle类实现选择目标时的表现,如准星指示。其主要功能在FaceTowardSource函数中。

       WorldReticle主要用于表现,逻辑应集中在TargetActor上。GASShooter的实例展示了如何实现单目标准星的自定义。