UE As Lib机制初探

UE4.27推出了一项新的机制,可以把UE编译成库,能够嵌入到外部程序中,由其他的程序来驱动引擎的执行与消息通信。但是目前官方还没有放出任何有价值的文档,我分析了引擎中的相关代码,提出一个UE as Lib的实践方案,理论上也能在4.27之前的引擎版本实现,或许会与后续官方发布的文档不一致,权当抛砖引玉。相关的研究内容也会在本篇文章中持续更新。

首先,我认为UE as Lib并不是以静态链接库的方式提供的,因为引擎内具有大量依赖UHT和UBT的代码,而且还具有大量的模板实现,想要编译出一个独立的Lib是非常麻烦的,并且使用时还需要抽取大量的代码,所以我认为UE as Lib是将引擎编译成DLL的形式提供的,外部程序通过DLL的导出符号驱动引擎。

注意:目前UE as Lib只能用于Windows平台。

UE在4.27中加入了一个新的Runtime Module:UELibrary,用于导出外部驱动引擎的符号。

其导出的符号为:

extern "C"
{
/**
 * Initializes UE as a library.
 *
 * @param  hInst    The instance of the outer application which wants to embed UE.
 * @param  hWnd     The window of the outer application into which UE is to be embedded.
 * @param  CmdLine  The command line to pass to UE - should contain a .uproject file and map to load at minimum.
 *
 * @return  Zero if creation was successful, non-zero if an error occurred.
 *
 * @note  UE can currently only be embedded in a single window.
 * @note  There is an A and W overload for different character widths of the command line argument. Typical usage
 *        should be to use the UELibrary_Init function which maps to the appropriate overload for the outer
 *        application's Unicode setting.
 */
UELIBRARYAPI int UELibrary_InitA(HINSTANCE hInst, HWND hWnd, const char* CmdLine);
UELIBRARYAPI int UELibrary_InitW(HINSTANCE hInst, HWND hWnd, const wchar_t* CmdLine);

#ifdef UNICODE
	#define UELibrary_Init UELibrary_InitW
#else
	#define UELibrary_Init UELibrary_InitA
#endif


/**
 * Ticks the UE library.  This should be called frequently by the outer application.
 *
 * @return  Zero if ticking was successful, non-zero if an error occurred.
 */
UELIBRARYAPI int UELibrary_Tick();


/**
 * Passes windows messages from the outer application to the UE library.
 *
 * @param  hWnd     As per WndProc.
 * @param  message  As per WndProc.
 * @param  wParam   As per WndProc.
 * @param  lParam   As per WndProc.
 *
 * @return  As per WndProc.
 */
UELIBRARYAPI LRESULT UELibrary_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


/**
 * Shuts down the UE library.
 *
 * @return  Zero if shutdown was successful, non-zero if an error occurred.
 *
 * @note  UE cannot be started up again once shut down.
 */
UELIBRARYAPI int UELibrary_Shutdown();
}

提供了四个到处函数用于初始化引擎、Tick、传递消息、关闭引擎,符合前面的推断,将引擎编译成DLL,外部程序通过调用这四个函数来实现驱动引擎。

关于如何编译UE as Lib,我提供一个思路。首先要明确需求:

  1. 将引擎编译成一个独立的DLL
  2. 依赖UELibrary模块的导出符号
  3. 必须通过UE的编译系统来编译引擎

为了实现这几个需求,需要了解UE的构建系统。

注意:UE的UE as Lib也可以将游戏项目编译为DLL,由外部程序来驱动引擎启动游戏,只需要将下面的操作从Program换到游戏项目的Target即可。

UE的Module,需要被Target依赖才能够通过UE的构建系统进行编译。之前我写过一篇文章,可以将UE作为一个库来实现console或WinGUI程序:Create A Standalone Application in UE4,在这篇文章中我提供了一个开源工具ue4program,可以方便地创建一个StandaloneApplication程序,由Program依赖UELibrary模块,然后编译这个Program,将UELibrary模块和依赖的Module编译其中。

然后,Pogram默认是编译成exe的,想要实现UE as Lib编译成DLL,其实就是将Program的Target编译成DLL!

首先需要通过hxhb/ue4program创建一个Standalone Application模板:

# ue4program.exe ProgramName
$ ue4program.exe UEProgram

将创建出的目录放到引擎的Source/Programs下,执行GenerateProjectFiles.bat刷新sln,即可在UE4.sln中看到创建的Program项目。

UELibrary模块添加至UEProgram的依赖:

PrivateDependencyModuleNames.Add("UELibrary");

然后编辑UEProgramTarget.cs,需要修改LinkType:

LinkType = TargetLinkType.Monolithic;

这样会把所有的代码都编译到一个最终的二进制中,UE默认的则是Modular,通过DLL方式访问其他的模块。

还需要修改bShouldCompileAsDLL

// Whether this target should be compiled as a DLL. Requires LinkType to be set to TargetLinkType.Monolithic.
bShouldCompileAsDLL = true;

默认为false,会把Program编译成一个exe,但是我们的目标就是DLL。 添加UE_LIBRARY_ENABLED=1宏,在UELibrary中只有这个宏为1,才包含了前面导出符号的实现代码:

GlobalDefinitions.Add("UE_LIBRARY_ENABLED=1");

