虚幻引擎独立应用程序初探

前言

虚幻引擎真的是一个非常巨大的C++包括,里面有大量开箱即用的功能和类库。今天想,如果能把这些库用来开发一些小工具,是不是很安逸呢?然后做了一下尝试,发现人家本身就支持。

官方示例

在引擎的Engine\Source\Programs的这个目录,都是独立的虚幻程序,即可不依赖图像界面的控制台exe程序,如下图

f6d8c587b008e92b47a4d1f246b719da.png

其中最经典的就是BlankProgram这个工程,大家可以基于这个来进行改造。

通过dx获取显卡信息

这里我通过编写一个通过dx的api来获取显卡信息,来展示虚幻引擎的强大。首先随便新建一个UE的C++工程,然后在Source下面新建一个Programs文件夹,将BlankProgram拷贝进去进行一些改造即可。之后修改两个地方的值

c9a9af57f9f4528dfd9f2645b815f2ac.png

然后重新生成工程文件,就会多出一个控制台的程序,如下图

8868002d29018e56155ba8e30f328104.png

由于我们需要调用dx12的api接口,我们可以直接包含这个模块,在Build.cs中进行修改。修改结果如下

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class HelloUECpp : ModuleRules
{
 public HelloUECpp(ReadOnlyTargetRules Target) : base(Target)
 {
        

        PrivateIncludePaths.Add(System.IO.Path.Combine(EngineDirectory, "Source/Runtime/Launch/Public"));
  PrivateIncludePaths.Add(System.IO.Path.Combine(EngineDirectory, "Source/Runtime/Launch/Private"));      // For LaunchEngineLoop.cpp include
        PrivateIncludePaths.Add(System.IO.Path.Combine(EngineDirectory, "Source/Runtime/D3D12RHI/Public"));
        PrivateIncludePaths.Add(System.IO.Path.Combine(EngineDirectory, "Source/Runtime/D3D12RHI/Private"));
        PrivateIncludePathModuleNames.Add("DX12");


        //PrivateDependencyModuleNames.Add("D3D12RHI");
        PrivateDependencyModuleNames.Add("Core");
  PrivateDependencyModuleNames.Add("Projects");
        PrivateDependencyModuleNames.Add("DX12");


    }
}

PrivateIncludePaths 表示要包含的目录,这里需要用到D3D12RHI的一些定义,所以就直接包含了 PrivateIncludePathModuleNames.Add("DX12"); 表示包含DX12模块的目录

之后包含#include "Windows/D3D12ThirdParty.h" 头文件,即可编写一个查看dx显卡的程序了

static void SafeCreateDXGIFactory(IDXGIFactory4** DXGIFactory)
{
 CreateDXGIFactory(__uuidof(IDXGIFactory4), (void**)DXGIFactory);
}
static HRESULT EnumAdapters(int32 AdapterIndex, DXGI_GPU_PREFERENCE GpuPreference, IDXGIFactory2* DxgiFactory2, IDXGIFactory6* DxgiFactory6, IDXGIAdapter** TempAdapter)
{
 if (!DxgiFactory6 || GpuPreference == DXGI_GPU_PREFERENCE_UNSPECIFIED)
 {
  return DxgiFactory2->EnumAdapters(AdapterIndex, TempAdapter);
 }
 else
 {
  return DxgiFactory6->EnumAdapterByGpuPreference(AdapterIndex, GpuPreference, IID_PPV_ARGS(TempAdapter));
 }
}

INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{
 TRefCountPtr<IDXGIFactory4> DXGIFactory4;
 SafeCreateDXGIFactory(DXGIFactory4.GetInitReference());
 if (!DXGIFactory4)
 {
  return 0;
 }
 TRefCountPtr<IDXGIFactory6> DXGIFactory6;
 DXGIFactory4->QueryInterface(__uuidof(IDXGIFactory6), (void**)DXGIFactory6.GetInitReference());

 DXGI_GPU_PREFERENCE GpuPreference = DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE;
 TRefCountPtr<IDXGIAdapter> TempAdapter;
 for (uint32 AdapterIndex = 0; EnumAdapters(AdapterIndex, GpuPreference, DXGIFactory4, DXGIFactory6, TempAdapter.GetInitReference()) != DXGI_ERROR_NOT_FOUND; ++AdapterIndex)
 {
  if (TempAdapter)
  {
   DXGI_ADAPTER_DESC desc;
   TempAdapter->GetDesc(&desc);

   std::wcout << "AdapterIndex : "<< AdapterIndex
    << " | Adapter: " << desc.Description
    << " | Device ID: " << desc.DeviceId
    << " | Vendor ID: " << desc.VendorId 
    << " | DedicatedVideoMemory: "<< desc.DedicatedVideoMemory
    << " | AdapterLuid.LowPart: " << desc.AdapterLuid.LowPart
    << " | AdapterLuid.HighPart: " << desc.AdapterLuid.HighPart
    << std::endl;
   
  }
 }
}

可以直接编译成控制台程序,并输出显卡信息如下

768b01c145673a09df68117b28449755.png

总结

本文主要探讨了下如何利用好虚幻引擎的库来做一些小工具,一些小尝试。确实是非常方便,我们可以省去很多依赖库的编译工作。

我的知识星球

请关注公众号g0415shenw 加入知识星球。
星球地址 https://t.zsxq.com/15EvfoA7n
星球有本人经验心得全部总结 涵盖音视频,gb28181、虚幻引擎、其他编程工具等等。另外还可以在星球提问,我会尽力答复,等于给您多了一个引路人。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值