仅在libgdx中缩放图像一次

时间:2014-04-04 03:48:20

标签: android image textures libgdx render

在我的安卓游戏中,我使用固定分辨率的图像让我们说256x256。现在,对于不同的设备屏幕,我通过计算适合该设备的宽度和高度来渲染它们。

假设在galaxy note2上我计算了width = 128和height = 128 ......对于不同的设备,宽度和高度也会有所不同。

这就是我创建纹理的方法..

....
imageTexture = new Texture(...);
....

在render()..

.... 
spriteBatch.draw(imageTexture,x,y,width,height);
....

所以,每当我调用draw()方法时,libgdx / opengl会将图像从256x256缩放到128x128,我想是的,是的!

有没有办法告诉opengl / libgdx只计算一次所有缩放?

我不知道图像是如何渲染的?加载到内存?缩放等?

libgdx中的Sprite如何工作?我试着理解Sprite的代码并且看起来像他们也获得了图像的宽度和高度,然后每次都进行缩放,即使他们有setScale()方法。

1 个答案:

答案 0 :(得分:4)

优化的第一条规则:得到一些数字。过早优化是许多问题的根源。也就是说,仍然有一些好的经验法则可以知道。

当您调用new Texture时,纹理数据将由libgdx / OpenGL上传到GPU。实际使用spriteBatch.draw绘制纹理时,OpenGL将指令上传到GPU,告诉硬件使用现有纹理并使其适合边界。 draw调用只上传坐标(定义Sprite的方框的角)和指向纹理的指针。实际纹理数据未上传。

因此,在实践中,您的图像会在每一帧上“缩放”。然而,这并不是那么糟糕,因为这正是GPU非常非常好地设计的。你只需要担心上传如此多的纹理,以至于GPU无法跟踪它们,你不必担心预先缩放纹理。

除了将数据发送到GPU的成本和刷新屏幕的成本之外,缩放和转换精灵的四个角落的成本相对微不足道,因此它们可能不值得担心太多。 SpriteBatch中的“批处理”是关于“批量”(或聚集在一起)大量坐标以立即发送到GPU,粗略地说,每次调用GPU都很昂贵。因此,尽可能在单个批次begin / end内完成尽可能多的工作。

尽管如此,现代机器的速度非常愚蠢,您应该能够做最简单的事情,让您的应用程序首先运行。然后,一旦你有正确的工作,你可以找出哪些部分实际上很慢并修复它们。 “低效”但实际上不会对您的应用产生重大影响的部分可以单独使用。