RHI即RenderHardwareInterface, 即渲染硬件接口, 是UE为实现跨平台而实现的一套API. 每个RHI接口都为OpenGL, Vulkan, DX11等做了不同的实现. 在引擎初始化时使用的绘图接口就已经确定, 引擎就可以确定RHI所使用接口的版本.

  针对于不同的绘图API(DX11, DX12, OpenGL, Vulkan乃至于Metal), 会有不同的FRHICommandContext类对RHI方法做不同的实现(以RHIDrawIndexedPrimitive方法为例):

              

  作为RHI使用者, 我们不必关心具体到每种绘图API的实现差异, 只需要关注RHI这一抽象绘图接口. 可以想象在这么多绘图API中实现相似的各种效果需要多大的开发与维护成本...

  而创建RHI对象, 不仅需要关注绘图接口, 对于不同的运行系统也会需要有不同的实现. 对于方法PlatformCreateDynamicRHI(), 也会有如下方法:

  与想象中的不同, 并没有抽象出一套对应不同平台的接口来做RHI创建方法的不同Implementations, 而是会有这样几个全局方法.

  看到这几个方法的时候我是懵逼的(菜是原罪...), 这么几个同名全局方法, 是怎么通过编译的, 又是怎么makefile的?

  一顿思考之后我觉着肯定是在Build的时候排除了这几个.cpp, 之后针对不同平台#include不同的PlatformDynamicRHI.cpp来获取到对应的实现体. 创建一个新工程来测试:

                        

  在AllCppTest_A/B.cpp中有全局函数char Test();的不同实现, 对应会返回a/b. 在main.cpp中:

#include "pch.h"
#define A 1
#if defined A
#define Header "AllCppTest_A.cpp"
#include Header
#else defined B
#define Header "AllCppTest_B.cpp"
#include Header
#endif
#include <iostream> int main()
{
std::cout << Test()<< std::endl;
system("pause"); }

  选择性#include不同的.cpp文件. 这样VS在编译时会排除掉两个源文件, 而在编译main.cpp时, 宏Header会被替换为对应的Test源文件名, 对应源文件被#include, 对应的Test();函数实现会被编译.

  上图对应的输出:

                              

  这也就是条件式编译....

  折腾了一晚上, RHI没看成补了节Cpp...Cpp底子还是不行啊...不禁感叹还是要多看书...整天闷头敲码不可取...

UE4 RHI与条件式编译的更多相关文章

  1. UE4 RHI与Render模块简解

    UE4中的RHI指的是Render hardware interface,作用像Ogre里的RenderSystem,针对Dx11,Dx12,Opengl等等平台抽象出相同的接口,我们能方便能使用相同 ...

  2. [UE4]OnComponentBeginOverlap.AddDynamic 的编译错误

    以 Character 类为例,假设有 PacManCharacter 派生自 Character类首先在 PacManCharacter.h 头文件中添加碰撞函数的声明: OnCollision 为 ...

  3. UE4 RHI(2)

    在上篇简单说明RHI的作用后, 我们在引擎中探索一下RHI的种种细节与实现. 在解决方案资源管理器中搜索RHI, 会有这些文件: (1)对应不同运行平台的PlatformDynamicRHI.cpp( ...

  4. 记一次UE4源码编译和游戏项目打包过程

    1.首先我们需要注册一个Epic账户,网址如下 http://api.unrealengine.com/CHN/GettingStarted/Installation/index.html#bookm ...

  5. UE4 中Struct Emum 类型的定义方式 笔记

    UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...

  6. UE4游戏开发基础命令

    在个人的Unrealengine账户中关联自己的GitHub账户成功之后,就可以访问UE4引擎的源码了. git clone -b release https://github.com/EpicGam ...

  7. C语言include预处理命令与多文件编译

    #include预处理命令几乎使我们在第一次接触C的时候就会碰到的预处理命令,可我现在还不怎么清楚,这次争取一次搞懂. 一.#include预处理指令的基本使用 预处理指令可以将别处的源代码内容插入到 ...

  8. 使用UE4公布安卓平台游戏

    使用了几天的UE4 ,总算是将游戏在安卓平台执行起来了.当中遇到非常多问题,而且终于依旧有一些问题没能解决. 整体感觉是UE4这款引擎眼下还不够成熟.问题较多. 没有unity使用起来方便. 可是既然 ...

  9. UE4制作插件的插件神器pluginCreator

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/45644007 作者:car ...

随机推荐

  1. Java锁--共享锁和ReentrantReadWriteLock

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3505809.html ReadWriteLock 和 ReentrantReadWriteLock介绍 ...

  2. 第六章 Flask数据库(二)

    Flask-SQLALchemy Flask-SQLALchemy 是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展. 它需要 SQLAlchemy 0.6 或更高的版本.它致力于 ...

  3. [hdoj6415 Rikka with Nash Equilibrium][dp]

    http://acm.hdu.edu.cn/showproblem.php?pid=6415 Rikka with Nash Equilibrium Time Limit: 10000/5000 MS ...

  4. FastDFS+Nginx+Module

    1.安装libevent wget  https://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.g ...

  5. django 内置标签

    1.autoescape 自动转义开关 官网:https://docs.djangoproject.com/en/2.2/ref/templates/builtins/ 作用:将 html 内容解析成 ...

  6. PHP mysqli_connect_errno() 函数

    返回上一次连接错误的错误代码: <?php $con=mysqli_connect("localhost","wrong_user","my_p ...

  7. 数据分析相关学习 -1 numpy

    前情提要: 数据分析:把一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究 对象的内在规律 数据分析的三剑客: numpy,pandas,matplotlb numpy是python语言的一个扩展 ...

  8. Flutter布局4--Row

    Row 简介 mainAxisAlignment:主轴布局方式,row主轴方向是水平方向 crossAxisAlignment: 交叉轴的布局方式,对于row来说就是垂直方向的布局方式 Row 是一个 ...

  9. mysql日期相减取小时

    mysql日期相减取小时 TIMESTAMPDIFF(HOUR,a.StartTime,a.EndTime)

  10. Oracle 11g关闭用户连接审计

    sys.aud$表数据量增长较快.这时,不想关闭数据库的审计,但是又不想频繁的清理sys.aud$表.可进行如下操作关闭数据库连接的审计 noaudit connect;