【问题标题】:scaling images in libgdx only once仅在 libgdx 中缩放图像一次
【发布时间】:2014-05-16 04:44:58
【问题描述】:

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

假设在 Galaxy Note2 上我计算出 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() 方法。

【问题讨论】:

    标签: android image textures libgdx render


    【解决方案1】:

    优化的第一条规则:获取一些数字。过早的优化是许多问题的根源。也就是说,仍然有一些好的经验法则需要了解。

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

    因此,实际上,您的图像在每一帧上都会“缩放”。然而,这并没有那么糟糕,因为这正是 GPU 的设计初衷,非常非常好。您只需要担心上传太多纹理以至于 GPU 无法跟踪所有纹理,您无需担心事先缩放纹理。

    缩放和变换精灵四个角的成本与将数据发送到 GPU 的成本和刷新屏幕的成本相比相对微不足道,因此它们可能不值得过多担心。 SpriteBatch 中的“批处理”是关于“批量”(或收集)大量坐标以一次发送到 GPU,大致而言,每次调用 GPU 都可能很昂贵。因此,在单个批次的begin/end 中尽可能多地完成工作总是好的。

    同样,现代机器的速度非常快,您应该能够做任何最简单的事情来让您的应用首先运行。然后,一旦您的某些东西正常工作,您就可以找出哪些部分实际上很慢并修复它们。那些“低效”但实际上并没有显着影响您的应用程序的部分可以不用管。

    【讨论】:

      猜你喜欢
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      相关资源
      最近更新 更多