nae*_*ego 10 opengl graphics performance 2d
我正在创建一个基于图块的2D游戏,作为学习基本"现代"OpenGL概念的一种方式.我正在使用OpenGL 2.1的着色器,并熟悉渲染管道以及如何在屏幕上实际绘制几何体.我想知道的是组织tilemap快速有效渲染的最佳方法.我想到了几种可能的方法:
1.)将表示单个图块(顶点和纹理坐标)的四边形存储在VBO中,并使用单独的draw*调用渲染每个图块,将其平移到屏幕上的正确位置,并使用uniform2i在该纹理图集中为该特定图块指定位置;
2.)保持包含屏幕上每个图块的VBO(已计算的屏幕坐标和纹理图集坐标),使用BufferSubData每帧更新图块但使用单个draw*调用;
3.)保持包含静态NxN"块"块的VBO,绘制许多块在屏幕上至少部分可见,并将它们各自转换到位.
*如果可能的话,我想远离最后一个选项,除非渲染64x64的块不是太低效.瓷砖以这种尺寸的块加载到内存中,即使一次只能在屏幕上看到大约20x40个图块,我也必须一次渲染多达四个块.这种方法还会以其他几种方式使我的代码复杂化.
那么,哪些是渲染瓷砖屏幕最有效的方法呢?有没有更好的方法?
你可以做其中任何一个,他们可能会没事; 你提出的渲染非常非常简单.
#1肯定会差一些原则上比其他的选择,因为你会被吸引了许多极其简单的"模式",而不是让GPU做了一大堆批处理工作的一个绘制调用.但是,如果您一次只能在屏幕上看到20×40 = 800个图块,那么对于任何现代CPU和GPU来说这都是一项微不足道的工作(除非您正在做一些疯狂的片段着色器).
我建议你选择最适合自己的程序,这样你就可以继续游戏了.我想这可能是#1,或者可能是#2.如果你发现自己有性能问题,那么做#2或#3(64×64听起来像一个很好的块大小)中的任何一个都可以让你花费最少的CPU时间在你的程序的绘图部分(即更新缓冲区) (一个或多个)).