06/19/2021

文章目录

  • GEngine
    • Print on Screen 打印消息到游戏视图窗口
    • GetWorld/GetWorldContext
    • LoadMap
    • UGameEngine::Init(IEngineLoop* InEngineLoop)
  • GWorld
  • GShaderComplingManager
  • CoreGlobals.cpp
  • 全局指令
    • gc.FlushStreamingOnGC = FlushAsyncLoading
    • CollectGarbage(keepflags,purge)
    • IncrementalPurgeGarbage(bool bUseTimeLimit, float TimeLimit)
    • UnhashUnreachableObjects

UE4 自带的全局变量,可以在任何时候使用,所以很方便,而且全局变量中涉及到一些重要函数可以辅助学习UE4引擎。CoreGlobals.cpp 声明很多全局变量

GEngine

Print on Screen 打印消息到游戏视图窗口

GEngine->AddOnDebugScreenMessage(); //第一个上手的函数

GetWorld/GetWorldContext

World 分为很多种类,比如PIE,Editor,和Game

GEngine->GetWorldContexts();  //获得数组
GEngine->GetWorldContextFromWorld(GetWorld());GEngine->AddOnScreenDebugMessage(-1, 2.f, FColor::Red, FString("WorldContext Number: ") + FString::FromInt(GEngine->GetWorldContexts().Num()));//GWorld
UWorld* PIEWorld =nullptr;
for (auto x : GEngine->GetWorldContexts())
{//PIE TravelGEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, FString::FromInt((int64)x.WorldType.GetValue()));if ((int64)x.WorldType.GetValue()==3|| (int64)x.WorldType.GetValue() == 1){PIEWorld = x.World();}
}
  1. WorldContext很重要的原因:描述一个世界的基本信息,和去下一张图的基础信息,比如URL,GameViewport,OwningGameInstance,ThisCurrentWorld
  2. FURL URL: 保存了FString 的地图名字,等等信息
  3. UGameViewportClient* GameViewport: 渲染,声音和输入系统的接口
  4. UGameInstance* OwningGameInstance: 游戏中最上级的实例,管理object

LoadMap

GEngine->LoadMap();//通常不用自己调用这个函数//间接调用LoadMap,通常是下一帧才会调用LoadMap
GEngine->Exec(PIEWorld,*FString::Printf(TEXT("OPEN %s"), *FString("Level2")));  //地图名字,指令为OPEN/TRAVEL
HandleOpenCommand(Cmd,Ar,InWorld);
SetClientTrave();

第一帧流程:触发GEngine->Exec函数

下一帧流程:加载新地图

UGameEngine::Init(IEngineLoop* InEngineLoop)

void UGameEngine::Init(IEngineLoop* InEngineLoop)
{UEngine::Init(InEngineLoop);// Create game instance.  For GameEngine, this should be the only GameInstance that ever gets created.{FSoftClassPath GameInstanceClassName = GetDefault<UGameMapsSettings>()->GameInstanceClass;UClass* GameInstanceClass = (GameInstanceClassName.IsValid() ? LoadObject<UClass>(NULL, *GameInstanceClassName.ToString()) : UGameInstance::StaticClass());if (GameInstanceClass == nullptr){UE_LOG(LogEngine, Error, TEXT("Unable to load GameInstance Class '%s'. Falling back to generic UGameInstance."), *GameInstanceClassName.ToString());GameInstanceClass = UGameInstance::StaticClass();}GameInstance = NewObject<UGameInstance>(this, GameInstanceClass);GameInstance->InitializeStandalone();}// Initialize the viewport client.UGameViewportClient* ViewportClient = NULL;if(GIsClient){ViewportClient = NewObject<UGameViewportClient>(this, GameViewportClientClass);ViewportClient->Init(*GameInstance->GetWorldContext(), GameInstance);GameViewport = ViewportClient;GameInstance->GetWorldContext()->GameViewport = ViewportClient;}
}
  1. 初始化父类
  2. 初始化GameInstance
  3. 初始化GameViewport Client

GWorld

  1. UWorld* World; //World.h
  2. World管理一个Persistent Level和许多LevelStreaming,和生成或者销毁Actors,碰撞检测等等
