当我的瓷砖使用批量渲染时,如何支持滚动?

我有瓷砖地图100 * 75和瓷砖32 * 32像素。我想使用批处理的性能。我不明白,因为我的游戏需要滚动和每帧我画22 * 16瓷砖(我的屏幕是20 * 16平方米)。我以为每一个框架的瓷砖批量。这是好还是任何建议?

编辑:为了更清楚我想同时使用遮挡剔除和配料。我认为只绘制可见区域并将它们配合在一起。但是有一些我无法弄清楚。当用translatematrix滚动屏幕时,如果一行变为不可见,我绑定新行并重新批量处理。每个批处理对象都需要重新缓冲。每隔一行不可见的时候,我就会批量打印缓冲区,并将其缓冲到VBO。我不知道这种方式是否有效。这是我的问题,我愿意接受任何建议。

    更清楚我想同时使用遮挡剔除和配料。

    封锁剔除? 您正在绘制图块 ,而不是3D多边形网格。 它们是轴alignment的。 需要非常简单的math知道哪些瓷砖在屏幕上。

    另外,即使对于Android硬件,在屏幕外画几件事也不会对你的performance产生任何影响。 只要你使用正确的纹理纹理(在纹理之间没有纹理变化),你可能只是画出整个100×75的地图,没有任何问题。

    批次意味着将东西捆绑成一个平局。 当批次是静态的时候,批次是最有效的:它们不会逐帧地改变。 如果你不得不重建你的索引列表或者添加新的顶点,那么你的批处理就是错误的。

    你没有说你渲染的是什么尺寸的屏幕,所以我认为它大约是1024×768。 如果且仅当您对应用程序进行分析并检测到简单地绘制100×75地图太慢,则可以将地图分割为32×32的分段。 如果其中一个分段在屏幕上,则绘制它。 即使这只是一个瓷砖。 这是避免非静态批处理的最好方法。

    再说一次,如果你实际上有一个performance不足的话,那么就麻烦你了。 如你所说的,你在select的硬件上运行它,而不是以你想要的方式执行。

    根据我的经验,只需简单地通过滚动量(偏离起点)简单地转换您即将绘制的坐标即可解决问题。

    你在回答另一个答案时提到你正在使用OpenGl。 您可以使用glTranslate在场景中移动对象。

    glTranslate(x, y, z) 

    http://www.opengl.org/sdk/docs/man/xhtml/glTranslate.xml

    我想象你在一个二维数组上循环绘制你的瓷砖。 所以代码可能看起来像这样:

     glPushMatrix(); glTranslate(scrollX, scrollY, 0); for (int i=0; i < array.size(); i++) for (int j=0; i <array[i].size(); j++) array[i][j].Draw(); glPopMatrix() 

    您可以使用视口边缘的播放器/光标位置来计算滚动值。 请注意,这会绘制屏幕外的图块,并可能会影响性能。 您可以通过计算可见的图块值来执行剔除,并将这些值用作循环中的边界。

     for (int i = leftValue; i <= rightValue; i++) 

    有关更多信息,请参阅MSDN上的此页面 。 这是我描述的技术,但对于C#和XNA。

    你正在使用哪些工具,你打算发布什么平台? 很可能,你如何做绘图并不重要,除非你使用一些非常模糊的技术,现代计算机应该足够快。

    试试你的select,一起popup一个基准,找出不同的选项多快,不应该太难。

    有几个解决scheme:

    1. 最简单的解决scheme:把所有的瓷砖放在一个大的图像。 所有绘图调用将引用这个图像并绘制它的不同部分。 这可以在一个批次中执行。 图像可能会变得太大,手机无法处理或包含仅用于一个级别和浪费内存的瓷砖。

    2. 将绘图延迟到渲染器类:渲染器将通过drawOrder和图像对所有精灵进行sorting。 这将为每个绘图层使用相同的源图像批量调用所有的调用。 您的滚动algorithm只是标记哪些精灵是可见的。

    3. 组合1和2:将同一个图层的图块放入一个图像文件,然后让渲染器绘制每个图层。