• Vulkan API的性能及兼容性


    1)Vulkan API的性能及兼容性
    ​2)FrameTiming.gpuFrameTime获取GPU耗时有什么条件
    3)MMO里面的寻路网格如何制作
    4)万国这种联盟边界的实现思路


    这是第314篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

    Rendering

    Q:请问一下目前Android设备用Vulkan API的项目多吗,性能、兼容性及稳定性如何?

    A:Vulkan用的比较好的应该是《天涯明月刀》手游,《王者荣耀》在三星平台上也开发过一段时间的Vulkan的版本,但是之后好像就更新打回ES版本了。

    感谢萧小俊@UWA问答社区提供了回答

    有没有更多的开发者能提供一些Vulkan稳定性相关的经验分享呢?欢迎大家转至社区交流。


    Rendering

    Q:手机为什么上获取不到FrameTiming.gpuFrameTime的时间?

    版本Unity 2020.3,手机华为 Mate 30P,CPU时间可以显示但GPU时间获取不到,测试代码如下:

    1. using System;
    2. using UnityEngine;
    3. using Unity.Profiling;
    4. public class FrameTimingsHUDDisplay : MonoBehaviour
    5. {
    6. GUIStyle m_Style;
    7. // Profiling state.
    8. private int frameCount = 0;
    9. private float accumulatedFrameTimeCPU = 0.0f;
    10. private float accumulatedFrameTimeGPU = 0.0f;
    11. private float frameSampleRateMS = 0.0f;
    12. private FrameTiming[] m_FrameTimings = new FrameTiming[1];
    13. void Awake()
    14. {
    15. m_Style = new GUIStyle();
    16. m_Style.fontSize = 15;
    17. m_Style.normal.textColor = Color.white;
    18. }
    19. void OnGUI()
    20. {
    21. CaptureTimings();
    22. var reportMsg =
    23. $"\nCPU: {m_FrameTimings[0].cpuFrameTime:00.00}" +
    24. $"\nMain Thread: {m_FrameTimings[0].cpuFrameTime:00.00}" +
    25. $"\ncpuTimeFrameComplete: {m_FrameTimings[0].cpuTimeFrameComplete:00.00}" +
    26. $"\ncpuTimePresentCalled: {m_FrameTimings[0].cpuTimePresentCalled:00.00}" +
    27. $"\nGPU: {m_FrameTimings[0].gpuFrameTime:00.00}" +
    28. $"\nCPUTotal: {accumulatedFrameTimeCPU:00.00}" +
    29. $"\nCPUAverage: {(accumulatedFrameTimeCPU / frameCount):00.00}" +
    30. $"\nGPUTotal: {accumulatedFrameTimeGPU:00.00}" +
    31. $"\nGPUAverage: {(accumulatedFrameTimeGPU / frameCount):00.00}";
    32. var oldColor = GUI.color;
    33. GUI.color = new Color(1, 1, 1, 1);
    34. float w = 300, h = 210;
    35. GUILayout.BeginArea(new Rect(32, 100, w, h), "Frame Stats", GUI.skin.window);
    36. GUILayout.Label(reportMsg, m_Style);
    37. GUILayout.EndArea();
    38. GUI.color = oldColor;
    39. }
    40. private void CaptureTimings()
    41. {
    42. FrameTimingManager.CaptureFrameTimings();
    43. uint frameTimingsCount = FrameTimingManager.GetLatestTimings(1, m_FrameTimings);
    44. if (frameTimingsCount != 0)
    45. {
    46. accumulatedFrameTimeCPU += (float)m_FrameTimings[0].cpuFrameTime;
    47. accumulatedFrameTimeGPU += (float)m_FrameTimings[0].gpuFrameTime;
    48. }
    49. else
    50. {
    51. accumulatedFrameTimeCPU += Time.unscaledDeltaTime * 1000.0f;
    52. // No GPU time to query.
    53. }
    54. ++frameCount;
    55. }
    56. }

    以上问题有哪位大拿也曾经做过类似的测试,可以来分享一下,欢迎转至社区交流。


    Mesh

    Q:MMO里面的寻路网格如何制作呢?

    自动生成的不精准。美术制作是拼起来的,某些点忘记连或者重叠会有问题。一般是怎么解决的呢?现在就是美术单独做的Mesh,但是他们的Mesh如果由两个面点没连着,或者某个三角形的2个点,重叠了,就会有问题。

    A:简单说下思路,把地形当做一个2D平面,代码创建一个x*y大小的Mesh,格子大小保持Unity的单位1就行,这个Mesh了你控制好覆盖这个2D平面,然后从Mesh的每个顶点坐标向下发射射线,检测碰撞,计算当前顶点的高度。算好后,就修改Mesh的各个顶点高度。这样,Mesh成型后就是个大概的地面建筑模型了。

    然后编个简单Shader,只显示顶点色和边沿。这方面网上有很多Shader。Mesh就用这个Shader,即可显示网格样子。实在不行,你Scene里面的网格模式。

    接着就是写代码,根据鼠标点击滑动坐标,把对应的Mesh网格涂色即可,比如涂绿色为路面。红色为障碍。最后计算这些格子的x,y坐标。用A*算法寻路即可。

    感谢牛头人不服@UWA问答社区提供了回答,欢迎大家转至社区交流。


    Rendering

    Q:请教一下万国这种联盟边界的实现思路。

    是多个Quad交叉重叠后,想办法把他们交叉的区域不绘制?还是直接自己Draw一个这样的多边形的Mesh?

    A1:万国这个应该用的地图16位状态拼接的方法。可以借鉴暴雪的地图地表的生成方式。

    感谢1 9 7 3-311135@UWA问答社区提供了回答

    A2:万国是Draw Mesh。在不同的LOD下,精细度不同。我之前抓过Mesh看过。

    感谢承影@UWA问答社区提供了回答

    是否还有更多的实现方法呢?欢迎大家转至社区交流。

    封面图来源于网络


    今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

    官网:www.uwa4d.com
     

  • 相关阅读:
    PostgreSql 数据库,根据库名称,查询这个库下面的所有表名称和这个表的注释
    React基础知识大汇总
    Python教程:global、nonlocal关键字区别与用法
    agent+ddd实践案例
    Kotlin高仿微信-第3篇-主页
    基于JAVA,SpringBoot,Vue,UniAPP智能停车场小程序管理系统设计
    日文翻译-在线免费日文翻译软件
    stdc++.h
    识别人体神经网络的软件,识别人体神经网络系统
    flink 运行方式和部署模式
  • 原文地址:https://blog.csdn.net/UWA4D/article/details/128001766