UGUI Image扩展组件

本文介绍了一种优化九宫格与对称图片内存使用的方法,通过仅使用图片的一部分来减少内存占用,同时详细解释了核心代码的实现原理及其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能:

优化对称图片及九宫格图片内存(对称图片只用一半图片,九宫格只用左下部分四分之一图片)。

核心代码:

1、九宫格翻转代码:

/// <summary>
/// 赋值九宫vert顶点数据
/// </summary>
/// <param name="toFill"></param>
/// <param name="rect"></param>
/// <param name="padding"></param>
/// <param name="adjustedBorders"></param>
/// <param name="dir">0-3代表4个方向,分别为0:左下部分;1:右下部分;2:右上部分;3:左上部分</param>
private void Generate9SlicedSprite(VertexHelper toFill, ref Rect rect, ref Vector4 padding, ref Vector4 adjustedBorders, int dir)
{
    s_VertScratch[3] = new Vector2((rect.width - padding.z - padding.x) / 2, (rect.height - padding.w - padding.y) / 2);
    s_VertScratch[2] = s_VertScratch[3];
    switch (dir)
    {
        case 0://左下部分
            s_VertScratch[0] = new Vector2(padding.x, padding.y);
            s_VertScratch[1] = new Vector2(adjustedBorders.x, adjustedBorders.y);
            break;
        case 1://右下部分
            s_VertScratch[0] = new Vector2(rect.width - padding.z, padding.y);
            s_VertScratch[1] = new Vector2(rect.width - adjustedBorders.x, adjustedBorders.y);
            break;
        case 2://右上部分
            s_VertScratch[0] = new Vector2(rect.width - padding.z, rect.height - padding.w);
            s_VertScratch[1] = new Vector2(rect.width - adjustedBorders.x, rect.height - adjustedBorders.y);
            break;
        case 3://左上部分
            s_VertScratch[0] = new Vector2(padding.x, rect.height - padding.w);
            s_VertScratch[1] = new Vector2(adjustedBorders.x, rect.height - adjustedBorders.y);
            break;
    }

    for (int i = 0; i < 4; ++i)
    {
        s_VertScratch[i].x += rect.x;
        s_VertScratch[i].y += rect.y;
    }


    for (int x = 0; x < 3; ++x)
    {
        int x2 = x + 1;

        for (int y = 0; y < 3; ++y)
        {
            if (!fillCenter && x == 1 && y == 1)
                continue;

            int y2 = y + 1;


            AddQuad(toFill,
                new Vector2(s_VertScratch[x].x, s_VertScratch[y].y),
                new Vector2(s_VertScratch[x2].x, s_VertScratch[y2].y),
                color,
                new Vector2(s_UVScratch[x].x, s_UVScratch[y].y),
                new Vector2(s_UVScratch[x2].x, s_UVScratch[y2].y));
        }
    }
}

对九宫格图片顶点数据进行进行重新计算赋值,将九宫格uv对应到相应的顶点上。

2、对称图片翻转代码

