格格她爹讲程序---用传统程序员的方式玩UE4(三)

2024-04-11 02:32

本文主要是介绍格格她爹讲程序---用传统程序员的方式玩UE4(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

格格她爹讲程序---用传统程序员的方式玩UE4(三)

 

最近经常有人问我,什么时候出下一章,我觉得还是很高兴的,至少我写的东西得到了认可,但是我也要向大家说明一下,毕竟我现在还有工作,平时工作很忙,所以只能通过闲暇的时间来写,上次的两篇就是在出差的高铁上完成的。

上一章的一个典型应用其实只是为了让大家尽快出点“成绩”,好对UE4的代码开发有点兴趣,这次我们继续回到正规,先从UE4的基本渲染说起。

在第一章里我们也讲过了,渲染是显示平台的核心,所以渲染的代码肯定在Source\Runtime中,在这个接近核心的模块中,比较重要的内容包括三大类:渲染模块(比方RenderCore和Renderer)、RHI抽象层和RHI实现层(比方Windows里的D3D11RHI和Apple里的MetalRHI)。

RHI即Render hardware interface,一般翻译为渲染硬件层接口,目的是想做一套与硬件无关与平台无关的接口。这个概念虽然听起来很高大尚,但是不是UE4专用的,至少我知道OSG里就有GraphicsWindowsX11和GraphicsWindowsIOS等类.

UE4相对来说做的更彻底。它在平台无关之上,还想做到硬件无关,它的接口类里,其实就是几个简单的虚函数,平台运行的时候,会自动判断在哪个平台上,从而决定是调用DX11的实现,还是调用OpenGL的实现。

当然,为了具备有前瞻性,UE4还实现了Vulkan的接口,有兴趣的可以看看,所说实现的还不错,反正我是看不懂这么有技术含量的东西。

要想跟踪渲染流程,最好的办法是找到Tick()函数,在Runtime\Launch\Private中有个LaunchEngineLoop.cpp文件,LaunchEngineLoop.cpp中有一个FEngineLoop::Tick()函数。找到这个函数,可能不太容易,方法有三种:第一种连猜带蒙。第二种从网上先查资料。第三种,从初始化函数跟过来。

在这个函数中下个断点,只要程序运行起来,这是必进的,而且,不取消断点,基本上跑不动。所以,这里我们肯定发现在了正确的函数。

这个函数做了很多的事。如果想认真学习UE4,我希望大家把这个函数至少看完一遍。

这个函数其实做了很多事,首先,进行心跳帧同步,然后进行各种检测,比方不能在加载动画文件的时候进行,或者不能在基准模式下(benchmark mode)操作。

接下来,做的内容就是比较实在了。

 

然后才开始真正的处理,在这之前,调用了AdvanceFrame函数,总之,搞得特别正式,接下来,和大家说,我要处理新的一帧了,在这之前还要调用计算外部的FPS/MS的平均值,然后做些预处理的任务。

ENQUEUE_UNIQUE_RENDER_COMMAND,这个宏要注意一下,因为,和真正渲染的宏ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER,是同一类的,有兴趣的话,进去看看,这个宏写的很怪异。

接下来,还防止程序有事没事的跑一帧两帧的。

然后,就是增加外部回调了。把这些事做完。到了GEngine的Tick函数处。这里也算是接近“更核心”的地方了。

接下来又是一层保护。

再接下来是两个重要的步骤,一个是Shader管理,一个是任务同步管理。 再接下来是从属应用的管理,其实是辅助程序的管理。

再接下来是两个宏,由于是宏,所以,有可能被注释掉,所以肯定不是主线,从字面上看,就是从此是自动控制器,一个是自动操作器。

接下来,就是我们上面讲了半天的RHI,在我的电脑上,跟进去,就是FD3D11DynamicRHI,可见,我上面说的,有一定道理。

再接下来是帧统计,这里有一个甩掉前六帧的统计用法,官方给出的理由是加载时间忽略。

接下来就是清理无效的objects了。

再接下琰,我们又看到了ENQUEUE_UNIQUE_RENDER_COMMAND,只不过,这里是EndFrame,和开始的那个对应(BeginFrame)。大家可以简单的理解为,在这两个宏之间的,才是一帧里真正要做的事。

再接下来就是统计了。对主流程没有什么太大作用。

跟踪完后,我们在这个函数的任意位置,加一个断点,再回过头来看一下,最终的入口在WinMain函数里。可见,在开头说的三种方法中,我应该大概似乎可能是用的第三种方法。

从这里再跟踪一步。到GuardedMain中,我们可以看到一个循环:

玩过任何一个三维平台的同志,应该都会很清楚,几乎所有平台的最根本渲染都是一个类似的循环。而这个循环,也是最基本的一个循环,在这里,我们可以认为,我们在主线程中。

我们都知道,当前流行的平台,不可能是单线程,那么其它线程入口都在哪呢?

想一下,我们在上面跟踪的时候,是不是重点强调了GEngine->Tick,我们从这里出发,继续找,一直走到FGraphEventRefConstructAndDispatchWhenReady

看到了没,又是这个系列宏ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER,由ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER来产生一个TGraphTask,从而驱动渲染线程。

走到这里,大概明白了吧。

可以说UE4的基础渲染其实很简单,缺省和OSG了、OGRE了什么的平台也差不了多少,一个 while,然后,一堆回调,再加上一些子线程。关键是我们想要什么,就找个点切入进去。

这篇关于格格她爹讲程序---用传统程序员的方式玩UE4(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/892845

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息,然后展示在页面上。 效果展示 首次发送需要设置昵称 发送消息与消息展示 提示用户不能发送空消息 后端接口 发送消息 DB = []@ro

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓

这些心智程序你安装了吗?

原文题目:《为什么聪明人也会做蠢事(四)》 心智程序 大脑有两个特征导致人类不够理性,一个是处理信息方面的缺陷,一个是心智程序出了问题。前者可以称为“认知吝啬鬼”,前几篇文章已经讨论了。本期主要讲心智程序这个方面。 心智程序这一概念由哈佛大学认知科学家大卫•帕金斯提出,指个体可以从记忆中提取出的规则、知识、程序和策略,以辅助我们决策判断和解决问题。如果把人脑比喻成计算机,那心智程序就是人脑的