Unity游戏开发 帧同步战斗框架 框架篇

【Unity学习笔记】ECS开发框架和帧同步 近期看了守望先锋团队关于在2017GDC发布的守望先锋的ECS开发框架和帧同步的演讲,对ECS实现的帧同步架构十分着迷。因此打算着手实现一个ECS下的帧同步的游戏Demo。。在学习了几天源码之后稍微对ECS有了一定的理解。不过这个项目的架构不是很完善,有些地方看的还是很迷糊,特别是在Unity的游戏场景开发上十分不理解(其实现方式中,每个GameObjcet的实例化都是通过加载预制体,然后在服务端进行物理计算,导致客户端和服务端同一个功能模块的代码不尽相同,看的很迷糊)。 阅读详情

本篇主要是提供帧同步主体框架的实现方法以及源码。还有一些坑点的分析。如果对帧同步理论感兴趣的话可以看看这里《帧同步理论篇》。

ps:我的同步框架是在lua里面写的,已经经过了测试没有什么问题即使网络很卡也可以通过调节同步参数保证游戏的流畅。原来的代码里包含了一些项目内部的信息所以就不直接贴出来了。这里只给出核心代码具体的细节大家可以根据项目需求自己扩充。另外我个人这边是用lua写的同步框架,所以贴的也是lua代码哦。

目录

主体架构

LockStep

战斗模块类

浮点数学

断线重连

踩坑

socket粘包、断包

镜像处理

Update函数+切后台

关于socket


主体架构

如上图所示,整体的架构为:

1.战斗类管理着同步类和其他模块类。

2.各模块使用的数学计算和随机数等使用自定义的浮点数学类。

3.各模块必须实现两个接口即逻辑执行接口和渲染执行接口。

4.lockstep会接管各模块的逻辑接口和渲染接口保证整个战斗在同步下进行。

LockStep

lockstep主要的功能是控制整个游戏的流程,替代unity的update,让游戏所有逻辑和渲染通在lockstep的控制下在规定的时间点执行。

这里采用了几个关键逻辑来划分lockstep流程周期。

操作发送 => 用户操作时立即上报给服务器。

事件帧    => 到达事件帧时向服务器请求缓存的用户操作,并立即执行。[1个事件帧=N个逻辑帧]

逻辑帧    => 每个逻辑帧执行战斗各个模块的逻辑运算接口,如位移伤害等等。[1个逻辑帧=M个渲染帧]

渲染帧    => 每个渲染帧根据上一次逻辑帧时自身缓存的信息和当前逻辑帧的数据做插值后得到渲染帧的数据并执行渲染,如位移旋转的修改。[1个渲染帧=unity自身的最小update间隔]

--累计经过的时间
local accumilateTime
--下一次事件帧时间
local nextKeyTime
--事件帧间隔
local keyLen
--下一次逻辑帧时间
local nextLogicTime
--当前逻辑帧数
local logicNum
-逻辑帧间隔
local logicLen

--dt即为渲染帧间隔(可以和unity保持一致即60帧/s)
function lockStep.Update(dt)
    --计算累计经过的时间
    accumilateTime = accumilateTime + dt

    --累积时间大于关键帧的时候  
    if accumilateTime >= nextKeyTime then
        --*2*.取得缓存的用户操作并处理
        --如果缓存没数据了则锁定客户端
        if noData then
            return
        end
        --更新下一个事件帧时间
        nextKeyTime = nextKeyTime + keyLen
    end

    --处理逻辑帧(这里while循环是防止某一帧间隔过大跨度了多个逻辑帧的情况)
    while(accumilateTime > nextLogicTime) do
        --*3*.执行逻辑处理
        lockStep:LogicUpdate(logicLen)
        --下一个事件帧到达前
        if nextLogicTime == nextKeyTime - logicLen then
            --*1*.向服务器请求当前用户的所有操作并缓存
        end
        --更新当前逻辑帧数和下一次逻辑帧时间
        logicNum = logicNum + 1
        nextLogicTime = nextLogicTime + logicLen
    end

    --设置渲染参数(结果为当前渲染帧在两个逻辑帧之间比值)
    renderLerpValue = (accumilateTime + logicLen - nextLogicTime) / logicLen
    --*4*.调用渲染处理将计算的插值参数传进去
    lockStep:RenderUpdate(renderLerpValue)