//增减找,更新
InitWorld(),CreateWorld(),DestroyWorld();CleanupWorld();ClearWorldComponents(); BeginTearingDown();
GWorld->AddLevel(); RemoveLevel(),ContainsLevel(),GetNumLevels()
GWorld->SpawnActor();RemoveActor(); DestroyActor();cleanupActors()

Actor中最重要的两个AGameModeBase和AGameStateBase

GShaderComplingManager

FShaderCompilingManager* GShaderCompilingManager = NULL; //ShaderCompile.h

在这里插入代码片

CoreGlobals.cpp

  1. GMalloc
  2. GEngineini/Editorini
CORE_API FMalloc*            GMalloc                     = nullptr;     /* Memory allocator */
FString             GEngineIni;                                                 /* Engine ini filename *//** Editor ini file locations - stored per engine version (shared across all projects). Migrated between versions on first run. */
FString             GEditorIni;                                                 /* Editor ini filename */void CORE_API RequestEngineExit(const TCHAR* ReasonString)
{ensureMsgf(ReasonString && FCString::Strlen(ReasonString) > 4, TEXT("RequestEngineExit must be given a valid reason (reason \"%s\""), ReasonString);FGenericCrashContext::SetEngineExit(true);PRAGMA_DISABLE_DEPRECATION_WARNINGSUE_LOG(LogCore, Log, TEXT("Engine exit requested (reason: %s%s)"), ReasonString, GIsRequestingExit ? TEXT("; note: exit was already requested") : TEXT(""));GIsRequestingExit = true;
PRAGMA_ENABLE_DEPRECATION_WARNINGS
}
void CORE_API RequestEngineExit(const FString& ReasonString)
{RequestEngineExit(*ReasonString);
}double                 GStartTime                      = FPlatformTime::InitTiming();

全局指令

gc.FlushStreamingOnGC = FlushAsyncLoading


static int32 GFlushStreamingOnGC = 0;    //gc.FlushStreamingOnGC = 1
// Flush streaming before GC if requested
if (GFlushStreamingOnGC)
{if (IsAsyncLoading()){UE_LOG(LogGarbage, Log, TEXT("CollectGarbageInternal() is flushing async loading"));}FGCCSyncObject::Get().GCUnlock();FlushAsyncLoading();                 // <----- 异步卸载FGCCSyncObject::Get().GCLock();
}TUniquePtr<IAsyncPackageLoader> GPackageLoader->FlushLoading(PackageID);

CollectGarbage(keepflags,purge)

  1. 不被GC的UObject,keep flags
  2. purge 是否全局收集

IncrementalPurgeGarbage(bool bUseTimeLimit, float TimeLimit)

开始清理UObject,是否在一定时间内清除UObject!

UnhashUnreachableObjects

在IncrementalPurgeGarbage中被调用,对所有收集到的GUnreachableObjects执行ConditionalBeginDestroy,之后标记UObject的flag为RF_BeginDestroyed,之后调用BeginDestroy()函数

while (GUnrechableObjectIndex < GUnreachableObjects.Num()){//@todo UE4 - A prefetch was removed here. Re-add it. It wasn't right anyway, since it was ten items ahead and the consoles on have 8 prefetch slotsFUObjectItem* ObjectItem = GUnreachableObjects[GUnrechableObjectIndex++];{UObject* Object = static_cast<UObject*>(ObjectItem->Object);FScopedCBDProfile Profile(Object);// Begin the object's asynchronous destruction.Object->ConditionalBeginDestroy();}Items++;//....
}

GUnreachableObjects,当loadmap时候,会生成一个临时的地图用于过渡到下一张地图时候的会调用这个函数

过渡地图

离开ThirdPerson 模板地图,调用loadmap->CollectGarbage->GatherUnreachableObjects->UnhashreachableObjects

