PostProcessing V2 效果异常

PostProcessing V2 效果异常

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

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)


本期目录:

  • 如何解决PostProcessing V2的bloom效果在手机上显示异常
  • 如何平衡Lua GC和C# GC不同步
  • WebGL发布后内存变化
  • 如何模拟重力作用下的弹道
  • UI元素合批处理注意事项

PostProcessing

Q:PostProcessing V2的bloom效果在手机上显示异常。

请输入图片描述

A1:有非法值,建议用自带的NaN功能查看,大多是特效或者PBR中GGX,Spec等除0引起的。

PS:NaN功能就是Porcine parvovirus 2 (PPV2)的layer脚本上有个选项查看NaN像素,好像是这样,其实大多是Spec值太大了,可以自己限制一下,用个max函数。
感谢庞池海@UWA问答社区提供了回答

A2:我们项目遇到过一样的情况,我们用了HDR,有些材质球会出现这种问题。

解决方法先把bloom的clamp设置成比较小的值,推荐2以下。如果还是有问题,查看具体出问题的材质球,把fix和half都改成float,这样可以解决大部分问题。
感谢BQ哥@UWA问答社区提供了回答

A3(题主补充):NaN自查后有黑点,后来查到是PBR中Shader的问题。

感谢lyd@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c77dd0a63826a332ad99747


Lua

Q:这边项目用xLua,发现一个问题:一个UI(多些文字就容易复现)打开、销毁、再打开、再销毁…,如此多次,Mono会不停的增长,C# GC也不能完全GC掉。

然后发现一个会降下来的现象:

Lua GC一下,C#再GC Mono会降回去一点(但也回不到最初的)。 这个问题应该是两者都用了引用计数来回收,两者不同步,虽然Destory了对象,Lua里还没GC到,则一些被Lua引用的对象等在也还引用着。

然后两边来回GC几次,基本可以回到原来的Mono值。

网上看到类似问题,是ToLua的:
http://www.manew.com/forum.php?mod=viewthread&tid=141722&extra=page%3D&page=1

