关闭

Libdgx专题系列:对象篇源码分析 SpriteBatch

标签: Libgdxopengl esandroid
3183人阅读 评论(0) 收藏 举报
分类:

声明:

本系列文章使用的Libgdx版本均为0.99版本

Libgdx游戏开发交流群 323876830

 

在Libgdx中,使用比较多的就有SpriteBatch,字面的意思就是精灵组。

文档的具体解释为:

1.SpriteBatch用来绘制2D的带有纹理或纹理区域的矩形的。 他可以把绘制的一些命令捆绑起来,然后一起发给GPU来处理。

2.在绘制之前首先要调用begin方法,去开启想对应的绘制状态,当绘制完了,需要调用end方法,来真正的绘制指定的内容。

3.SpriteBatch操作的所有的绘制命令都是在屏幕坐标系统上的,屏幕坐标系统是一个右手坐标系, x轴向右,y轴向上,原点

在屏幕左下角,如果我们想做的话,也可以提供模型视口矩阵和投影矩阵给他。

4.SpriteBatch也被管理着,在某些情况下, OpenGL上下文丢失了SpriteBatch使用的所有OpenGL资源,例如我们切换到其

他应用,或者接电话,当OpenGL的上下文恢复的时候,SpriteBatch将会自动下载资源。

5.SpriteBatch是一个相对比较大的对象,所以我们最好在程序中,只是用一个。

6.SpriteBatch可以在OpenGL ES 1.x 和 2.0使用, 在2.0中,我们可以提供一个自己的着色器绘制精灵。

7.另外,SpriteBatch实现了disposed接口 , 所以不使用的时候,别忘了销毁资源。

下面我们一条条解读看看都是怎么做的。

 

1.SpriteBatch用来绘制2D的带有纹理或纹理区域的矩形的。 他可以把绘制的一些命令捆绑起来,然后一起发给GPU来处理。

SpriteBatch是一个Libgdx提供的专门对于2D面板的一个类, 这点大家应该都知道, 那么他是怎么捆绑起来,分组提交给GPU的呢?

首先我们需要知道组的概念, 组就是每次发送给GPU的数据就是一组, 那么每组的数据量是多大呢,SpriteBatch的构造方法有个size

的参数

public SpriteBatch (int size)

可以指定矩形面板的数量多少,默认是1000个,这里他是有最大值限制的。

		// 32767 is max index, so 32767 / 6 - (32767 / 6 % 3) = 5460.
		if (size > 5460) throw new IllegalArgumentException("Can't have more than 5460 sprites per batch: " + size);

当绘制的时候他是有两种情况发送数据到GPU的, 一种情况是纹理改变的时候, 还有一种是达到了最大的顶点值最大值,

		if (texture != lastTexture)
			switchTexture(texture);
		else if (idx == vertices.length) //
			flush();


flush方法就是具体绘制的方法了, 纹理绑定,把顶点数据值传给Mesh图元, 让他进行绘制,方法的最后把顶点计数值清零等操作,以便下次操作使用。

 

2.在绘制之前首先要调用begin方法,去开启想对应的绘制状态,当绘制完了,需要调用end方法,来真正的绘制指定的内容。

使用SpriteBatch的时候,begin和end是成对出现的。 绘制前必须调用begin,绘制后调用end,这是因为begin执行了状态的开启,着色器的开启,矩阵信息填充,提交给GPU

的大小初始化等操作

	public void begin () {
		if (drawing) throw new IllegalStateException("SpriteBatch.end must be called before begin.");
		renderCalls = 0;

		Gdx.gl.glDepthMask(false);
		if (Gdx.graphics.isGL20Available()) {
			if (customShader != null)
				customShader.begin();
			else
				shader.begin();
		} else {
			Gdx.gl.glEnable(GL10.GL_TEXTURE_2D);
		}
		setupMatrices();

		drawing = true;
	}


3.SpriteBatch操作的所有的绘制命令都是在屏幕坐标系统上的,屏幕坐标系统是一个右手坐标系, x轴向右,y轴向上,原点

在屏幕左下角,如果我们想做的话,也可以提供模型视口矩阵和投影矩阵给他。

在Opengl中有很多坐标系, SpriteBatch操作的是屏幕坐标, 使用的右手坐标系,就是攥紧右手, 拇指朝上, 中指伸直。在begin的时候,调整投影矩阵

和模型视口矩阵,并且初始为单位矩阵。

			gl.glMatrixMode(GL10.GL_PROJECTION);
			gl.glLoadMatrixf(projectionMatrix.val, 0);
			gl.glMatrixMode(GL10.GL_MODELVIEW);
			gl.glLoadMatrixf(transformMatrix.val, 0);

这个一定要在绘制之前来做这些事,系统才知道是在什么模式下的绘制。

 

4.SpriteBatch也被管理着,在某些情况下, OpenGL上下文丢失了SpriteBatch使用的所有OpenGL资源,例如我们切换到其