UE4 C++ (22)全局变量理解相关推荐

  1. 【UE4基础】全面理解UE4委托

    转载自:全面理解UE4委托 - 可可西 - 博客园UE4中的delegate(委托)常用于解耦不同对象之间的关联:委托的触发者不与监听者有直接关联,两者通过委托对象间接地建立联系 监听者通过将响应函数 ...

  2. 第22条:理解NSCopying 协议

    本条要点:(作者总结) 若想令自己所写的对象具有拷贝功能,则需实现 NSCopying 协议. 如果自定义的对象分为可变版本与不可变版本,那么就要同时实现 NSCopying 与 NSMutableC ...

  3. UE4利用Save Game创建全局变量

    因为盲目的做了一个UE4的项目,没有用到UE4的无缝加载,我只能在一个个关卡中手动切换,然后每次的数据都会重置,这对于项目来说,造成了体验感的极度下降. 然而我查了一下怎样在UE4中创建全局变量,找到 ...

  4. UE4 热更新系统开发

    哈喽,大家好,我叫人宅,很高兴和大家分享本套课程的内容. 在我们部署好我们的服务器后,有没有为我们的资源更新和资源下载而苦恼过,有没有为UE4 pak加载加密和读取解密而费尽脑汁过,有没有为我们资源压 ...

  5. ue4蓝图节点手册中文_UE4蓝图解析(一)

    简介 蓝图是一类特殊的asset,可以使用直观.基于节点的方式创建逻辑,或者设置一些变量数据.策划可以创建自定义的Actor.Event.函数等等,快速的做Gameplay迭代,不需要写任何代码. 蓝 ...

  6. UE4 GamePlay架构

    UE4 GamePlay架构 前言 GamePlay架构_1_Actor和Component GamePlay架构_2_Level和World GamePlay架构_3_GameInstance Ga ...

  7. UE4 解决半透明材质显示错误

    整理自:1.链接已删除 2. 两个重叠模型模拟双pass,顺便解决透明乱序问题_魁梧的抠脚大汉-CSDN博客 2020.3.6更新UE4官方出了篇文章,里面有案例和资源,挺不错的,详细深入讲解UE4透 ...

  8. UE4 渲染半透明物体进深度剔除(复制物体)

    在渲染半透明材质时会出现半透明物体重叠的现象,用深度剔除的方式可以解决. 很多教程有详细讲解,可以参考附录. 主要是在此基础上增添一个render in main pass 和Custom depth ...

  9. [玩转UE4动画系统]教程的大纲及设计思路

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式. 教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的玩转UE4动画系统 专栏. 教程中使用的资源及工程将以开源 ...

最新文章

  1. 皮一皮:高科技产品真是防不胜防...
  2. 分数调查 HihoCoder - 1515(带权并查集)
  3. LeetCode 2201. 统计可以提取的工件(哈希)
  4. 北邮人工智能学院刘勇教授实验室,招聘博士后研究人员
  5. SqlHelper V1.0 (C#)
  6. 555定时器的应用——施密特触发器
  7. [转载] Python:把字符串转换成整数
  8. 编译openjdk时cygwin需要下载的内容
  9. 做java前端需要学习哪些知识,2022最新
  10. Win10安装jdk11及环境变量配置
  11. Monte-Carlo(蒙特卡罗)算法
  12. 忘记mysql的root密码啷个办
  13. javaserver_JavaServer页面简介
  14. 中银泰各种投资理财方式对比
  15. 前后台订单入库调用流程
  16. 在Ubuntu16.04.1上安装、配置、使用Nginx
  17. 破解宝塔所有插件只需一句代码
  18. H2/H∞半车悬架控制仿真分析
  19. 伊斯坦布尔的流浪 (一)
  20. Oracle完全卸载

热门文章

  1. 基于pytest来演示一个PO测试模式案例
  2. matlab r2012a下载及更新摘要
  3. 产品分析 | 聊聊“音乐社群”网易云VS虾米
  4. 华为mate40rs保时捷鸿蒙系统,【华为Mate40RS保时捷版评测】用匠心贯穿古今 看华为Mate40 RS背后的故事-中关村在线...
  5. AC-DMIS 5.3 工件与测针的准备
  6. 菲律宾参议员提议涉及加密货币的犯罪活动要加重惩罚
  7. 华为路由交换由浅入深系列(四)OSPF单区域、多区域配置、时间参数 DRBDR选举 重分布路由与认证演示
  8. Deep Label Distribution Learning With Label Ambiguity
  9. Attribute 属性
  10. CV综述图像分割整理---目录