end

上述代码为同步逻辑主体,update由unity的fixupdate调用。

中间有四个地方需要扩展(标记为*n*了):

*1*:发送一个空包向服务器请求上一个事件帧到此时为止用户做的操作并缓存起来。

        此处发包有两个作用,1.告诉服务器当前客户端准备就绪可以执行下一个step了。2.提前一个逻辑帧向服务器请求操作中间有一个逻辑帧的缓冲提供了一个缓冲,服务器只要在缓冲内下发用户操作都不会导致客户端锁帧(解决了网络延迟带来的卡顿)。

*2*:从缓存中取得用户的操作并执行。

        此处的作用是,若没有取得到操作则锁定客户端直到服务器下发了*1*中的数据包。保证了多个客户端执行的一致性。

*3*:将战斗所有模块中的逻辑方法执行一遍,传入逻辑帧时间间隔。

        由于是用逻辑帧间隔执行的逻辑方法,所有客户端的逻辑帧间隔都是一样的,因此逻辑的执行结果也会保持一直。

*4*:将战斗所有模块中的渲染方法执行一遍,传入一个插值结果。

        上述的流程保证了逻辑的一致性,最终渲染的间隔每个机器还是不一样的,但是由于渲染帧只处理表现,所以这样的表现差别已经不影响游戏逻辑了。在渲染帧方法中我们需要缓存上一次的逻辑结果比如上一次怪物的逻辑位置,然后根据本次怪物的逻辑位置和上一次的怪物逻辑位置做一个插值即可得到当前怪物在场景中的位置再setposition即可。

战斗模块类

战斗模块类只要实现了LogicUpdate和RenderUpdate即可。

lockstep会在逻辑帧和渲染帧遍历所有的战斗模块去调用这两个方法。

战斗模块的划分和游戏具体业务逻辑息息相关,不属于同步框架的范畴。

只要记住战斗模块必须实现这两个接口让lockstep去调用即可。

浮点数学

浮点数学类需要封装好所有float和vector3的数学运算,外部只管从这里调用即可。另外还需要提供随机数的运算。

这里只贴了最关键的代码:

1.随机数的生成

2.关于浮点数精度处理的几个方法

**最终的数学运算可以根据项目情况自行封装,这里提供了float的部分封装举个例。

fixMath = {}
--[[
模块:同步浮点数
功能描述:
    1.处理同步的浮点问题
    2.flot,vector3
    3.包含了基本运算以及插值,移动的封装
]]

--放大倍数
fixMath.Muti = 1000

--随机种子
local r = 9
--系数base
local base = 256
--系数a
local a = 13
--系数b
local b = 147

--设置随机种子
function fixMath:SetRandSed(n)
    r = n
end

--返回一个随机数
local function GetRand()
    local tmp1 = a*r+b
	local tmp2 = math.modf(tmp1 / base)
	local tmp3 = tmp1 - tmp2 * base
    r = tmp3
	return tmp3/base
end

--返回一个随机数(n为范围, 最终生成1-n范围的随机数)
function fixMath:Rand(n)
    local rd2 = GetRand()
    rd2 = fixMath:GetNearBigInt(rd2)
    local final = fixMath:GeNSmallInt(rd2 * (n-1),1000) + 1
	return final
end

--返回小数整数
function fixMath:GetNearSmallInt(value)
    return value > 0 and math.floor(value + 0.5) or math.ceil(value - 0.5)
end

--返回大数整数
function fixMath:GetNearBigInt(value)
    return value > 0 and math.floor(value * 1000 + 0.5) or math.ceil(value * 1000 - 0.5)
end

--返回缩小N倍的数
function fixMath:GeNSmallInt(value,N)
    return value > 0 and math.floor(value / N + 0.5) or math.ceil(value / N - 0.5)
end 

--Float的封装
function fixMath:GetFlot(value)
    local float = {}
    
    --将浮点数放大1000倍并截取整数部分
    float.value = fixMath:GetNearBigInt(value)

    --设值(传入正常浮点数)
    float.Set = function(setValue)
        float.value = fixMath:GetNearBigInt(setValue)
    end

    --乘法
    float.Mut = function(mutValue)
        float.value = fixMath:GetNearSmallInt(float.value * mutValue.value / 1000)
    end

    --除法
    float.Div = function(divValue)
        float.value = fixMath:GetNearSmallInt(float.value / divValue.value)
    end

    --返回正常浮点数
    float.RValue = function()
        return float.value / 1000
    end

    --朝指定浮点数移动(spd为移动步长)
    float.MoveTo = function(moveValue, spd)
        if float.value == moveValue.value then
            return true
        elseif math.abs( moveValue.value - float.value ) < math.abs( spd.value ) then
            float.value = moveValue.value
            return true
        else
            float.value = float.value + spd.value
        end
    end

    return float
