一般渲染和性能问题(OpenGL)

时间:2015-05-07 14:53:41

标签: android optimization opengl-es libgdx rendering

我正在使用LibGDX,我需要一些常规优化问题的答案:

  1. 如果我绘制一个只对视口/相机部分可见的精灵,它是否具有与绘制视口完全可见的相同的性能影响?
  2. 如果我在活动视口的边界之外绘制一个精灵,它是否会影响性能,就像没有绘制精灵一样,或者类似于在视口内绘制精灵?换句话说:屏幕外精灵有什么样的性能影响?
  3. 在屏幕上绘制一个大型TextureAtlas(2048x2048)的小区域(例如32x32)时,它是否具有与绘制小型32x32单个纹理相似的性能?我知道大纹理会影响内存使用,但是只渲染一个小区域会影响实时渲染性能吗?
  4. 如果我在渲染时旋转一个大精灵,它会影响性能吗?
  5. 如果我在屏幕上绘制4096x4096纹理,但是将其缩小以使其在屏幕上看起来像10x10,它是否具有与渲染全尺寸相同的性能?即屏幕上纹理的表观大小是否会影响渲染性能?

3 个答案:

答案 0 :(得分:2)

  1. 没有
  2. 它比在视口中绘制它更具感染性,但仍然没有完全没有绘制它的性能。
  3. 较大的图像需要更多时间来准备渲染。实际渲染与快速渲染相同。
  4. 没有

答案 1 :(得分:1)

  1. 没有。顶点处理将是相同的,但视口外的片段将被剪切,从而减少片段处理。

  2. 这只是问题1的极端情况。现在没有片段处理,但仍然是所有顶点处理。根据顶点处理的便宜/昂贵程度,这可能会变化很大。它当然不仅仅是绘画。另一方面,如果在应用程序中添加大量逻辑以避免绘制精灵,则可能会增加比通过不渲染而节省的开销。

  3. 加载纹理后,渲染本身应该非常相似。但是当然加载纹理会更加昂贵。这不仅适用于加载纹理数据的OpenGL调用,还适用于在渲染之前将其映射到GPU地址空间的开销,以及其他相关的内存管理开销。

  4. 也许。但可能并不多。 GPU使用针对本地访问进行了优化的内存布局,而不太依赖访问模式的方向。

  5. 以10x10渲染肯定要便宜得多,因为碎片和相应的采样操作要少得多。但它仍然比使用10x10纹理渲染要昂贵得多,因为访问的本地化程度要低得多,因此会有更多的缓存未命中。为了避免这种情况,请使用mipmapping,如果渲染较大的纹理缩小,这将为您提供较小纹理的大部分性能。

答案 2 :(得分:0)

谈论性能时,影响取决于瓶颈是什么。绘制一个精灵使用一些CPU和一小部分GPU,无论它在屏幕上有多少(如果有的话)。通常,精灵的实际像素越多,它将使用的GPU就越多。

  1. 就CPU而言,没有区别,但对于GPU来说,绘制更少的精灵像素更好。

  2. 关闭屏幕精灵会产生CPU影响并且对GPU造成很小的影响。如果你有很多屏幕外的精灵,你可能需要避免绘制它们,但你应该分组而不是逐一检查它们,否则你可能会花费更多的CPU来检查它们而不是将它们抽出来屏幕。

  3. 绘制大纹理的小区域与绘制小纹理具有相同的性能。但第一个选项允许您将许多不同的图像批量处理为一个绘图调用,这是一个大的保护程序。

  4. 有些,因为你会在每一帧上重新计算它的顶点。

  5. 将其缩小意味着您绘制的像素更少,因此速度更快。