/// <summary>
/// Generate vertices for a simple Image.
/// </summary>
void GenerateSimpleSprite(VertexHelper vh, bool lPreserveAspect, bool bHorizontal)
{
    Vector4 v = GetDrawingDimensions(lPreserveAspect);
    var uv = (overrideSprite != null) ? Sprites.DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;

    var color32 = color;
    vh.Clear();
    if (bHorizontal)//水平翻转
    {
        vh.AddVert(new Vector3(v.x, v.y), color32, new Vector2(uv.x, uv.y));
        vh.AddVert(new Vector3(v.x, v.w), color32, new Vector2(uv.x, uv.w));
        vh.AddVert(new Vector3((v.z + v.x) / 2, v.w), color32, new Vector2(uv.z, uv.w));
        vh.AddVert(new Vector3((v.z + v.x) / 2, v.y), color32, new Vector2(uv.z, uv.y));
        vh.AddTriangle(0, 1, 2);
        vh.AddTriangle(2, 3, 0);
        vh.AddVert(new Vector3((v.z + v.x) / 2, v.y), color32, new Vector2(uv.z, uv.y));
        vh.AddVert(new Vector3((v.z + v.x) / 2, v.w), color32, new Vector2(uv.z, uv.w));
        vh.AddVert(new Vector3(v.z, v.w), color32, new Vector2(uv.x, uv.w));
        vh.AddVert(new Vector3(v.z, v.y), color32, new Vector2(uv.x, uv.y));
        vh.AddTriangle(4, 5, 6);
        vh.AddTriangle(6, 7, 4);
    }
    else//竖直翻转
    {
        vh.AddVert(new Vector3(v.x, v.y), color32, new Vector2(uv.x, uv.y));
        vh.AddVert(new Vector3(v.x, (v.w + v.y) / 2), color32, new Vector2(uv.x, uv.w));
        vh.AddVert(new Vector3(v.z, (v.w + v.y) / 2), color32, new Vector2(uv.z, uv.w));
        vh.AddVert(new Vector3(v.z, v.y), color32, new Vector2(uv.z, uv.y));
        vh.AddTriangle(0, 1, 2);
        vh.AddTriangle(2, 3, 0);
        vh.AddVert(new Vector3(v.x, (v.w + v.y) / 2), color32, new Vector2(uv.x, uv.w));
        vh.AddVert(new Vector3(v.x, v.w), color32, new Vector2(uv.x, uv.y));
        vh.AddVert(new Vector3(v.z, v.w), color32, new Vector2(uv.z, uv.y));
        vh.AddVert(new Vector3(v.z, (v.w + v.y) / 2), color32, new Vector2(uv.z, uv.w));
        vh.AddTriangle(4, 5, 6);
        vh.AddTriangle(6, 7, 4);
    }
}

重新计算对称图片进行verts,uv,实现对称图片翻转。

优缺点:

优点:

节省图片内存

缺点:

增加Tris和verts数据,一张运用ImageEx组件的九宫格的图片比正常九宫格图片多出54个Tris,108个verts,相当于多出三个九宫格图片(对称图片只多出2个Tris,4个verts,可以忽略不计)。增加面数和顶点,目前还未想到好的解决办法,但是UI界面九宫图一般都只有个位数,也就是最多增加三四百个Tris,对于几万个Tris数量级的游戏来说基本上可以忽略不计。

源码链接:

https://download.youkuaiyun.com/download/tracyzly/10325199

Unity版本:

2017.2.0p4

在Unity3D中为UGUIImage组件实现高斯模糊效果,并针对移动平台进行性能优化是一个涉及图形编程和性能调优的技术挑战。首先,需要编写一个自定义的Shader来实现高斯模糊效果。在这个过程中,你会使用到Unity的Shader语言和图形学的知识,比如对纹理进行多次采样,并根据高斯分布对采样结果进行加权平均。代码中的模糊半径(Size属性)是一个关键参数,它将直接影响到模糊效果和性能。在移动平台上,由于硬件资源相对有限,需要仔细调整这个参数,以便在视觉效果和帧率之间找到平衡点。 参考资源链接:[Unity3D UGUI图像特效:实现Image高斯模糊](https://wenku.youkuaiyun.com/doc/645e300395996c03ac47b905) 高斯模糊通常是通过卷积核(kernel)来实现的,其中每个权重都代表了高斯分布中一个点的重要性。在Shader中实现时,需要对图像的每个像素及其周围的像素进行加权平均计算。这样可以得到一个模糊的图像,使得图像的边缘变得柔和。 对于性能优化,可以采取以下措施: 1. 减小模糊半径:通过减小模糊半径来减少需要处理的像素数量,从而减少计算量。 2. 优化Shader代码:减少不必要的计算,比如避免在每个像素上都执行完整的模糊算法。 3. 使用多重渲染目标(MRT):通过一次渲染过程输出多个图像,减少重复的渲染调用。 4. 采用硬件加速的模糊技术:例如使用移动平台支持的图形API扩展来加速模糊效果的计算。 为了帮助你更好地理解和实现这一技术,推荐查看《Unity3D UGUI图像特效:实现Image高斯模糊》。这本书不仅提供了高斯模糊效果的实现方法,还详细介绍了在不同设备上进行性能优化的技巧。通过阅读这本书,你将能够掌握高斯模糊的原理和实现,以及如何为移动平台优化性能,最终在你的Unity3D项目中实现美观且流畅的视觉效果。 参考资源链接:[Unity3D UGUI图像特效:实现Image高斯模糊](https://wenku.youkuaiyun.com/doc/645e300395996c03ac47b905)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值