Unity3D研究院之IOS运行时合并PVRTC贴图(九十九)

栏目: IOS · 发布时间: 5年前

内容简介:游戏中一旦有换装功能,角色可能就会是多个DrawCall了,所以我们可以将部件的贴图动态合并在一张中,本文聊聊PVRTC2bit 和 PVRTC4bit 贴图合并的方法。先看看PVRTC贴图的排列方式。核心方式是Texture2D.GetRawTextureData()获取贴图的原始数据,运行时使用需要开启贴图的Read/Write,如果出于节省内存的考虑,可以在编辑模式下提前提取贴图的原始数据,运行期在合并。

游戏中一旦有换装功能,角色可能就会是多个DrawCall了,所以我们可以将部件的贴图动态合并在一张中,本文聊聊PVRTC2bit 和 PVRTC4bit 贴图合并的方法。先看看PVRTC贴图的排列方式。

Unity3D研究院之IOS运行时合并PVRTC贴图(九十九)

核心方式是Texture2D.GetRawTextureData()获取贴图的原始数据,运行时使用需要开启贴图的Read/Write,如果出于节省内存的考虑,可以在编辑模式下提前提取贴图的原始数据,运行期在合并。

我们将256和128的贴图合并在一张512的PVRTC贴图中,排列的位置如下。

Unity3D研究院之IOS运行时合并PVRTC贴图(九十九) 代码中同时支持PVRTC2bit和PVRTC4bit,注意Apply()的第二个参数是true,表示合并贴图后立即删除内存拷贝,也就是Read/Write了。

using System;
using UnityEngine;
using UnityEngine.UI;
 
public class PVRTCombine : MonoBehaviour {
 
    public Texture2D texture256;
    public Texture2D texture128;
 
 
	void Start () 
    {
        GetComponent<RawImage>().texture = Combine(texture256, texture128);;
	}
  
    Texture2D Combine(Texture2D tex,Texture2D tex1)
    {
        int length = 512;
        byte[] data = null;
        var blcokBytes = 0;
        switch (tex.format)
        {
            case TextureFormat.PVRTC_RGB2:
            case TextureFormat.PVRTC_RGBA2:
                blcokBytes = 4;
                data = new byte[length / 4 * length];
                break;
            case TextureFormat.PVRTC_RGB4:
            case TextureFormat.PVRTC_RGBA4:
                blcokBytes = 8;
                data = new byte[length / 2 * length];
                break;
            default:
                Debug.Log("Not supported.");
                return null;
        }
 
        //填充左下角 256
        CombineBlocks(tex.GetRawTextureData(), data, tex.width, 4, blcokBytes, 0);
        //填充左上角 256 
        CombineBlocks(tex.GetRawTextureData(), data, tex.width, 4, blcokBytes, BlcokOffset(tex.width,blcokBytes));
        //填充右下角 256 
        CombineBlocks(tex.GetRawTextureData(), data, tex.width, 4, blcokBytes, 2 * BlcokOffset(tex.width,blcokBytes));
 
        //填充右上角区域
        //左下角 128
        CombineBlocks(tex1.GetRawTextureData(), data, tex1.width, 4, blcokBytes, 3 * BlcokOffset(tex.width,blcokBytes));
        //左上角 128
        CombineBlocks(tex1.GetRawTextureData(), data, tex1.width, 4, blcokBytes, 3 * BlcokOffset(tex.width,blcokBytes) + BlcokOffset(tex1.width,blcokBytes));
        //右下角 128
        CombineBlocks(tex1.GetRawTextureData(), data, tex1.width, 4, blcokBytes, 3 * BlcokOffset(tex.width,blcokBytes) + 2 * BlcokOffset(tex1.width, blcokBytes));
        //右上角 128
        CombineBlocks(tex1.GetRawTextureData(), data, tex1.width, 4, blcokBytes, 3 * BlcokOffset(tex.width,blcokBytes) + 3 * BlcokOffset(tex1.width, blcokBytes));
 
 
        var combinedTex = new Texture2D(length, length, tex.format, false);
 
        combinedTex.LoadRawTextureData(data);
        combinedTex.Apply(false,true);
 
        return combinedTex;
    }
 
    int BlcokOffset(int length, int blcokBytes)
    {
        return length / (16 / blcokBytes) * length;
    }
 
    void CombineBlocks(byte[] src, byte[] dst, int length, int block, int bytes, int blockOffest)
    {
        int cell = length / block;
        for (int i = 0; i < cell; i++)
        {
            for (int j = 0; j < cell; j++)
            {
                int srcindex = ((i * cell) + j) * bytes;
                int dstindex = srcindex + blockOffest;
                Buffer.BlockCopy(src, srcindex, dst, dstindex, bytes);
            }
        }
    }
 
}

iPhone 5SE 真机测试大概合并一张512的贴图需要1毫秒,如果游戏中适合一帧只显示一个角色,如果有建议或者意见欢迎在下面留言。

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

最后编辑:

作者:雨松MOMO

专注移动互联网,Unity3D游戏开发

站内专栏 QQ交谈 腾讯微博 新浪微博

捐 赠 如果您愿意花20块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。


以上所述就是小编给大家介绍的《Unity3D研究院之IOS运行时合并PVRTC贴图(九十九)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C标准库

C标准库

P. J. Plauger / 卢红星、徐明亮、霍建同 / 人民邮电出版社 / 2009-7 / 79.00元

本书是由世界级C语言专家编写的C标准库经典著作。英文版已经重印十多次,影响了几代程序员。 本书结合C标准的相关部分,精辟地讲述了每一个库函数的使用方法和实现细节,而这正是一个真正的C程序员所必须掌握的。更重要的是,书中给出了实现和测试这些函数的完整源代码,可以让你更深入地学习C语言。不仅如此,本书还讨论了一些即使是最有经验的C程序员通常也不熟悉的知识,比如国际化和独立于区域设置的程序的编写、......一起来看看 《C标准库》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具