首页 > 系统相关 >【Unity】内存优化之— —Texture的MaxTextureSize以及Format压缩格式

【Unity】内存优化之— —Texture的MaxTextureSize以及Format压缩格式

时间:2024-03-11 10:35:53浏览次数:22  
标签:Format 压缩 ASTC Texture Unity 内存 格式 MaxTextureSize 图片

本人才疏学浅,只是近期略看了一下Texture的内存,如有不对的地方,还望大佬指正。

参考文章:

你所需要了解的几种纹理压缩格式原理

1.说一说图片占用的内存

关于图片的内存,是怎么算的呢,就是图片的长乘以宽,乘以每个像素点占的byte大小。

MaxTextureSize,影响的就是基础的长和宽。

图片的压缩格式,影响的就是每个像素点占的byte大小。

就举一个最基础的例子,1024X1024大小,格式是RGBA32的图片

那其内存就为1024x1024x32/8=4x(1024x1024)=4MB。

我们知道1024x1024就是1M(bit),除以8换算为M(Byte),乘以32则是RGBA32中的那个单个像素占的大小,就是32,合起来就是4MB的大小。


2.聊聊MaxTextureSize

而MaxTextureSize,影响的就是图片分辨率。也就是图片在内存中的长宽。

不过也有个前提:当MaxTextureSize大于图片的实际大小时,仍会使用原图片的大小。

当然,也有个需要注意的地方:图片的大小不能超过SystemInfo.maxTextureSize的大小。


3.说一下压缩格式

关于压缩格式。介绍起来就很多了,如果你打开unity当中的图片,然后打开format可能就会惊恐的发现这个图

哇,有这么多格式,只看上一眼便要叫人生出敬畏之心。

莫慌,慢慢来。

这些格式,仔细看一眼,就可以发现,大概分为几类:ASTC、ETC、DXT、PVRTC、以及不采用压缩格式的RGBA。

关于这些格式的原理有兴趣的可以看这个大佬写的文章。链接:https://zhuanlan.zhihu.com/p/237940807

我这里只做一个简单粗暴的我自己使用的压缩格式:

如果目标是电脑PC

性能最优的情况下,使用RGBA32

兼容低性能的情况下,可以选择ARGB16

如果你还想更极限一点,把图片的宽高设置为4的倍数,然后使用DTX1(不支持Alpha)/DTX5

如果目标是安卓手机

ASTC使用: 4X4 5X5 6X6 8X8(ASTC任意图片的宽高)

ETC2使用:Crunched 100/80(ETC2需要图片的宽高为四的倍数)

不支持的情况下使用ETC (ETC需要图片的宽高为2的幂数,并且不支持alpha通道)

如果目标是iOS手机

ASTC使用: 4X4 5X5 6X6 8X8

不支持ASTC的情况下使用PVRTC(PVRTC需要图片的宽高为2的幂数)

然后Override ETC2 fallback:高质量统一选择32bit,低质量统一选择16bit

Normal map类型的默认按照高质量来,如果你想极限的话,按照低质量也不是什么问题

注:

Crunched的实际运行时内存占用与普通的内存占用一样,只是更加节省存储。

Crunched的图片就是压缩之后再次被crunched压缩一下,所以Crunched之后的图片,在使用时会再次解压缩为相对应的图。

ASTC 4X4 5X5 对应的是高质量的RGBA和RGB图片

ASTC 6X6 8X8 对应的是低质量的RGBA和RGB图片

如果图片很糊也不影响并且内存急需的情况下,可以使用ASTC的10X10、12X12(图片本身在游戏中占的像素越小越好)

如果是3D使用的纹理有远近变化的,建议统一开启MipMap,虽然会增加大约1/3的内存,但是效果确实好。


顺便举一个1024X1024图片的例子:

图片格式 图片大小
RGBA32 4M
RGBA16 2M
ASTC4X4 1M
ASTC5X5 0.6M
ASTC6X6 456.9KB
ETC2(8bit) 1M
ETC(4bit) 0.5M
PVRTC(4bit) 0.5M

