网站公告 | 泰斗网校全新上线了,可以和论坛用户登录同步,如果遇到登录问题联系管理员解决
查看: 7984|回复: 16
收起左侧

[大奥] 一种高性能的使用顶点动画的战斗飘血方案

[复制链接]

[大奥] 一种高性能的使用顶点动画的战斗飘血方案[复制链接]

大奥 发表于 2016-12-4 20:38:42 [显示全部楼层] 回帖奖励 |倒序浏览 |阅读模式 回复:  16 浏览:  7984
本帖最后由 大奥 于 2017-1-6 16:53 编辑

起源

之前项目如果使用Ngui做飘血功能,一旦同屏超过几百个飘血就开始卡了, 采用了对象池也没有很好的好转, 查看了一下源码主要是两点
    1.ngui在对动态的物体的时候都会有重新绘制drawcall
    2.每一帧对物体进行插值计算消耗了大量cpu时间

思考了一下 针对以上缺陷,我图集还是采用ngui的, 因为要控制drawcall, 但是考虑自己使用自定义重构mesh生成, 然后根据曲线插值位置, 缩放和alpha, 那么我就不需要每次变动重新绘制drawcall了, 可是这样一来, 在unity4.7 版本上会出现dynamic batch 失效的情况, 导致还不如ngui的性能, 最严重的时候甚至到了 5 fps

我思考可能不同时期缩放不一样导致的

     Generally, objects should be using the same transform scale.
     The exception is non-uniform scaled objects; if several objects all have different non-uniform scale then they can still be batched.

那么我就想到了顶点动画才进行插值运动,运用vertex的别的通道来存储其动画信息。
但是本身的话如果一个pop 建立一个mesh的话drawcall控制不住。那么我采用 update 放入当前这一帧所需要绘制的所有 pop mesh的顶点信息, 在lateupdate把这一帧的所有顶点信息用一个mesh绘制。

有人问为什么不在材质上设置参数呢? 这样一来不就一个 pop 对应一个材质了嘛,drawcall 不就上去了?
这样一来就解决了以上两个问题,不用cpu插值, 动态物体drawcall只有一次

设计

自定义Mesh

哈哈,是不是很眼熟
[AppleScript] 纯文本查看 复制代码
if (mFilter == null) mFilter = gameObject.GetComponent<MeshFilter>();
if (mFilter == null) mFilter = gameObject.AddComponent<MeshFilter>();

// Create the mesh
if (mMesh == null)
{
    mMesh = new Mesh();
    mMesh.hideFlags = HideFlags.DontSave;
    mMesh.name = "Mesh";
    mMesh.MarkDynamic();
}

mMesh.Clear();
mMesh.vertices = verts.ToArray();
mMesh.uv = uvs.ToArray();
mMesh.colors32 = cols.ToArray();

mMesh.normals = vertex1.ToArray();
mMesh.tangents = vertex2.ToArray();
mMesh.uv1 = vertex3.ToArray();

int triangleCount = (vertex_count >> 1) * 3;
mMesh.triangles = GenerateCachedIndexBuffer(vertex_count, triangleCount);
mFilter.mesh = mMesh;

if (mRenderer == null) mRenderer = gameObject.GetComponent<MeshRenderer>();
if (mRenderer == null) mRenderer = gameObject.AddComponent<MeshRenderer>();


顶点动画 shder

[AppleScript] 纯文本查看 复制代码
struct appdata_m
{
    float4 vertex : POSITION;
    float3 vertex1 : NORMAL; ///这里记录第二帧的位置信息
    float4 vertex2 : TANGENT;///这里记录第三帧的位置信息
    float2 vertex3 : TEXCOORD1;///这里记录第四帧的位置信息

    float2 texcoord : TEXCOORD0;

    fixed4 color : COLOR;
};