end

关于随机数生成的原理可以参考一下https://blog.youkuaiyun.com/fengying2016/article/details/80570702。

上述浮点数生成最核心的思路是将正常浮点数放大1000倍截取整数部分后存储起来。

以后做各种运算的时候均需要使用封装的浮点数,并且如果任何操作可能导致小数都必须用封装好的放大截取整数的函数去处理。

断线重连

断线重连这里采用的方法是,断线后重连时。服务器将从游戏开始到当前的所有操作都发送给客户端,客户端用while循环直接执行所有的逻辑update,直到与当前服务器的逻辑帧数一致。之后再回到正常流程。

--断线重连逻辑
function lockStep:ReLogic()
    local num = 0
    while(num < reLogicNum) do
        --到达事件帧时
        if num >= nextKeyNum then
            --取得用户操作并执行
        end
        --执行逻辑帧
        self:LogicUpdate(logicLen)
        --同步逻辑帧数
        logicNum = logicNum + 1
        --更新步骤
        num = num + 1
    end
    --同步累积时间、逻辑帧、关键帧等信息
    nextLogicTime = logicNum * logicLen
    accumilateTime = nextLogicTime
    nextKeyTime = accumilateTime + keyLen
end

--断线重连走完之后让逻辑回到正常的update即可

这里的取得用户操作并执行和正常lockstep里的事件解析方式保持一致即可。

踩坑

帧同步的整个基础架构并不是很麻烦,但是实际结合游戏项目的时候坑还是很多的。

这里分享一些坑点吧。

socket粘包、断包

socket接收数据并不能保证数据的完整性,会出现粘包(即本次的数据后面还带着下一个消息的数据)或者断包的情况(和粘包类似,本次消息只返回了一部分,另一部份下一次才会返回)。我们需要在socket底层将粘包和断包的情况处理好后封装给业务层。

镜像处理

做对战游戏有时候会需要做镜像,即a和b对打,双方在自己的客户端都看到自己在左边而对手在右边。

我当时在项目里logicUpdate中遍历英雄的时候出现过一个问题。

我的英雄按位置信息生成key值后存储在lua的表中。表中数据的顺序完全由key值控制了。

而a和b由于做了镜像,导致双方由位置生成的key是一样的。

最后出现了遍历到某个英雄的时候a和b分别认为这个英雄是自己的导致不同步。

最后我将英雄按镜像前的一些逻辑值生成key就好了。

Update函数+切后台

最开始我的lockstep update由unity的update调用。

结果a玩家切后台之后update传入的dt变得非常大,甚至超过了一个事件帧的间隔。导致无法同步。

后改为由unity的fixupdate并且对dt做了一个最大限制,当dt超过某个阈值时强制dt为阈值。

关于socket

帧同步和socket息息相关,关于这块的处理后续写了关于socket的框架再把链接贴出来吧。

Unity基础知识学习七,帧同步源码学习 前言 视频地址:帧同步教程【合集】_哔哩哔哩_bilibili github地址:GitHub - JiepengTan/Lockstep-Tutorial: 帧同步 教程 1.ServeraLifeCircle服务端 服务端ServerLauncher.Main() 启动入口: 阅读详情

相关推荐

Unity3D帧同步的原理以及项目开发中可能遇到的问题与解决方案

当一个客户端产生了某一帧的状态数据后,会将这个数据发送给其他客户端,其他客户端接收到这个数据后,会根据接收到的数据更新自己的游戏状态。在服务器模式下,所有的客户端都将自己的输入数据发送给服务器,服务器接收到这些输入数据后,根据一定的规则进行游戏状态的更新,并将更新后的状态数据发送给所有客户端。在服务器模式下,所有的客户端都将自己的输入数据发送给服务器,服务器接收到这些输入数据后,根据一定的规则进行游戏状态的更新,并将更新后的状态数据发送给所有客户端。在帧同步的项目开发中,网络延迟是一个常见的问题。