至于怎么算的:就是1024X1024=1Mb,然后除以8乘以每像素占用内存,就是当前图片的大小。

标签:Format,压缩,ASTC,Texture,Unity,内存,格式,MaxTextureSize,图片
From: https://www.cnblogs.com/pkmoon/p/18034903

相关文章

  • Unity3D中刚体、碰撞组件、物理组件的区别详解
    Unity3D提供了丰富的功能和组件,其中包括刚体、碰撞组件和物理组件。这些组件在游戏开发中起着非常重要的作用,能够让游戏世界更加真实和有趣。本文将详细介绍这三种组件的区别以及如何在Unity3D中实现它们。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也......
  • Unity3D Shader事项法线贴图功能详解
    Unity3D它提供了丰富的功能和工具,使开发人员能够轻松创建出色的游戏和应用程序。其中Shader是Unity3D中非常重要的一部分,它可以帮助开发人员实现各种视觉效果,包括法线贴图功能。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技......
  • 记录一个报错信息:Name for argument of type [java.lang.Integer] not specified, and
    报错如下:错误复现代码如下:@GetMapping("/consumer/pay/getById/{orderId}")@Parameter(name="orderId",description="订单id",in=ParameterIn.PATH)publicRgetOrder(@PathVariableIntegerorderId){System.out.println(o......
  • AVStream(avformat.h)
    AVStream是存储每一个视频/音频信息的结构体。/***Streamstructure.*Newfieldscanbeaddedtotheendwithminorversionbumps.*Removal,reorderingandchangestoexistingfieldsrequireamajor*versionbump.*sizeof(AVStream)mustnotbeusedou......
  • Unity+Houdini+SP+SD 程序化风格化石头
    Houdini程序化模型整体思路:先生成一个基础模型,再基于该模型进行cutoff、控制拐角,随后转换为低模,最后uv映射、物体的像素密度、贴图大小基础模型基础形状采用Box,再使用PointJitter改变形状,最后添加normal为后续的cutoff做铺垫大致形状如下基础形状基于point个数使用f......
  • Unity URP Houdini 风格化云
    目录前言RenderType不透明度自发光ParallaxOcclusionMapping动画reference前言云的实现一般有三种思路:Volume体积云、billboard公告牌、Particle粒子,对于风格化来说体渲染的实现过于真实(但光遇的风格化云貌似是使用体渲染实现的,后面有空会考虑尝试还原还原),而Particle消耗太......
  • AVIOContext(FFmpeg/ libavformat/ avio.h)
    AVIOContext/***BytestreamIOContext.*Newfieldscanbeaddedtotheendwithminorversionbumps.*Removal,reorderingandchangestoexistingfieldsrequireamajor*versionbump.*sizeof(AVIOContext)mustnotbeusedoutsidelibav*.**......
  • AVFormatContext介绍(avformat.h)
    typedefstructAVFormatContext结构体介绍表示解复用(解码)或复用(编码)多媒体流的格式上下文。在使用FFMPEG进行开发的时候,AVFormatContext是一个贯穿时钟的数据结构,很多函数都要用它作为参数。它是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体。typedefstructAVFormatContext......
  • fink泛型参数问题和TypeHint TypeInformation Types区别
    TypeHint,TypeInformation,Types区别TypeInformation是flink的类型定义,TypeHint是描述用于描述泛型参数的辅助类,Types是一个封装了常用TypeInformation的工具类描述问题下面一段代码的有两个参数,第一个来自数据流元素,他的本质是入参。第二个是出参,效果和返回值类似第一个参......
  • Unity3D 多线程定时器的原理与实现详解
    Unity3D提供了丰富的功能和工具,让开发者可以轻松地创建各种类型的游戏。其中,定时器是一个非常重要的功能,在游戏开发中经常会被使用到。Unity3D中并没有提供原生的多线程定时器功能,但我们可以通过一些技巧和方法来实现一个多线程定时器。对啦!这里有个游戏开发交流小组里面聚集了......