news 2026/6/7 1:26:16

Unity Texture2D的 Read/Write 选项

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Unity Texture2D的 Read/Write 选项
  • 开启 (Read/Write = True):CPU 可以读写贴图像素数据,贴图会在内存一份、GPU显存一份

  • 关闭 (Read/Write = False,默认):CPU 无法访问贴图像素数据,贴图只存GPU 显存一份


Read/Write什么时候开启?

  • 读取像素:用GetPixels获取颜色数据,用于截图保存、地图编辑等

  • 修改像素:用SetPixels运行时动态绘制贴图(如画板功能),修改后需调用Apply()上传至 GPU

  • 生成资产:脚本创建 Texture2D 后调用EncodeToPNG保存到本地


Texture2D.Apply()

当你 new Texture2D()后,不会在GPU分配显存,会首先在系统内存(CPU侧)创建纹理对象的数据容器。

  • 内存分配:构造函数会立即在系统内存中分配像素数据数组(可通过GetPixels等直接访问)。

  • 显存分配:只有当你调用Apply()方法后,数据才会被上传到GPU显存。如果不调用Apply(),纹理只存在于系统内存中,无法被正确渲染显示。

调用Apply()的核心作用,就是将当前系统内存中的像素数据同步(上传/更新)到GPU显存中。


问题:为什么new Texture2D()后,即使没分配显存,为什么也能在Game窗口中看到?(是纯白的图像)

  1. 理论上的运行时行为:如果这是一个打包后的游戏(Build出来的exe),没有调用Apply(),贴图绝对不会显示,或者显示为紫色/黑色错误材质。因为GPU显存里根本没有数据。

  2. 编辑器中的“魔法”:Unity编辑器为了提升开发体验,在某些情况下会“好心”地帮你自动调用Apply()。当它检测到你将一个未Apply的Texture2D赋值给材质时,编辑器可能会强制同步数据到GPU,让你能在Scene/Game视图里看到效果,方便调试。

new Texture2D()之后,要显示就一定要Apply()。编辑器里的“显示”只是一个为了方便调试的假象。


Read/Write 可以在构建时设定一次,构建出来Texture2D后,Read/Write就不可设定了。

在Apply后释放内存:

直接在Apply时将makeNoLongerReadable参数设为true,Unity会在数据上传至GPU后,立即自动释放系统内存中的那份副本。

// 修改像素后,上传数据并立即释放CPU内存 texture2D.Apply(true, true);

参数含义:第一个true是更新Mipmap;第二个true就是“不再让CPU读取”,上传后丢掉内存副本。


Read / Write 默认设置:

场景Read / Write原因
Unity 导入 Assets不勾选 (False)省内存:上传到 GPU 后自动丢弃系统内存副本。如果不需要用 CPU 读写像素,保持默认即可。
动态创建(new Texture2D)

默认开启 (True),

可在构造函数中设定

保功能:创建时会在系统内存保留数据,方便你随时调用GetPixelsSetPixels

Read / Write 如果为false,如果硬要读取时怎么办?

如果贴图未开启 Read/Write,官方方案是通过RenderTexture间接读取(无需修改原贴图设置):

  1. 创建临时 RenderTexture

  2. Graphics.Blit将贴图画到 RenderTexture 上

  3. ReadPixels从 RenderTexture 读取像素到新 Texture2D

⚠️ 此方法有额外性能开销,不适合频繁操作,适合偶发的截图或工具开发。


Texture2D 的 LoadImage 方法:

目的是从 byte[]获取像素数据创建出 Texture2D。

有两点需要注意:

① 它会自己调用 Apply,无需手动再调用一次

② LoadImage 方法有一个重载版本:

public bool LoadImage(byte[] data, bool markNonReadable);

设为 true → 告诉 Unity 你不需要在 CPU 端读写像素数据 → Unity 可以尝试释放 CPU 端的拷贝

· 设为 false(默认) → Unity 保留 CPU 端可读写拷贝

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 1:25:04

从GSM到5G:你的SIM卡鉴权密钥Ki和算法是怎么‘升级打怪’的?

从GSM到5G:移动通信鉴权技术的安全进化史当你每天用手机刷视频、扫码支付时,是否想过这张小小的芯片如何保护你的通信安全?从1991年GSM网络商用至今,SIM卡内的鉴权技术已经历了五次重大迭代。本文将带你穿越30年技术演进历程&…

作者头像 李华
网站建设 2026/6/7 1:23:24

为什么你的AI生成内容在小红书崩版、在知乎丢失交互组件?:CSDN分发引擎的平台特征指纹库与3类内容适配性分级标准

更多请点击: https://kaifayun.com 第一章:CSDN AI 数字营销的分发内容会自动适配各平台排版格式吗? CSDN AI 数字营销平台在内容分发环节并未提供全自动、无损的跨平台排版适配能力。其核心机制是基于结构化内容(如 Markdown 源…

作者头像 李华
网站建设 2026/6/7 1:21:43

从原始PCAP到训练用CSV:CIC-IDS2018数据集预处理与特征工程实战指南

从原始PCAP到训练用CSV:CIC-IDS2018数据集预处理与特征工程实战指南 当你第一次打开CIC-IDS2018数据集时,面对数百GB的PCAP文件和数十个CSV文件,是否感到无从下手?作为网络安全领域最具代表性的基准数据集之一,CIC-IDS…

作者头像 李华
网站建设 2026/6/7 1:19:34

从DCDC到LDO:手把手教你用LM1117给STM32搭建一个‘安静’的3.3V电源

从DCDC到LDO:用LM1117为STM32打造低噪声3.3V电源的工程实践在嵌入式系统设计中,电源质量往往是被低估的关键因素。我曾见过一个基于STM32F4的工业传感器项目,ADC采样值总在最后两位跳动,工程师花了三天时间排查才发现是DCDC模块的…

作者头像 李华
网站建设 2026/6/7 1:16:34

ai赋能unity开发:通过快马平台智能生成npc行为逻辑与高级功能代码

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 请使用ai辅助设计并生成一个unity中智能npc的巡逻与追击行为系统。要求:1、npc在指定区域内随机巡逻,遇到障碍物能自动寻路绕过。2、当玩家进入npc的视野范…

作者头像 李华
网站建设 2026/6/7 1:16:32

效率革命:快马ai自动生成vmware虚拟机配置模板脚本

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 请生成一个用于快速创建centos 7虚拟机模板的自动化脚本,该脚本应基于vmware workstation的命令行接口或powercli,实现以下核心功能:自动创建一…

作者头像 李华