2014-04-04 60 views
0

在我的Android游戏中,我使用的固定分辨率的图片让说256×256。现在针对不同的设备屏幕,我通过针对该设备计算它们的宽度和高度来渲染它们。在libgdx缩放图像只有一次

假设在银河注2上我计算了width = 128和height = 128 ...对于不同的设备,类似的宽度和高度也会有所不同。

我这是怎么创造的质感..

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

在渲染()..

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

所以,每次当我打电话draw()方法时,确实libgdx/OpenGL的规模图像从256x256到128x128,我想是的!

有没有什么办法告诉opengl/libgdx只计算一次所有的缩放比例?

我不知道图像的方式呈现?加载到内存中?缩放等?

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

回答

3

优化的第一条规则:获得一些数字。不成熟的优化是许多问题的根源。也就是说,还有一些很好的经验法则可以知道。

当您调用new Texture时,纹理数据将由libgdx/OpenGL上传到GPU。当你真正绘制纹理spriteBatch.draw指令上传到由OpenGL的GPU的告诉硬件使用现有的质地和它适合的范围。该draw通话刚刚上传坐标(定义雪碧盒子的角落)和指针质感。实际的纹理数据没有上传。

因此,在实践中,您的图像在每一帧都“缩放”。然而,这并不是那么糟糕,因为这正是GPU非常非常好的设计。您只需要担心上传太多纹理以至于GPU无法全面跟踪这些纹理,您无需事先对纹理进行缩放操作。

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

尽管如此,现代化的机器速度非常快,而且您应该能够做任何最简单的操作,让您的应用程序首先运行。然后,一旦你有正确的工作,你可以找出哪些部分实际上是缓慢的,并修复这些。 “效率低下”但实际上并没有显着影响应用程序的部分可以单独使用。