文/UWA技术知识分享

制作

Q1:我最近在Unity中制作角色的渲染效果,目前的工作流程是这样的:1)程序在Unity中写Shader调效果;2)美术在3dmax修改模型顶点色和法线等资源,修改完导出给程序;3)程序将资源导入Unity中验证效果。目前需要频繁地修改资源、导出导入资源,效率比较低下。

所以我有以下两个问题:

1、如何在3ds max中写着色器,美术修改模型后能及时看到效果?

2、成熟的制作流程是什么样的?

A1:这个不难的,让渲染程序员简单看一下Maya或者Max的文档,几个小时基本都是可以搞定的,Max或者Maya都有例子和文档,比如Max的话就是用DirectX Shader Material,不用把这个想得很难,好好看文档。

我觉得本质上主要是想要所见即所得,所有的工作也都是为了这个目的。渲染对美术资源的修改大多需要定制化,例如靠刷顶点色控制描边,靠改顶点法线去改善光照,所以如果把Shader做到Max里可以大大提高美术的制作流程,而不是总是导入导出。通常的流水线是:维护一个和引擎预览效果一致的Max(或Maya)Shader材质,再加一个自定义的法线编辑工具(如果美术觉得内置的不够用,比如Max的法线编辑比较困难),这样在修改美术资源保证效果一致性就好了。

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

题主补充:对于第一个问题,读书哥提供了一个方法:Max里可以用HLSL写,有DX9/11的Sample,但是问题挺多的,Driver建议用Nitrous Direct 3D 9,记得关掉Gamma/LUT和SSAO。

附上参考文档

欢迎大家转至社区进行进一步交流

UI

Q2:我们打开UI界面Profiler峰值显示 Canvas.SendWillRenderCanvases消耗了50%CPU开销,Canvas.SendWillRenderCanvases 消耗80ms,Graphic.Rebuild 消耗了72ms,请问有什么办法可以优化呢?

UWA:这是某个/某些大量的UI界面元素的重建开销,建议如下:

(1)先通过“动静分离”原则检测是否有不必要的静态UI网格参与了重建;

(2)UI界面是否过于复杂,UI层级或者网格量是否过大;

(3)在UWA性能简报中查看对应的解决方案和相关视频,磨刀不误砍材工。下图中可以看到这些参数在每次测评中的走势,耗时下降的很快:)

165239btmtdk5k77dadaa7.png
该问题由UWA提供,欢迎大家转至社区进行进一步交流

物理

Q3:如下图,我们物理模块中没有用到任何碰撞对和Rigidbody,为什么还会有物理模块的耗时呢?

165240f7hobjbw5z4nnhjw.png
165242nj00w6wuvwp40ipq.png
UWA:题主的Unity版本是多少的?如果是Unity 5.4版本以后,那确实不太正常,因为Unity引擎在5.4后对物理系统做了调整。

如果是Unity 5.4之前版本,那么就是比较正常了,因为无论你是否使用,物理模块每帧都在运转,你可以理解为是空转。对此,题主需要查看报告中“重要参数解析->引擎性能参数”中的“Physics.Processing”或“Physics.Simulate”一页,里面有这两个函数的调用次数。很多时候,物理模块即便没怎么用,但由于是每20ms运行一次(默认情况下),也会在同一帧中运行很多次,如下图所示。所以,物理模块有个特点,就是当你项目卡的时候,它会让你的项目更卡:)对于这种情况,题主只需要去优化其他模块,当其他模块的耗时下来后,你会发现物理模块的耗时自然也就下来了。

165242jgcwpjpwgwwo8zta.png
该回答由UWA提供,欢迎大家转至社区进行进一步交流

资源管理

Q4:我最新在使用Unity 2018.1.0 Beta 13的版本碰到一个问题,不过我相信低版本也可能有同样的问题。我使用Unity 2017新出的SpriteAtlas进行Sprite打包,并且生成了AssetBundle,发现这种方式和tag不一样,自己还需要处理延迟绑定,因此需要自己去实现SpriteAtlasManager.atlasRequested的回调。