v2f_m vert (appdata_m v)
{
    v2f_m o;

    _CurTime = _Time.y - _StartTime;

    if(_CurTime <= v.vertex1.z) {
        _vertex1 = float3(v.vertex1.x, v.vertex1.y, 0);
        _Factor = _CurTime / v.vertex1.z;
        _vec = lerp(v.vertex.xyz, _vertex1, _Factor);
        _alpha = lerp(v.color.a, v.color.r, _Factor);
    }
    else if (_CurTime <= v.vertex2.z) {

        _vertex1 = float3(v.vertex1.x, v.vertex1.y, 0);
        _vertex2 = float3(v.vertex2.x, v.vertex2.y, 0);

        _Factor =  (_CurTime - v.vertex1.z) / (v.vertex2.z - v.vertex1.z);

        _vec = lerp(_vertex1, _vertex2, _Factor);
        _alpha = lerp(v.color.r, v.color.g, _Factor);
    }
    else {
        _vertex2 = float3(v.vertex2.x, v.vertex2.y, 0);
        _vertex3 = float3(v.vertex2.w, v.vertex3.x, 0);

        _Factor =  (_CurTime - v.vertex2.z) / (v.vertex3.y - v.vertex2.z);

        _vec = lerp(_vertex2, _vertex3, _Factor);
        _alpha = lerp(v.color.g, v.color.b, _Factor);
    }
    ...
    return o;
}



接下来只要mesh给予带运动轨迹的顶点信息,采用VertexAnimation Shader即可

完结

魅族测试


参考源码  https://github.com/daaoling/Vertex_HUD 欢迎点星支持
有问题直接issue上提



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 1泰斗币 +100 收起 理由
优弧 + 100 原创内容

查看全部评分

+1
7997°C
16
  • 扣扣无所谓
  • 望山石580
  • 旅行的拾荒者
  • A_nice
  • yhy1370845
过: 他们
因分享而快乐,学习以自强!
扣扣无所谓 发表于 2016-12-5 09:52:12 显示全部楼层
膜拜大神,顺便赚点儿泰斗币
因分享而快乐,学习以自强!
望山石580 发表于 2016-12-5 14:08:44 显示全部楼层
膜拜大神,顺便赚点儿泰斗币
因分享而快乐,学习以自强!
旅行的拾荒者 发表于 2016-12-6 16:33:13 显示全部楼层
啥也不说了,泰课就是给力!
因分享而快乐,学习以自强!
A_nice 发表于 2016-12-7 09:33:19 显示全部楼层
看了LZ的帖子,我只想说一句很好很强大!
因分享而快乐,学习以自强!
yhy1370845 发表于 2016-12-8 13:20:34 显示全部楼层
怎样把3d世界坐标转换成 瓢字的.AddEntry(pos,  只可以用正交视角吗
因分享而快乐,学习以自强!
马三小伙儿 发表于 2016-12-8 15:27:48 显示全部楼层
看了LZ的帖子,我只想说一句很好很强大!
因分享而快乐,学习以自强!
啷哩个啷儿 发表于 2016-12-8 16:41:19 显示全部楼层
啥也不说了,泰课就是给力!
因分享而快乐,学习以自强!
福建小屁孩 发表于 2016-12-8 17:15:22 显示全部楼层
啥也不说了,泰课就是给力!
因分享而快乐,学习以自强!
aefcvlkl 发表于 2016-12-9 18:04:45 显示全部楼层
膜拜大神,顺便赚点儿泰斗币
因分享而快乐,学习以自强!
xiezhen11111 发表于 2016-12-13 01:10:24 显示全部楼层
膜拜大神,顺便赚点儿泰斗币
因分享而快乐,学习以自强!
墨麟 发表于 2016-12-13 17:40:26 显示全部楼层
资源甚好,发帖艰辛,且阅且珍惜。
因分享而快乐,学习以自强!
墨麟 发表于 2016-12-13 17:40:43 显示全部楼层
啥也不说了,泰课就是给力!
因分享而快乐,学习以自强!
1015439177 发表于 2016-12-14 15:29:51 显示全部楼层
有没有UGUI 的呢
因分享而快乐,学习以自强!
sunlwendy 发表于 2016-12-15 10:48:54 显示全部楼层
为了泰斗币,拼了。
因分享而快乐,学习以自强!
12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 浙ICP 备 13006852号-15 )|网站地图

© 2001-2013 Comsenz Inc.  Powered by Discuz! X3.4

1
QQ