他应用,或者接电话,当OpenGL的上下文恢复的时候,SpriteBatch将会自动下载资源。

 

5.SpriteBatch是一个相对比较大的对象,所以我们最好在程序中,只是用一个。

SpriteBatch在构造的时候,做了很多的事情, 如果有多个的话, 会很浪费内存的, 他保存了很多顶点数据信息,所以最好项目中绘制的时候都使用同一个
SpriteBatch.

 

6.SpriteBatch可以在OpenGL ES 1.x 和 2.0使用, 在2.0中,我们可以提供一个自己的着色器绘制精灵。

大家在使用SpriteBatch的时候,并不需要考虑里面的Opengl是1.x或者是2.0的,在类的内部已经对他进行了区别处理, 当然2.0的也可以设置着色器。

 

7.另外,SpriteBatch实现了disposed接口 , 所以不使用的时候,别忘了销毁资源。

在Libgdx中凡是实现了Disposable接口的,在销毁的时候都要调用dispose方法, 这一点不要忘了。

 

转载请链接原文地址 http://blog.csdn.net/wu928320442/article/details/17142929

0
0
查看评论

libgdx - SpriteBatch的使用

SpriteBatch 这是绘图时会经常使用的一个功能类,它位于 com.badlogic.gdx.graphics.g2d中。 控制类接口: begin() 开始准备成批量的画图,它打开了混合和纹理。 end() 结束渲染,它关闭了混合和纹理,并且必须在...
  • wangzhiyu1980
  • wangzhiyu1980
  • 2014-06-23 21:17
  • 1520

Libgdx 之SpriteBatch深入分析

Libgdx共享资源因为Libgdx可以在多平台上运行,因此理论上资源应该放在core目录下,因为Android和桌面版都包含主目录。但是Android对于如何存放这些文件有严格的规则,我们必须把资源放在固定的目录下。因此如果创建的工程需要在Android设备下运行的话,必须把资源放在Android...
  • zqiang_55
  • zqiang_55
  • 2016-03-27 17:07
  • 1787

Libdgx专题系列:对象篇源码分析 SpriteBatch

在Libgdx中,使用比较多的就有SpriteBatch,字面的意思就是精灵组。 文档的具体解释为: 1.SpriteBatch用来绘制2D的带有纹理或纹理区域的矩形的。 他可以把绘制的一些命令捆绑起来,然后一起发给GPU来处理。 2.在绘制之前首先要调用begin方法,去开启想对应的绘制状态,当绘...
  • wu928320442
  • wu928320442
  • 2013-12-05 19:08
  • 3183

SpriteBatch详解——SpriteBatch.Begin 和 SpriteBatch.End

公共方法 Name    Description
  • arhaiyun
  • arhaiyun
  • 2012-08-29 22:36
  • 840

Libgdx专题系列:对象篇源码分析 Sprite

Sprite即精灵,
  • wu928320442
  • wu928320442
  • 2013-12-06 17:10
  • 3064

Libgdx专题系列:对象篇源码分析 TextureRegion

TextureRegion即纹理区域, 他所使用的坐标系统是一个原点在左下角, x轴方向向右,y轴方向向下(这里和屏幕坐标不同)。 在纹理上面的区域使用的是uv映射坐标来做的。 可能有些人对uv坐标映射不是太清楚,这里我画了张图 其中 float u, v; 代表起点的uv坐标 float u2...
  • wu928320442
  • wu928320442
  • 2013-12-06 11:25
  • 3273

LibGdx----Texture, TextureRegion, SpriteBatch

Introduction   本章介绍2D图形相关的一些基本内容,包括如何使用Texture,TextureRegion和SpriteBatch。 Texture   略。。 SpriteBatch   LibGdx使用SpriteBatch来完成纹理映射并在屏幕上显示...
  • liuhailin1989
  • liuhailin1989
  • 2014-11-13 18:41
  • 430

XNA 4.0 spriteBatch的draw方法详解·

  • 2012-08-03 08:53
  • 16KB
  • 下载

IOS开发系列——UIView专题之四:事件分发机制篇【整理,部分原创】

4事件分发机制 iOS中的事件大概分为三种,分别是Milti-Touch Events, Motion Events和Remote Control Events(events for controlling multimedia)。 4.1hitTest iOS事件分发机制(一)hit-Te...
  • junbaozi
  • junbaozi
  • 2016-01-09 16:59
  • 633

libdgx使用初步

libdgx使用初步       libdgx是一款开源的android游戏引擎,基于OpenGL ES。SDK的下载地址http://code.google.com/p/libgdx/downloads/list, 这个列表里列举了所有的资源包...
  • haihui1985
  • haihui1985
  • 2011-11-06 08:56
  • 420
    个人资料
    • 访问:205190次
    • 积分:2304
    • 等级:
    • 排名:第19181名
    • 原创:39篇
    • 转载:0篇
    • 译文:0篇
    • 评论:122条
    Android开发交流群
    323876830
    博客专栏