修改之后编译UEProgram这个项目即可,编译完成之后即可在引擎的Binaries/Win64下看到UProgram.dll

它包含了引擎代码、以及UELibrary的导出符号,可以在外部程序中通过OpenLibrary来加载和执行,就是常规的C++调用动态链接库的用法了。编译出DLL之后,就实现了UE as Lib,使用方就可以脱离UE的编译系统,在普通的程序中调用了。

简单总结一下,目前UE as lib其实并不是一个完全全新的东西,只是UE把驱动引擎的API做了符号导出,在4.27之前的引擎版本中,也可以通过实现一个UELibrary的模块导出符号,通过文中的这种方式实现引擎的动态链接库化。

时间问题,暂时只分析到这里,至于编译出的DLL如何嵌入第三方程序由外部来驱动引擎,有时间再来补充。

相关链接:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一文看懂LTE的鉴权

    所谓鉴权,就是鉴别终端或网络的真伪,保证通信数据的安全(不被截取、不被篡改、不被伪造)。

    鲜枣课堂
  • UE集成WWise:概念与代码分析

    WWise是Audiokinetic的跨平台音频引擎,可以与游戏引擎很好地进行交互,负责音频的同事可以只在WWise中处理音频,把游戏业务和音频的制作与管理分离...

    查利鹏
  • UE Build System:Target and Module

    Module是构成Unreal的基本元素,每一个Module封装和实现了一组功能,并且可以供其他的Module使用,整个Unreal Engine就是靠各个Mo...

    查利鹏
  • MySQL - 锁机制初探

    InnoDB 行锁是通过对索引数据页上的记录(record)加锁实现的。主要实现算法有 3 种:Record Lock、Gap Lock 和 Next-key ...

    小小工匠
  • [LTE] LTE-NAS过程学习总结

    为了从网络得到非接入层服务,网络中非接入层节点必须知道有关UE的信息。为了这个目的,UE不得不发起附属过程,该过程是在UE开机和初始接入网络时必须被执行的。 ...

    轻舞飞扬SR
  • VoLTE信令系列--被叫锚定流程

    CS网络注册的2G/3G用户呼叫离散号段的LTE用户的呼叫过程可以分为如下几个阶段:

    用户6184845
  • 5G媒体流架构

    本文来自IBC2019(国际广播大会),主要讲述了3GPP为5G开发了一种新的媒体流架构,其中加入了媒体产业的最新成果和5G系统提供的新特性。该媒体服务架构注重...

    用户1324186
  • 30个5G常见知识点,从事IT的工程师最好收藏一下!

    从确定的 5G频谱划分方案来看,中国电信获得 3400MHz-3500MHz 共100MHz带宽的 5G试验频率资源;中国联通获得 3500MHz-3600MH...

    网络技术联盟站
  • Java 反射机制 初探*

    前者是产生了类的实例化对象之后取得Class类对象,但是类.class方法并没有实例化对象产生

    Mirror王宇阳
  • 5G无线网络信令流程

    初始无线接入:当UE开机后,它的首要任务就是要找到无线网络并与无线网络建立连接,需要如下步骤;

    用户6184845
  • 有的UE画不好PPT,好的测试却靠Python加薪

                     测试开发者的共同关注! 作者:jhouyang,腾讯资深后台开发工程师。 WeTest导读 想要升职加薪,强大的专业能力很...

    WeTest质量开放平台团队
  • UE热更新:Config的重载与应用

    在UE引擎中有大量的配置使用ini来进行设置与控制。对于项目而言,了解其中哪些是能够更新的,能够对制定项目的更新内容规则有帮助。并且,UE很多功能都是通过CVa...

    查利鹏
  • 如何用全流量检测5G核心网网元服务异常

    华为5G安全白皮书[1]中提到5G安全的两个目标,其中一项是:提供方法和机制来保护建立在5G平台上的服务。基于这个目标,新架构,新挑战:5G核心网业务安全问题与...

    绿盟科技研究通讯
  • UE Modules:Load and Startup

    UE是模块化的架构,Engine/Game Project/StandaloneApplication/Plugins都是Module(Unreal Engin...

    查利鹏
  • UE开发的问题笔记和资料辑录

    在平时的开发和学习中遇到和解决的一些问题以及摘录的一些资料,都随手写在了notes中,UE相关的积攒了不少,其他的混在一起比较混乱,整理到本篇文章中。 与UE4...

    查利鹏
  • 5G核心网:模拟环境搭建与网元通信关系还原

    5G核心网通过基于服务的网络架构(SBA)、网络切片以及控制面/用户面分离等技术思路,实现了网络功能的定制化和服务化。但SBA架构的升级以及网络功能虚拟化(NF...

    绿盟科技研究通讯
  • 手机在线视频流量对业务速率、小区容量影响分析

    手机在线视频流量是指通过4G、5G无线网络传递的手机实时录制、发送的视频内容并使用手机即时观看直播视频内容及在线点播播放视频内容和视频通话等而产生的数据量。

    用户8900559
  • VoLTE信令系列--注册流程

    1).UE向MME发起附着请求Attach Request。Attach Request消息中与VoLTE相关的关键信元

    用户6184845
  • UE反射实现分析:C++特性

    在前一篇文章中,介绍了UE的反射的基础概念,这篇文章开始研究UE的反射机制的具体实现。

    查利鹏

扫码关注云+社区

领取腾讯云代金券