2301_80135027的博客 1582

帧同步 实现

unity帧同步游戏极简框架及实例(附客户端服务器源码)_CraneInForest的博客-优快云博客_unity帧同步

qq_37672438的博客 551

Unity游戏开发 帧同步战斗框架 理论篇

关键词: 逻辑帧,渲染帧,关键帧 逻辑帧:逻辑执行的时间间隔(20帧/s) 渲染帧:渲染执行的时间间隔(60帧/s) 关键帧:服务器lockstep的逻辑帧间隔数(5个逻辑帧) 流程: 通过渲染帧间隔累计定时器,每帧执行渲染回调,当累计时间达到逻辑帧间隔时间执行逻辑回调。 当逻辑帧计数大于前当关键帧数时,锁定定时器不再执行任何逻辑,等待服务器下发下一个关键帧的所有事件。否则在关键帧立...

FlyToCloud的博客 3053

Unity帧同步,UDP,TCP

目录 前言 一、帧同步是什么? 二、UDP的优缺点 三、帧同步的基本流程 四、帧同步用UDP如何克服缺点 总结 前言 Unity3D实现帧同步 一、帧同步是什么? 单机游戏:手柄操作输入给程序,程序计算,推动游戏运行; 帧同步:所有的游戏逻辑都是在客户端计算,那么服务器做什么呢? 服务器基于帧的概念:每隔一段时间向客户端发送所有玩家的操作,同时等待玩家的操作进来,下次再发。 问题:这样做同步帧,服务器的带宽是否能承受? 每帧中发送的每个玩家的操作信息大概16个字节就能满足,王

weixin_44542069的博客 8460

Unity 3D实现帧同步技术

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,优快云社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。 优快云视频网址:http://edu.youkuaiyun.com/lecturer/144 现在竞技类网络游戏比较火,市面上也出现了很多这种类型的游戏竞赛,提到网络游戏就回避不了一个问...

海洋个人博客 2万+

【Unity】网络同步方案 帧同步与状态同步

帧同步是什么 所谓帧同步(lockstep),其实是同步操作,确保两个客户端逻辑一致,然后服务器接收每个客户端操作(cmd), 然后再下发下去,相同的逻辑,相同的操作,便会播放(DoAction)相同的结果。 如何保证同步 1.一样的随机种子 - 服务器下发和每帧计算 2.同样的逻辑帧数(10-30),渲染帧可以更高(30以上) 2.操作同步 3.控制update - 在接受到...

PA_的博客 1万+

[转]Untiy 帧同步的探索之路一 位置帧同步

主要还是因为网络问题导致所以客户端无法准确的在同一时间收到服务端下达的游戏开始或者逻辑帧开始的命令,不同的网络环境下每个客户端收到的消息的时间有很大的不确定性,如果不进行锁帧,比入在游戏刚开始的时候,服务端下发了一条逻辑帧开始的命令,有的客户端网络好收到的比较早,有的客户端比较慢,收到的比较迟,这就会导致,先收到命令的那个客户端的逻辑帧已经跑到了5帧左右,而后收到的客户端逻辑帧才开始跑。服务器每隔固定的时间进行一次同步,如果到达了同步点有某个客户端没有发来帧数据,直接填充空帧,不进行等待,然后进行同步。

小小姑娘 1361

Untiy 帧同步的探索之路一 位置帧同步

Untiy 帧同步的探索之路一 位置帧同步环境使用到的技术未使用技术帧同步核心锁帧帧同步UDP同步方式定点数数学库 帧同步技术是早期RTS游戏常用的一种同步技术。与状态同步不同的是,帧同步只同步操作,其大部分游戏逻辑都在客户端上实现,服务器主要负责广播和验证操作,有着逻辑直观易实现、数据量少、可重播等优点。 帧同步与状态同步相比各有各的优点。 不管我们当前用不用的到某些技术,但说不定我们以后会用到,所以多一份技术傍身,一方面是为了壮大自身,能找到更好的工作。一方面是多一份技术,就多一份自信,多一份能力。 本

你只管努力,其他的,交给天意! 3103

真Unity3d_比较5个帧同步框架的实现

