4

私はJavaでlwjglを使用して、Minecraftのようなブロックベースの3Dゲームを構築しています。私は現在、関数void Update()とvoid Draw()を含むBlockクラスを持っており、ゲームループの各サイクルでUpdate()とDraw()の順序でそれらを呼び出します。関数drawには、ブロックにテクスチャを適用するように懇願するときにtexture.bind()が含まれ、6つの側面をそれぞれレンダリングする必要があるかどうかを確認するための条件が6つあります。例:

if(rendertop)
GL11.glVertex3f(position.x, position.y, position.z);
.....

現時点では、これらのブロックをたくさん描画するとfpsが遅くなり、ゲームがプレイできなくなることを除けば、かなりうまく機能します。グーグルで検索した後、3Dオブジェクトを画面に描画し、描画ごとに各頂点をグラフィックカードに送信するより良い方法があることがわかりました。私はリストを使おうとしましたが、それはもっと多くのメモリを必要とするようです。ブロックの各サイドに新しいリストを作成し、サイドを上記の例と同じようにレンダリングする必要がある場合は、それを呼び出しました。つまり、各ブロックには6つのリストがあります。これが私がリストを作った方法です:

GL11.glNewList(displayListId, GL11.GL_COMPILE);
GL11.glBegin(GL11.GL_QUADS);
...... (Calling GL11.glVertex3f to draw the side)
GL11.glEnd();
GL11.glEndList();

そして私はそれをこのように呼んだ:

if(rendertop)
GL11.glCallList(displayListId);

しかし、前に言ったように、それはゲームを非常に遅くするだけでしたが、これはおそらく私がそれを実装した方法と関係があることを私は知っています。その方法を使用する際のもう1つの問題は、表示リストを削除するために必要なブロックを破棄することです。その方法がわかりません。

ディスプレイリストやその他の方法を使用してパフォーマンスを向上させる方法を提案できる人はいますか?

4

2 に答える 2

1

頂点配列または頂点バッファオブジェクトを使用して、レンダリングをバッチ処理します。

各VAまたはVBOには、(たとえば)16x16x16のキューブブロックが含まれている必要があります。

于 2012-06-08T14:52:05.627 に答える
0

コードにディスプレイリストがすでに実装されている場合は、各ブロックを独自の頂点バッファーに単独で配置しても、速度が大幅に向上することに気付かないでしょう。

genpfaultが言ったことを実行しますが、特定のブロックが表示されているかどうかを判断するために、八分木、四分木、またはその他の種類のツリーを使用することを強くお勧めします(隠面判定)。これにより、パフォーマンスが大幅に向上します。

于 2012-06-13T21:41:40.273 に答える