妄想的咸鱼吧 关注:151贴子:2,416
如果想在UE4中实现在接触到不同物体表面时发出不同的声音或者效果时,比如人在不同的表面上速度会不同,子弹打到不同的表面时会出现不同的特效等,我们可以使用UE4中的表面类型来实现(Surface Type),基础的使用已经在官方文档里面有比较清楚的描述,这里记录下使用中遇到的问题。
如果调用SetActorLocation或者AddActorLocalOffset来移动物体,并且勾选了Sweep选项,但是就是没有返回物理材质,这个时候需要勾选 Return Material On Move选项,这样就会在Hit Result里面返回物理材质了。


IP属地:安徽1楼2017-03-18 16:06回复
    地形物理材质的指定 UE4中可以为每个Layer单独指定物理材质,如下图所示:

    如果layer中没有指定材质,那么会使用Landscape上面的Default Phys Material。


    IP属地:安徽2楼2017-03-18 16:06
    回复
      UE4 性能优化方法(工具篇)


      IP属地:安徽3楼2017-03-18 16:07
      回复
        本文依据UE4官方文档以及官方博客等总结而来,可能不全面,后面会陆续添加。内置工具的详细说明请参考官方文档。
        游戏帧率很低,或者有卡顿的现象,可能会有很多原因,这时候不要乱猜,比如是不是人物太多了或者渲染的东西太多了,这样猜意义是不大的,可能会浪费很多时间,但是总找不到点上,当然如果运气好也可以找到瓶颈,这个时候我们可以借助相应的工具来查找性能瓶颈。此处我们仅以UE4来展开讲解。
        首先要确定瓶颈是在CPU还是GPU,为了找到是谁,以非debug版本启动你的程序,并且在控制台上输入stat unit 命令,如果是在android平台上可以同时按下四个手指,打开控制台,输入stat unit,它会显示如下图所示:

        Frame时间是产生一帧花的总时间,由于逻辑线程(Game)和渲染线程(Draw)在一帧结束的时候需要同步,一帧花的时间经常跟其中的一个线程花的时间 相近。GPU时间测量了显卡渲染当前场景花的时间。由于 GPU时间是跟当前帧同步的,所以它跟一帧花的时间也基本差不多。
        如果一帧花的时间跟逻辑线程的时间比较接近,那么瓶颈在逻辑线程,相反如果跟渲染线程的时间比较接近,那么瓶颈在渲染线程。如果两个时间 都不接近,但跟GPU时间比较接近,那么瓶颈在显卡上。
        当然也可以使用一些第三方工具,比如intel vtume,、aqtime等,移动平台上可以使用Apple Instruments、NVIDIA Tegra System Profiler、ARM DS-5等 。


        IP属地:安徽4楼2017-03-18 16:07
        回复
          瓶颈在逻辑线程
          可以通过性能分析来确定,通过~打开控制台里面输入"stat startfile",让它运行一会至少10s来获取一个多帧的平均值。如果时长过长,那么生成的文件就会很大。通过stat stopfile来结束性能分析。一个后缀为ue4stats的文件会在工程的路径下产生,如果是android的话会在你安装的目录下面生成 一个profile目录。如果想要查看分析结果,必须把这个文件拷贝到pc上,可以使用adb pull {ue4stats 完整路径} {pc 保存路径}来拷贝文件到pc上。
          这个时候你就可以使用UnrealFrontEnd(跟UE4Editor在同级目录)来打开分析的结果,或者在UE4Edtior里面通过window-->Developper ToolsàSession Frontend,打开后切换到Profiler面板,通过load来打开ue4stats文件。

          当打开后你就可以自己来查看耗费时间的地方了

          如果要查看卡顿,可以在时间线上查看高峰的地方,通过选择Maximum而不是Average,这样它就会显示一些峰值,如下图所示。


          IP属地:安徽5楼2017-03-18 16:08
          回复
            GPU分析
            如果是在PC平台上可以使用ProfileGPU命令或者使用快捷键Ctrl+Shift+,

            也可以使用一些第三方工具来测试,pc平台上如 Intel GPA、Nvidia NSight visual Studio edition,移动平台比如高通的adreno profiler、NVIDIA Tegra Graphics Debugger、ImgTec PVRTune and PVRTrace、ARM Mali Graphics Debugger等,苹果的XCode等均可以用来分析。


            IP属地:安徽6楼2017-03-18 16:08
            回复
              一些常用的命令
              stat unit

              stat scenerendering

              stat engine

              stat initviews

              stat game

              Stat Slow

              ViewMode ShaderComplexity
              Stat UnitGraph
              完整的stat命令参考https://docs.unrealengine.com/latest/CHN/Engine/Performance/StatCommands/index.html


              IP属地:安徽7楼2017-03-18 16:09
              回复
                几个对分析最有用的变量:
                r.SetRes 改变屏幕,或窗口的分辨率。
                r.VSync 开启/关闭垂直同步(可能依赖于是否原生全屏)。
                r.ScreenPercentage 用于减小内部实际渲染分辨率,画面会在重新放大。
                r.AllowOcclusionQueries 用于禁用遮挡(可以让场景运行的更慢)。
                r.TiledDeferredShading 能够关闭基于 Tile 的延迟光照技术(GPU粒子的光影则没有退回方法)。
                r.TiledDeferredShading.MinimumCount 能够调整使用多少灯光应用在基于 Tile 的延迟光照技术(视觉上并没有差异但性能会有不同)。
                Pause 暂停游戏或者 Matinee(分析时更加稳定,但禁用了 Update/Tick)。
                Slomo 能够对游戏进行加速或者减速播放。
                r.VisualizeOccludedPrimitives 显示被裁剪掉的物件的外盒框。
                StartFPSChart StopFPSChart 请看下文。
                r.SeparateTranslucency 这是一个用于修复半透明情况下景深的问题的功能,如果不需要的时候可以把它关闭,并有其他影响(查阅 SceneColor)。
                r.Tonemapper.GrainQuantization 用于关闭在 Tonemapper 中添加的噪点来避免 Color Banding,由于 8bit 量化和较小的质量改进在输出为 10:10:10 并不必须。
                r.SceneColorFormat 能够选用不同的 SceneColor 格式(默认是 64bit 的最佳质量,并支持屏幕空间子表面散射)。
                FX.AllowGPUSorting 禁用粒子排序(在大量粒子的使用可以妥协使用)。
                FX.FreezeParticleSimulation 禁止粒子的更新。
                r.SSR.MaxRoughness 调整屏幕空间反射(SSR)粗造度的最大值,并覆盖后处理中的该设置。请查阅 Show Flag VisualizeSSR。


                IP属地:安徽8楼2017-03-18 16:09
                回复
                  命令行选项
                  有些功能可以在命令行中进行关闭,比如 UE4.exe –NoSound
                  几个对分析比较有用的开关是:
                  -NoSound 禁用声音和音乐系统。
                  -NoTextureStreaming
                  关闭贴图 steaming(对于隔离问题时很有帮助)。
                  -NoVerifyGC 否则需要预期在 Release 版本中每 30 秒会遇到的性能波动。
                  -NoVSync 能够更快的渲染但会导致画面撕裂,尤其是在高帧数下。
                  -Streaming 在使用 StartFPSChart/StopFPSChart 很有用,能够从一个非 windows 设备上来获取数据并用于进一步检测(假设我们是实时的 cook 数据)


                  IP属地:安徽9楼2017-03-18 16:09
                  回复
                    UE4 减少APK包的大小


                    IP属地:安徽10楼2017-03-18 16:09
                    回复
                      本文依据官方文档 Reducing APK Package Size整理而来,不过我会陆续添加自己减少包大小的心得。
                      ETC1 纹理
                      当使用ETC1打Android包时,注意ETC1是不会压缩带Alpha通道的纹理的。当你的纹理需要Alpha通道而又不得不使用ETC1压缩时,可以使用两张分开的纹理,一张颜色一张存放Alpha值。
                      创建一个空的项目
                      创建新的工程时,不要带初学者内容,如果要使用的话使用UE4的迁移工具来导入想要的资源。
                      压缩Cook过的内容
                      最容易且最快的方法就是告诉UE4要压缩打包的APK包。可以通过EditàProject Setting,通过点击红色区域的高级设置找到Create compressed cooked packages来启用压缩。这样一般包的大小会减小50%以上,比如你原来有100兆,那么压缩后一般会小于50兆。

                      设置工程的关卡
                      正确地设置默认启动的关卡可以减少APK的大小(因为Android中有obb文件,所以此处应该是说的是减小apk最小包的大小)通过点击EidtàProejct settings来设置默认加载的关卡。


                      IP属地:安徽11楼2017-03-18 16:10
                      回复
                        检查Cook的内容
                        为了确定只跟工程相关的文件添加到了apk中,你可以在Cooked文件夹中来检查所有cook的资源,它在(ProjectName)\Saved\Cooked文件夹下。
                        开发版和发布版大小(Development VS Shipping)
                        如果要发布程序切记要发布Shipping版本,一般发布版本可能比开发版本少14%左右。
                        针对单个设备设置LOD级别
                        UE4 4.8及以后可以为每个设置指定纹理大小。
                        移除未使用的内容
                        当最终版本要发布时,记得移除未使用的或者用途测试用途的内容。
                        移除未使用的插件
                        在编辑器中关闭未使用的插件可以确保不会把无用的内容和代码打包进最终的apk包中,因为有些包是需要一个资源和代码来运行的。通过WindowsàPlugins来禁用未使用的组件。
                        打包黑名单
                        UE4 4.9及以后版本可以通过在工程Build/Platform/(Target Platform Folder)目录中添加打包一些文本文件来排除部分或者路径下全部文件的打包。

                        下面是一个示例:

                        前面三个可以安全删除,但是AssetRegistry.bin在某些工程中可能是需要的,所以需要严格地测试来确保程序正确的运行。
                        最大动态点光源数量
                        UE4及后续版本中添加了设置最大动态点光源数量的选项。通过设置它的值可以一定程度上减小apk的大小,主要是减少了编译出的shader的个数及大小。这个属性在EditàProject SeetingsàMobileàMax Dynamic Point Lights


                        IP属地:安徽12楼2017-03-18 16:10
                        回复
                          UE4中使用数据表(Data Table)


                          IP属地:安徽13楼2017-03-18 16:10
                          回复
                            本文依据官方文档数据驱动游戏性元素整理而来。
                            做过游戏的应该都清楚,如果游戏稍微有点规模,那么使用数据驱动来做游戏一般是必不可少的一步,一般也就是策划通过本表的方式来解决。下面我们来简单说一下UE4中如何使用DataTable来实现数据驱动开发。
                            顾名思义,数据表就是以有意义且有用的方式将各种相关的数据归类的表格, 其中,数据字段可以是任何有效的 UObject 属性,包括资产引用。在设计师将 CSV 文件导入数据表前,程序员必须创建行容器以指示引擎如何解释数据。 这些数据表包含了列名,这些列名和基于代码的UStruct结构以及它的(子)变量一一对应, 这个UStruct的结构必须继承自FTableRowBase才可以被导入器辨识。
                            我们随便建了一张测试表(csv)如下所示:
                            Id,HP,Icon,BlueprintKey
                            1,100,Texture2D'/Game/FirstPerson/Textures/Test.Test',Class'/Game/FirstPerson/BP_DataTableTest.BP_DataTableTest_C'
                            2,200,Texture2D'/Game/FirstPerson/Textures/Test.Test',Class'/Game/FirstPerson/BP_DataTableTest.BP_DataTableTest_C'
                            其中BP_DataTableTest是一个继承自AActor的一个蓝图类,BP_DataTableTest_C是实际生成的蓝图类。
                            对应的C++代码如下所示:
                            1234567891011121314151617181920212223242526 /** 注意此结构体中的成员变量的名字要跟csv表中的相同,因为它是UE4里面是通过反射系统来实现数据的初始化的,当然名字不同也可以,但是它的元数据中的DisplayName就必须跟表中的字段值对应,具体可以参考DataTableCSV.cpp中的实现就可以了解。*/USTRUCT(BlueprintType)struct FDataTableTestData : public FTableRowBase{ GENERATED_USTRUCT_BODY() public: FDataTableTestData() : HP(0) {} UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DataTable Test") int32 HP; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DataTable Test") TAssetPtr<UTexture2D> Icon; // 注意此变量名跟csv中的不同,但是我把它的DisplayName设置成了"BlueprintKey"这样也是可以的 // 还有注意我使用了TAssetSubclassOf而不是TAssetPtr,因为如果是类的话需要使用这个。 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DataTable Test", DisplayName = "BlueprintKey") TAssetSubclassOf<AActor> BP;};
                            代码编译完成后,我们就可以把刚才创建好的csv文件导入到编辑器中,通过Import导入文件,导入后如下图所示:


                            IP属地:安徽14楼2017-03-18 16:11
                            回复
                              在蓝图里面用法如下图所示:

                              注意:
                              在上述数据表示例中,引用的资产为延迟加载资产(TAssetPtr 处理此事项,我们最终使用了LoadAsset和Load Class Asset来实现异步加载,注意右上角的时钟图标)。如果资产字段类型设置为 UTexture,则将在加载数据表时加载所有资产。关于UE4中资源的同步和异步加载问题,将在另一篇文章中单独来讨论。


                              IP属地:安徽15楼2017-03-18 16:11
                              回复