Spite 和Image的区别
Unity3D最初是一个3D游戏引擎,而从4.3开始,系统加入了Sprite组件,Unity也终于有了2D游戏开发的官方解决方案。4.6更是增加了新的UI系统uGUI,使得使用Unity开发2D游戏效率非常高。
那么对于从事2D游戏开发的同学来说,想必都曾经遇到过2D元素渲染的选择问题。大家都知道,Unity可以将导入的图片分割为若干Sprite,然后通过SpriteRenderer组件或者uGUI的Image组件来渲染。一般情况下,两者的显示效果是一致的。那么究竟该使用哪个组件呢?
首先分析下两者的异同。
使用上,两者区别不大,都是使用一个Sprite源进行渲染,而Image需要位于某个Canvas下才能显示出来。场景中的Sprite可以像普通的3D游戏物体一样对待,通过Transform组件进行移动等操作,而Image则使用RectTransform进行布局,以便通过Canvas统一管理。由于RectTransform可以设置大小、对齐方式等,Image可以说更加方便一点,这也是很多人选择使用Image的原因。
渲染上,Sprite使用SpriteRenderer组件渲染,而Image则由CanvasRenderer组件渲染。两者在视觉上没有任何区别(都使用默认材质时)。它们默认的渲染也都是在Transparent Geometry队列中。
而在引擎的处理上,两者则有很大的不同。将Wireframe选项打开然后在场景中观察,就可以清楚地发现,Image会老老实实地为一个矩形的Sprite生成两个三角形拼成的矩形几何体,而Sprite则会根据显示内容,裁剪掉元素中的大部分透明区域,最终生成的几何体可能会有比较复杂的顶点结构。
那么这种不同会造成什么结果呢?在继续之前,我们先回顾一下游戏中每帧的渲染过程。对任何物体的渲染,我们需要先准备好相关数据(顶点、UV、贴图数据和shader参数等等),然后调用GPU的渲染接口进行绘制,这个过程称作Draw Call。GPU接收到DrawCall指令后,通过一系列流程生成最终要显示的内容并进行渲染,其中大致的步骤包括:
CPU发送Draw Call指令给GPU;
GPU读取必要的数据到自己的显存;
GPU通过顶点着色器(vertex shader)等步骤将输入的几何体信息转化为像素点数据;
每个像素都通过片段着色器(fragment shader)处理后写入帧缓存;
当全部计算完成后,GPU将帧缓存内容显示在屏幕上。
通过上面的认知,我们可以推断:
Sprite由于顶点数据更加复杂,在第1/2步时会比Image效率更低;
Sprite会比Image执行较多的顶点着色器运算;
Image会比Sprite执行更多的片段着色器运算;
看起来似乎Image比Sprite有更大的好处,然而事实上,由于片段着色器是针对每个像素运算,Sprite通过增加顶点而裁剪掉的部分减少了相当多的运算次数,在绝大多数情况下,反而比Image拥有更好的效率 —— 尤其是场景中有大量的2D精灵时。
总结一下,SpriteRenderer会创建额外的几何体来裁剪掉多余的透明像素区域,从而减少了大量的片段着色器运算,并降低了overdraw;而Image则会创建简单的矩形几何体。随着2D元素数量的增加,这种差别会慢慢明显起来。
可以看出,SpriteRenderer确实是经过优化以显示更多的元素的。所以在2D游戏开发中,游戏场景中的元素,应该尽量使用它去渲染。而Image应该仅用于UI显示(实际上即使不考虑性能原因,由于屏幕分辨率的变化,Image可能会被Canvas改变显示位置和实际大小,如果用于游戏内元素的显示,可能会造成跟预期设计不一致的显示结果,也应该避免使用)。
参考:http://www.cnblogs.com/AaronBlogs/p/6863298.html
Spite 和Image的区别相关推荐
- despite 和 in spite of 有什么区别?
1.论语气,despite 比in spite of 谨严,但意思没有分别,都可译做"虽然"或"不顾",例如:"In spite of/Despite ...
- Flex中添加大量组件时内存占用问题
前期在使用FLEX做一个设计器时考虑到了内存和效率问题,由于前期考虑到用户交互,还是使用了Group代替了Sprite作为设计器中组建的跟节点,但设计的图纸越来越大的时候,内存占用和效率的问题越来越突 ...
- 媒体查询中“屏幕”和“仅屏幕”之间有什么区别?
本文翻译自:What is the difference between "screen" and "only screen" in media queries ...
- 计算机 ps 文书,什么是补充文书?它和PS有啥区别?答案都在这了!
原标题:什么是补充文书?它和PS有啥区别?答案都在这了! 申请季已经到来,准备申请美本2018fall的小伙伴准备好了么?除了CA系统的文书题目,美国各大高校通常也会有自己的补充文书题目.最近普林斯顿 ...
- RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别
1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...
- C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别
最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的. 1. NULL ...
- gcc 和 g++ 的联系和区别,使用 gcc 编译 c++
GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...
- Python2 与 Python3 区别
Python2.x 与 Python3.x 区别 1. print 函数 Python2 中 print 是语句(statement),Python3 中 print 则变成了函数.在 Python3 ...
- Docker 入门系列(1)- 初识容器,镜像、容器、仓库的区别
Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...
最新文章
- 腾讯云主机安全防护(云镜卸载)--/usr/local/qcloud/YunJing/YDEyes/YDService
- 你们数学老师当年是怎么叫这些符号的…
- java工程引入scala_引入ReactiveInflux:用于Scala和Java的无阻塞InfluxDB驱动程序,支持Apache Spark...
- sqli-lab——Writeup(38~over)堆叠等......
- 自然语言处理以及对话系统知识点总结
- redis 中一个字段 修改map_Redis 几种数据类型及应用场景
- activiti表单设计器_基于Vue,ElementUI开发的一款表单设计器
- 图片上传,CheckBox等用户控件的应用代码
- arduino图形编程——ardublock
- python中node函数的意思_Node.js 函数
- 《MySQL必知必会》学习笔记——第四章(检索数据)
- MVP模式——Okhttp实现下载图片并带有进度 【Android Demo】
- 极域电子教室软件怎么脱离控制_如何制定职业发展目标,才能避免“现实发展脱离职业规划”的问题...
- GPIO模拟MDC/MDIO协议
- 利用WireShark下载视频网站的流媒体视频
- 什么是霍尔推进器?只能推动一张纸,却成为多国追捧的黑科技
- 梯形公式和辛普森的Matlab
- micropython控制舵机,Micropython之pwm控制舵机
- 武侠乂 兵器招式和高级心法介绍
- 南京车贴制作,海报车贴写真喷绘制作