于是我将所有SpriteAtlas的Include Build都去掉,打包了AssetBundle,但是在实现SpriteAtlasManager.atlasRequested碰到一个问题:如果我使用同步接口,也就是AssetBundle.LoadFromFile和AssetBundle.LoadAsset的接口加载SpriteAtlas,并且在SpriteAtlasManager.atlasRequested内部就直接回调action,则不会有问题;如果我使用异步接口,也就是AssetBundle.LoadFromFileAsync以及AssetBundle.LoadAssetAsync,等加载完成之后再回调action,也就是在SpriteAtlasManager.atlasRequested以外,则会导致图片无法加载,无论是编辑器还是打包出来(我测试的Windows的包),都会导致UGUI界面是花的。

我在官方咨询但是没有结果:https://forum.unity.com/threads/ ... ed-in-editor.524801,想请教一下这个算是Unity的Bug还是我的某些理解操作有问题导致的?

UWA:首先“发现这种方式和tag不一样,自己还需要处理延迟绑定”,这里并不是必须的,如果勾选了Include in build,是不需要自己处理binding的,直接加载实例化就可以了。只是需要注意这个Bug,目前会导致Bundle中图集冗余:https://answer.uwa4d.com/question/5a822325847802258a06509e

如果题主就是希望做late binding的,那么从题主的描述中看,应该是说SpriteAtlasManager.atlasRequested中必须直接回调action才有效,用了异步(相当于隔了几帧)之后才回调action就无效。

所以做了个例子尝试复现,但没有出现类似的问题,下面是测试代码,UI Prefab(里面用到了某Sprite)和对应的SpriteAtlas做依赖打包,分别记为prefabBundle和saBundle。加载的代码如下,版本是2017.2.2。
 

  1. IEnumerator Start ()
  2. {
  3. var loadOp = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + / + prefabBundle);
  4. yield return loadOp;
  5. var prepre = loadOp.assetBundle.LoadAsset<GameObject>(prop_parachute);
  6. GameObject.Instantiate(prepre);
  7. }
  8. void OnEnable()
  9. {
  10. SpriteAtlasManager.atlasRequested += RequestLateBindingAtlas;
  11. }
  12. void OnDisable()
  13. {
  14. SpriteAtlasManager.atlasRequested -= RequestLateBindingAtlas;
  15. }
  16. void RequestLateBindingAtlas(string tag, System.Action<SpriteAtlas> action)
  17. {
  18. StartCoroutine(LoadFromAssetBundle(tag, action));
  19. }
  20. IEnumerator LoadFromAssetBundle(string tag, System.Action<SpriteAtlas> action)
  21. {
  22. var loadOp = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + / + saBundle);
  23. yield return loadOp;
  24. var loadOp2 = loadOp.assetBundle.LoadAssetAsync<SpriteAtlas>(tag);
  25. yield return loadOp2;
  26. var sa = loadOp2.asset as SpriteAtlas;
  27. action(sa);
  28. }


就 ASTC压缩方式本身来说是没有问题的。对纹理尺寸无要求,支持多个品质等级。但问题在于 OpenGL ES 3.2 以后才支持,也就是一大批中低端机就没戏了。比如红米2,小米4。iOS 平台的 iPhone 6 之后才支持。不支持的结果就是纹理会自动转成 RGB24/RGBA32。所以我们项目尝试了一下 ASTC 又用回 ETC2 了。

感谢史亚征@UWA问答社区提供了回答

欢迎大家转至社区进行进一步交流:

https://answer.uwa4d.com/question/5ac2eb4c425802635474fbef

关于UWA:

由侑虎科技开发的游戏/VR应用性能优化平台,目前提供 1)性能诊断与优化 2)资源检测与分析 3)UWA GOT 三大工具,帮助开发者在短时间内大幅度提升性能表现;同时其搭建的知识分享的博客和答疑解惑的互动平台使广大开发者收益。

锐亚教育

锐亚教育,游戏开发论坛|游戏制作人|游戏策划|游戏开发|独立游戏|游戏产业|游戏研发|游戏运营| unity|unity3d|unity3d官网|unity3d 教程|金融帝国3|8k8k8k|mcafee8.5i|游戏蛮牛|蛮牛 unity|蛮牛