Posts

垃圾回收 如何保持新建的不被自动GC垃圾回收? 使用AddToRoot()函数可以保护对象不被自动回收,移除保护时使用RemoveFromRoot()并把对象指针置为nullptr即可由引擎自动回收; UMyObject* MyObject=NewObject<UMyObject>(); MyObject->AddToRoot(); //保护对象不被回收 MyObject->RemoveFromRoot(); MyObject=nullptr; //交给引擎回收对象 使用UPROPERTY宏标记一下对象指针变量也可以保护对象不被自动回收,在该类被销毁时,新建的对象也会被引擎自动回收; 使用FStreamableManager加载资源时,将bManageActiveHandle设置为true也可以防止对象被回收; FSoftObjectPath AssetPaths(TEXT("[资源路径]")); FStreamableManager& AssetLoader = UAssetManager::GetStreamableManager(); TSharedPtr<FStreamableHandle> Handle = AssetLoader.RequestSyncLoad(AssetPath, true);//加载资源到内存中,bManageActiveHandle=true 反射 UE – UBT、UHT与反射基本理解 - 知乎 C#中反射的定义是:运行中的程序查看本身的元数据或其他程序的元数据的行为。 C++本身不支持反射,也没有垃圾回收,因此UE自己实现了一套反射系统,通过反射可以实现序列化、垃圾回收GC、网络复制、蓝图通信等重要功能。简而言之就是把C++代码暴露给引擎,可以使用蓝图、序列化等功能。 因此UHT必须要把UE代码转换成C++代码,而UBT就是负责调用UHT做这件事情的。——UBT本身不参与反射机制的实现,但是它负责调用UHT。 完整编译流程:UBT搜集目录中的.cs文件,然后UBT调用UHT分析.h .cpp文件(根据文件是否含有#include"FileName.generated.h",是否有UCLASS()、UPROPERTY等宏)生成generated.h和gen.cpp文件,最后UBT调用MSBuild,将.h.cpp和generated.h gen.cpp结合到一起然后编译。 C++与蓝图对比 C++ or 蓝图 C++是编程语言,适合实现游戏底层系统;蓝图是脚本系统,适合定义高级交互、装饰性细节等。它没有一个明确的界限必须在什么时候使用蓝图或C++,但是两者可以很轻易的互通。 从源码构建项目时,C++会被编译为机器码。能够直接在CPU上运行的指令列表;而蓝图会由脚本编译器编译成脚本字节码,由引擎的脚本虚拟机在运行时执行。编译器会对C++进行一些优化,从而性能会更好,但是蓝图不会,所以消耗更大。因此复杂的数学计算或Tick这样被频繁调用的函数最好用C++实现。 虚幻提供了蓝图本地化(Blueprint Nativization)用来让蓝图转换成C++源代码,这也意味着不再通过虚拟机执行,而是会像C++一样被编译为原生机器代码。但是生成的代码不像C++一样容易阅读。 所以我们可以对蓝图节点中开销比较大的位置用C++重构。 C++中可以通过模块化管理类的依赖关系,但是蓝图没有模块化的概念,可以自由引用C++任何类,而C++类不会知道任何蓝图类型相关的信息。


GAS网络部分有了解吗? server管理属性值、GE应用、技能执行 client发起技能激活请求ServerTryActivateAbility UE的属性同步 1.属性必须加UPROPERTY(Replicated) 2.Actor必须开启复制bReplicates = true; 3.在 GetLifetimeReplicatedProps 注册 void AMyActor::GetLifetimeReplicatedProps( TArray<FLifetimeProperty>& OutLifetimeProps) const { Super::GetLifetimeReplicatedProps(OutLifetimeProps); DOREPLIFETIME(AMyActor, Health); } 可以加上同步条件: 条件 含义 COND_None 所有人 COND_OwnerOnly 仅拥有者 COND_SkipOwner 除拥有者 COND_InitialOnly 只同步一次 GAS赋予能力的三种方法 ASC赋予能力GiveAbility 角色初始就有的能力——生成武器、装配武器 通过GE赋予能力——狂暴状态解锁技能 GA赋予能力 EQS底层是什么 EQS 底层就是批量生成候选点,然后对这些点进行可达性、可视性、距离等测试,计算分数并排序,从而返回最佳点。 遍历所有items然后遍历所有Test(距离Test / Pathfinding Test / Dot Test) 生成一批候选点(Items) 然后对每个点执行Tests(过滤/打分) 按分数排序 返回最佳点 fps使用状态同步在弱网环境下 导致的问题 (服务器权威)你在客户端移动很流畅,但是服务器延迟高,服务器收到位置后,发现跑远了然后给你拉回权威位置。 (包丢失/延迟)角色移动不连续 (射击决策用客户端时刻)客户端做表现子弹已经发出去了,但是服务器射击判定延迟,命中体验感差。 … 根本原因是状态同步是“结果式同步”,弱网导致状态包丢失或延迟后,客户端缺乏预测与回滚机制,无法平滑补偿,也无法保证时序一致。 那应该如何解决弱网带来的问题? 输入同步+客户端预测+服务器回滚矫正+命中回溯 1.输入同步:客户端不发当前位置,而是发当前输入,服务器能够重演玩家的行为,不会影响最终状态。 2.客户端预测:客户端在按下移动/跳跃/开枪的瞬间立刻模拟,不等待服务器。 3.服务器回滚矫正:如果客户端预测的结果和服务器不同,客户端会收到服务器的权威状态,回到服务器的位置。 4.命中回溯:服务器对“开枪时间点”进行还原的一种算法。客户端开枪时附带“开枪时间戳”,服务器收到开枪包时,会回到“子弹发射那一刻”的游戏世界状态,重新做命中判定。 GA中endabiliy去调用一个定时器会出现问题吗?定时器会不会随着GA结束而销毁 不会随着GA结束而销毁定时器,因为UE 的 FTimerManager 是挂在 UWorld 层级的,跟 GA 完全独立。