里面提了几个方案,做了两个调整:
A、尝试Lua GC频率稍微调高些,
B、然后xLua本身也提供了删除引用的处理LuaEnv.Tick()函数(慢慢遍历检测,引用的C#对象是否销毁,已销毁了就置null,可以解引用,后面GC就会被GC掉)调用了,且提高每次遍历的数目。

但还是有增长的情况。不知大家如何解决这类问题的?谢谢!
(UI做缓存池,会好一些吧?但还是一定概率出问题,撑大Mono的。)

PS:还有一点觉得难受,Lua和C#里泄漏的东西,很难知道到底当时是什么地方造成泄漏的。 必须短时间内重复一些简单操作,才能推测大概泄漏的是什么东西,然后去对应地方找问题。有什么可以方便定位哪个Lua的地方应用了哪个C#的地方?或者C#引用了Lua的哪个地方?

比如有一些双向引用了,GC不掉,只能推测大概是哪里和哪里引用了。

A:题主对Lua和C#内存这块理解已经非常深刻了,我们也有类似问题。我们只做了第一个处理:

调整Lua GC的两个参数,让Lua垃圾回收更加积极,这个问题的原因是Lua这一端无法感知一个小小的User data代表的东西在C#世界的分量,根基都错了只能无脑加快频率了,这是最简单有效的办法,只要参数合理代价也并不大。

关于撑大Mono的问题,我们应该也有,还没细抠这一块,目前正常操作的话Mono峰值20几兆,先忍了。

关于Lua引用C#,Lua这边只是拿一个索引,真正的对对象的持有是通过ObjectPool来实现的,接下来针对ObjectPool做手脚,即可分两步:

1、记录调用栈
C#栈可以通过StackTraceUtility.ExtractStackTrace()拿到;
Lua栈可以通过DoString(“return debug.traceback()”)拿到;
可以把这两个字符串和obj一起记录在ObjectPool里,这样只要知道是哪个obj泄露了,也就顺便知道是哪里引入的了。

2、记录分配号
为了查哪个obj泄露了,可以在obj入池的时候给他一个分配号,这个分配号自增,然后我们就可以打点diff了。

比如在某一刻打点A,此时的分配号是100,在另一刻打点B,此时的分配号是150,然后一顿各种GC释放,遍历池子找出100~150之间的obj,重点分析这一部分obj的存活是否符合预期,不符合预期再把两个栈打印出来,真相大白。

关于C#引用Lua,这块似乎并不是重灾区,我们封装了LuaBehaviour对外使用,销毁的时候控制好。另外还有Delegate也做好控制,其他的暂时没有想到。

感谢littlesome@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c8b8190276f530b35fdd6cf


WebGL

Q:如图,当前内存使用843MB,闲置一段时间后内存使用会降到150MB。功能上只有浏览,占用800MB时的流畅度与占用150MB时的流畅度完全一样。劳烦大大指点下原因。

请输入图片描述

A:之前做过一段时间的WebGL,但是没有注意到存在题主遇到的这种情况。当时我们最主要用的调试浏览器是Chrome。

浏览器一般都携带开发者工具,可以进行性能分析查看Memory占用,以Chrome为例:

请输入图片描述

请输入图片描述

可以查看我们发布的游戏的占用的内存,也可以查看内存分配的各部分占比。没遇到过这个问题,只能简单说下思路看是否能对题主有帮助。

首先我觉得需要先发布下其他的浏览器看下情况来确定是否是一个共性问题。

如果是共性,就找一个分析工具最完善的浏览器查看内存分配在哪,降下去的时候释放的是哪些内存来确定问题。

如果只在火狐浏览器出现,就要先确定是否浏览器本身的支持问题还是确定游戏本身存在问题(一些浏览器直接不支持,一些浏览器支持有问题),这里要确定是不是我们的游戏踩到了这个浏览器的坑,发布一个其他简单的游戏看是否存在问题,如果存在,换Unity版本再发布测试,如果在简单场景的情况下,比如说一个空工程的情况下都存在,那基本上就是这个浏览器支持有问题了。如果不是,用工具分析内存定位问题,尝试解决方案绕坑。

感谢赵林_JS@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c6b6b3c2b3589332f1a4a55


物理

Q:FPS游戏中,除了对子弹使用Rigidbody,有没有其他更有效率的方案来模拟重力作用下的弹道?例如使用Raycast,大概有哪些实施的要点呢?感谢~

A:个人是FPS迷,对子弹实现稍微有些了解,提供一个基于Raycast伪代码给题主参考。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float Speed;   // 子弹的速度
    public Vector3 Gravity; // 重力向量
    Vector3 _PrePos;  // 保留旧的位置来计算射线方向
    Vector3 _NewPos;  // 子弹新的位置

    void FixedUpdated(){

        _NewPos += Speed * transform.forward * Time.deltaTime;  // 速度对坐标的修改
        _NewPos += Gravity;  // 重力对坐标的修改

        var direction = _NewPos - _PrePos;
        var distance = direction.magnitude;

        if( Physics.Raycast(_PrePos, direction, distance) ) {
            // dosomething();
        }
        else {
            _PrePos = transform.position;
            transform.position = _NewPos;  // 如果没有检测到目标,则把子弹移动到新位置
        }
    }
}

感谢张锐@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c651eb863826a332ad9956a


UI

Q:想对UGUI渲染优化,发现这个问题。例如一个界面的Scrollview有很多Item,发现当UI根节点的Z为0时,会合批处理。当Z不为0的时候,Item会一个一个地绘制出来,没有合批处理。求大佬给萌新科普一下,遇见这种情形应该怎么处理比较好?谢谢啦!

A:“UI元素Position的Z值不为0时,会被视为3D UI,不参与合批。父节点Z != 0,则下面的元素都无法合批了。”

感谢贾伟昊@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c6f71e12b3589332f1a4aae


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

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:793972859(原群已满员)

封面图来源:EdgeDetect PostProcessing Unity
https://lab.uwa4d.com/lab/5b562947d7f10a201fd86d0a

UWA DAY 2019完整议题公布!

请输入图片描述

请输入图片描述