前言
虚幻引擎真的是一个非常巨大的C++包括,里面有大量开箱即用的功能和类库。今天想,如果能把这些库用来开发一些小工具,是不是很安逸呢?然后做了一下尝试,发现人家本身就支持。
官方示例
在引擎的Engine\Source\Programs
的这个目录,都是独立的虚幻程序,即可不依赖图像界面的控制台exe程序,如下图
其中最经典的就是BlankProgram这个工程,大家可以基于这个来进行改造。
通过dx获取显卡信息
这里我通过编写一个通过dx的api来获取显卡信息,来展示虚幻引擎的强大。首先随便新建一个UE的C++工程,然后在Source下面新建一个Programs文件夹,将BlankProgram拷贝进去进行一些改造即可。之后修改两个地方的值
然后重新生成工程文件,就会多出一个控制台的程序,如下图
由于我们需要调用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;
}
}
}
可以直接编译成控制台程序,并输出显卡信息如下
总结
本文主要探讨了下如何利用好虚幻引擎的库来做一些小工具,一些小尝试。确实是非常方便,我们可以省去很多依赖库的编译工作。
我的知识星球
请关注公众号g0415shenw 加入知识星球。
星球地址 https://t.zsxq.com/15EvfoA7n
星球有本人经验心得全部总结 涵盖音视频,gb28181、虚幻引擎、其他编程工具等等。另外还可以在星球提问,我会尽力答复,等于给您多了一个引路人。