Opengl 2D性能提示
Opengl 2D performance tips
我目前正在开发一款头侯式的子弹地狱射击游戏。屏幕上绝对会充满子弹(所以实例化是我想要的),但我希望它能在旧的硬件上运行,所以我现在正在做一些类似的事情,在我弄清楚之前,还没有颜色、纹理等。
glVertexPointer(3, GL_FLOAT, 0, SQUARE_VERTICES);
for (int i = 0; i < info.centers.size(); i += 3) {
glPushMatrix();
glTranslatef(info.centers.get(i), info.centers.get(i + 1), info.centers.get(i + 2));
glScalef(info.sizes.get(i), info.sizes.get(i + 1), info.sizes.get(i + 2));
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_SHORT, SQUARE_INDICES);
glPopMatrix();
}
因为我想让它在旧硬件上工作,所以我尽量避免着色器之类的东西。上面的设置让我在大约80个多边形上失败了。我希望至少能从中得到几百美元。info
是一个结构,它具有所有的渲染功能,除了一些向量之外,没有什么其他功能。
我是OpenGL的新手,但我至少听过并尝试过所有可以做的事情,但并没有说我擅长它。这个游戏是一个2D游戏,我从SDL切换到Opengl,因为它会让一些更花哨的效果变得更容易。显然SDL的工作方式不同,但我在使用它时从未遇到过这个问题
归根结底,我在这里显然做错了什么,那么我如何才能正确地实现旧硬件(OpenGL 1.x)的实例化呢?另外,给我一些提高性能的建议。
另外,给我一些提高性能的建议。
如果要使用精灵。。。。
- 将所有精灵加载到一个巨大的纹理中。如果它们不合适,可以使用几个纹理,但要保持较低的纹理数量,以避免纹理切换
- 尽可能不频繁地切换纹理和更改OpenGL状态。理想情况下,您应该设置纹理一次,然后用它绘制所有可以绘制的内容
- 对文本使用纹理字体。FTGL字体可能看起来不错,但对于复杂的字体,它可能会严重影响性能
- 尽可能避免阿尔法混合,并使用阿尔法测试
- alpha混合时,请始终使用alpha测试来减少绘制的像素数。当你的纹理有很多alpha==0的像素时,用alpha测试将它们剪切掉
- 减少非常大的精灵数量。即使在非常好的硬件上,巨大的屏幕对齐/像素对齐精灵(1024*1024)也会降低FPS
- 不要使用非二次幂大小的纹理。它们(过去)在某些ATI卡上产生巨大的性能下降
glTranslatef
对于基于2D精灵的(这很重要)游戏,您可以完全避免矩阵(也许相机/投影矩阵除外)。我不认为矩阵对2D游戏有多大好处。
对于2d游戏,你的主要瓶颈将是GPU内存传输速度——将数据从纹理传输到屏幕。所以"像小抽奖一样使用"answers"把所有东西都放在VA"对你没有帮助——你可以用一个精灵来扼杀性能。
但是,如果你要使用不使用纹理的矢量图形(请参阅area2048(youtube)或rez),那么上面的大多数建议都不适用,这样的游戏与3d游戏没有太大区别。在这种情况下,使用顶点数组、顶点缓冲区对象或显示列表(取决于可用的内容)并使用矩阵函数是合理的,因为瓶颈将是顶点处理。您仍然需要尽量减少状态开关的数量。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 有没有办法提示用户使用哪种数据类型作为模板 c++
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- Opengl 2D性能提示
- 是否有使用可能/不可能提示的性能测试结果
- float4 -乘-添加性能提示