功夫其实很简单,一出一入,站得住的就是胜利的一方,系米甘简单。。。。 public class Simulation { public void Update(float elapsedMilliseconds) { if (Running) { _accumulatedTime += elapsedMilliseconds; while (_accumulatedTime >= _tickDt) { lock (_localCommandBuffer)

大话程序员 1352

Unity帧同步的探索之路二 不靠谱的Unity物理引擎

下面为了测试帧同步种

你只管努力,其他的,交给天意! 4649

Unity中的基础帧同步框架指南

帧同步技术最初源于多用户网络环境下的数据一致性和交互性需求。随着网络游戏的快速发展,该技术逐渐成熟并被广泛应用于实时多人在线游戏中,以确保所有玩家看到的游戏世界状态保持一致。帧同步技术通过在每个游戏循环周期(即“帧”)内同步玩家的输入和游戏状态,以此来达成精确的多人同步体验。数据压缩是一种减少数据量的技术,压缩后的数据更易于存储和传输。在游戏开发中,适当的压缩可以减少网络传输的负载,提高帧同步的效率。常见的压缩算法包括gzip、Deflate、LZMA等。

weixin_42590539的博客 1721

unity 实现帧同步

阅前提示: 此框架为有帧同步需求的游戏做一个简单的示例,实现了一个精简的框架,本文着重讲解帧同步游戏开发过程中需要注意的各种要点,伴随框架自带了一个小的塔防sample作为演示. 目录: 哪些游戏需要使用帧同步 如何实现一个可行的帧同步框架 帧同步原理 帧同步算法 基础核心算法 渲染更新机制 定点数 关于dotween的正确使用 随机数 服务器同步校验 逻辑和渲染如何进行分离 逻辑代码版本控制策略...

TxNet 1万+

非常好的基于状态帧同步的战斗系统游戏源代码100%好用.zip

非常好的基于状态帧同步的战斗系统游戏源代码100%好用.zip

Unity游戏帧同步技术分享篇【01】帧同步解决方案概述

前言: A.什么是帧同步? 帧同步是一种前后端数据同步的方式,一般应用于对实时性要求很高的网络游戏。 其基本实现流程及思路可以概括为: 1.所有客户端每帧上传操作指令集到服务器; 2.服务端将这些操作指令集保存到对应帧序列字典,并记录帧号,并在下一帧将其广播给所有客户端; 3.客户端收到指令集后,分别按帧序,帧号进行执行指令集中的操作命令。 4.也就是:相同的时机(帧序列) + 相同的操作命令(指...

_阿松先生的博客 9069

[ENVI]-[高光谱遥感]-波谱沙漏分析工具的使用

图1-2-1查看特殊波段的坏波段图1-2-2在中添加坏波段ENVI波谱沙漏分析工具MNF变换。

m0_57992372的博客 1469

TikTok Shop API密钥获取与PHP实战对接指南

本文详细介绍了TikTok Shop API密钥的获取流程与PHP实战对接方法。从开发者后台创建应用、获取核心的API密钥开始,逐步解析OAuth 2.0授权机制,并提供了完整的PHP封装类示例,涵盖签名生成、API调用、令牌刷新及错误处理,帮助开发者快速实现与TikTok Shop的数据对接与自动化操作。

weixin_29300241的博客 400

Unity帧同步demo服务端与客户端:开启游戏开发新篇章

Unity帧同步demo服务端与客户端:开启游戏开发新篇章 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 实现Unity客户端与基于skynet框架服务端的帧同步,助力游戏实时互动。 项目介绍 在游戏开发领域,帧同步技术一直占据着重要的地位,尤其是对于需要实时互动的网络游戏。Unity帧同步demo服务端与客户端项目应运而生,它旨在为开发者提供一个实用的工具...

gitblog_06731的博客 811

STC8G1K08A的10位PWM避坑指南:为什么你的占空比调节总失效?(附寄存器操作时序图)

本文深入剖析了STC8G1K08A单片机10位PWM功能中占空比调节失效的核心原因,揭示了数据手册未明确指出的寄存器操作时序陷阱。通过对比错误与正确配置的波形,文章指出关键在于更新占空比高2位前需临时关闭PWM输出,并提供了经过验证的安全操作宏与函数库,帮助开发者彻底解决此问题,实现0%-100%的平滑控制。

yyy34的博客 747

探索LockStepSimpleFramework-Client:Unity帧同步游戏极简框架

探索LockStepSimpleFramework-Client:Unity帧同步游戏极简框架 项目介绍 LockStepSimpleFramework-Client 是一个为Unity游戏开发者设计的帧同步游戏极简框架。该框架旨在为有帧同步需求的游戏提供一个简单而强大的示例,帮助开发者理解和实现帧同步技术。框架中包含了一个小型的塔防示例游戏,展示了如何在实际项目中应用帧同步技术。 项目技术分析 ...

gitblog_00816的博客 860

Verilog简易电梯控制系统(2层)

电梯处于1楼,按KEY3,LED3亮,电梯处于上行状态时,立刻按 KEY2,LED2亮,电梯继续运行至2楼,LED3灭;按KEY3,LED3亮,电梯处于上行状态时,立刻按 KEY0,LED0亮,电梯继续运行至2楼,LED3灭;电梯处于2楼,按KEY2,LED2亮,电梯处于下行状态时,立刻按 KEY3,LED3亮,电梯继续运行至1楼,LED2灭;电梯处于2楼,按KEY2,LED2亮,电梯处于下行状态时,立刻按 KEY1,LED1亮,电梯继续运行至1楼,LED2灭;电梯运行至2楼后LED1灭,2楼待机。

m0_54240221的博客 6952

华硕电脑Win10改Win7系统:BIOS设置详解

通过上述步骤,华硕电脑用户可以将系统从Windows 10更改为Windows 7。虽然这个过程可能涉及一些技术细节和潜在的风险(如数据丢失和驱动不兼容),但只要按照指南仔细操作并做好准备工作,大多数用户应该能够成功完成系统回滚。请记住,在进行任何系统更改之前都要备份重要数据,并确保已了解所有潜在的风险和限制。希望本文能够帮助到需要回滚到Windows 7的华硕电脑用户!

nntxthml的博客 2261

B1:Unity制作Moba类游戏——Socket帧同步

全体起立!!!卢本伟镇楼!!! 刚上大学就喜欢玩,英雄联盟陪伴了我整个大学生涯,承载了满满的回忆,现在老娘要亲手做一个!!【文末有福利哦~】 相信做开发的小伙伴们都有一个“游戏梦”吧,就是自己动手制作一款自己热爱的游戏,然后发布到热门平台和其它小伙伴在线玩耍~~~ 很多小伙伴觉得自己开发游戏很难,需要大量的时间、精力、资源等。 其实并不是啦~~ 开发一款自己喜欢的游戏其实是非常简单轻松的事情,只要把……模型、动画、地形、渲染、算法、脚本、网络、光影、Editor、内存管理、多.

. 8005

Python白色飘雪(完整代码)

Python绘制白色飘雪动画的完整代码。

AIGC 3万+

unity帧同步游戏极简框架及实例(附客户端服务器源码)

阅前提示: 此框架专为有帧同步需求的游戏打造,实现了一个最精简的框架,这几篇文章我会详细讲解帧同步游戏的制作要点,伴随框架自带了一个小的塔防demo作为演示. 什么情况下需要使用帧同步 帧同步原理 服务器校验 如何做平台分离 逻辑和绘制如何分离 哪些unity接口不能调用(Debug.log) 定点数 如何去掉Vector2和Vector3 不能使用dotween 随机数 如何做加...

CraneInForest的专栏 4万+

吊打原版YOLOv8!ASF-YOLO多尺度融合+注意力机制实战解析(遥感/医疗/质检均适用)

ASF-YOLO融合YOLOv8的创新目标检测框架摘要 ASF-YOLO是针对小目标检测优化的先进框架,采用三重特征编码器和尺度序列融合技术增强多尺度特征提取能力。核心创新包括: 三重特征编码器(TPE)融合跨层级信息 尺度序列特征融合(SSFF)模块通过3D卷积处理多尺度信息 通道-位置注意力机制(CPAM)聚焦关键特征区域 Zoom_cat模块实现自适应多尺度特征融合 该框架特别适用于医学影像、遥感检测等小目标密集场景,通过动态特征权重调整显著提升检测精度。关键技术实现包含多尺度特征统一、3D卷积序列处

FJN110的博客 527

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

灵境引路人 3227
上一篇: Unity游戏开发 DoTween集成
下一篇: Unity shader 带边缘溶解效果
古月三齐
博客等级 码龄10年 67粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值