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指令后,通过一系列流程生成最终要显示的内容并进行渲染,其中大致的步骤包括:

  1. CPU发送Draw Call指令给GPU;

  2. GPU读取必要的数据到自己的显存;

  3. GPU通过顶点着色器(vertex shader)等步骤将输入的几何体信息转化为像素点数据;

  4. 每个像素都通过片段着色器(fragment shader)处理后写入帧缓存;

  5. 当全部计算完成后,GPU将帧缓存内容显示在屏幕上。

通过上面的认知,我们可以推断:

  1. Sprite由于顶点数据更加复杂,在第1/2步时会比Image效率更低;

  2. Sprite会比Image执行较多的顶点着色器运算;

  3. 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的区别相关推荐

  1. despite 和 in spite of 有什么区别?

    1.论语气,despite 比in spite of 谨严,但意思没有分别,都可译做"虽然"或"不顾",例如:"In spite of/Despite ...

  2. Flex中添加大量组件时内存占用问题

    前期在使用FLEX做一个设计器时考虑到了内存和效率问题,由于前期考虑到用户交互,还是使用了Group代替了Sprite作为设计器中组建的跟节点,但设计的图纸越来越大的时候,内存占用和效率的问题越来越突 ...

  3. 媒体查询中“屏幕”和“仅屏幕”之间有什么区别?

    本文翻译自:What is the difference between "screen" and "only screen" in media queries ...

  4. 计算机 ps 文书,什么是补充文书?它和PS有啥区别?答案都在这了!

    原标题:什么是补充文书?它和PS有啥区别?答案都在这了! 申请季已经到来,准备申请美本2018fall的小伙伴准备好了么?除了CA系统的文书题目,美国各大高校通常也会有自己的补充文书题目.最近普林斯顿 ...

  5. RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别

    1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...

  6. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别

    最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的. 1. NULL ...

  7. gcc 和 g++ 的联系和区别,使用 gcc 编译 c++

    GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...

  8. Python2 与 Python3 区别

    Python2.x 与 Python3.x 区别 1. print 函数 Python2 中 print 是语句(statement),Python3 中 print 则变成了函数.在 Python3 ...

  9. Docker 入门系列(1)- 初识容器,镜像、容器、仓库的区别

    Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...

最新文章

  1. 腾讯云主机安全防护(云镜卸载)--/usr/local/qcloud/YunJing/YDEyes/YDService
  2. 你们数学老师当年是怎么叫这些符号的…
  3. java工程引入scala_引入ReactiveInflux:用于Scala和Java的无阻塞InfluxDB驱动程序,支持Apache Spark...
  4. sqli-lab——Writeup(38~over)堆叠等......
  5. 自然语言处理以及对话系统知识点总结
  6. redis 中一个字段 修改map_Redis 几种数据类型及应用场景
  7. activiti表单设计器_基于Vue,ElementUI开发的一款表单设计器
  8. 图片上传,CheckBox等用户控件的应用代码
  9. arduino图形编程——ardublock
  10. python中node函数的意思_Node.js 函数
  11. 《MySQL必知必会》学习笔记——第四章(检索数据)
  12. MVP模式——Okhttp实现下载图片并带有进度 【Android Demo】
  13. 极域电子教室软件怎么脱离控制_如何制定职业发展目标,才能避免“现实发展脱离职业规划”的问题...
  14. GPIO模拟MDC/MDIO协议
  15. 利用WireShark下载视频网站的流媒体视频
  16. 什么是霍尔推进器?只能推动一张纸,却成为多国追捧的黑科技
  17. 梯形公式和辛普森的Matlab
  18. micropython控制舵机,Micropython之pwm控制舵机
  19. 武侠乂 兵器招式和高级心法介绍
  20. 南京车贴制作,海报车贴写真喷绘制作

热门文章

  1. CMD删除指定文件夹
  2. 八、 数据库的数据查询
  3. C语言:将一个文本文件按字符送上屏幕(动画效果)
  4. 谣言检测论文分享(三)
  5. 火锅店的管道问题怎么解决?
  6. 移动端网页实现拨打电话功能的几种方法以及点击立刻qq联系
  7. java 解析证书吊销列表 crl
  8. 从伯努利分布到多项式分布
  9. Dreamweaver CS4序列号
  10. xamarin android alertdialog详解