다음 스칼라 코드가 실행 중입니다. 10,000 큐브의 단일 디스플레이 목록을 컴파일합니다. 그런 다음 가능한 한 빨리 실행되는 애니메이터를 사용하여 디스플레이 루프에 표시합니다. 그러나 FPS는 약 20 개 밖에 없습니다. 디스플레이 목록을 사용하면 매우 신속하게 처리 할 수 있다고 생각했습니다. 나는 10k-100k의 물체를 표시 할 수 있어야하는 상황이 있습니다. 그렇게 할 수있는 더 좋은 방법이 있습니까? 디스플레이 루프에서 거의 모든 작업은 gluLookAt 및 glCallList (마지막 메서드)를 호출하는 것입니다. "- 3.0 3.1 - 3.3 ≥ 4.0, ES 1.x 및 ES 2.X + 거의 모든 벤더 확장의 OpenGL 1.3"10,000 개의 정적 큐브에 대한 OpenGL 성능
을나는 지원 말한다 jogamp.org에서 JOGL 2.0 RC5를 사용하고 있습니다
class LotsOfCubes extends GLEventListener {
def show() = {
val glp = GLProfile.getDefault();
val caps = new GLCapabilities(glp);
val canvas = new GLCanvas(caps);
canvas.addGLEventListener(this);
val frame = new JFrame("AWT Window Test");
frame.setSize(300, 300);
frame.add(canvas);
frame.setVisible(true);
}
override def init(drawable: GLAutoDrawable) {
val gl = drawable.getGL().getGL2()
gl.glEnable(GL.GL_DEPTH_TEST)
gl.glNewList(21, GL2.GL_COMPILE)
var i = -10.0f
var j = -10.0f
while (i < 10.0f) {
while (j < 10.0f) {
drawItem(gl, i, j, 0.0f, 0.08f)
j += 0.1f
}
i += 0.1f
j = -10f
}
gl.glEndList()
val an = new Animator(drawable);
drawable.setAnimator(an);
an.setUpdateFPSFrames(100, System.out)
an.start();
}
override def dispose(drawable: GLAutoDrawable) {
}
override def reshape(drawable: GLAutoDrawable, x: Int, y: Int, width: Int, height: Int) {
val gl = drawable.getGL().getGL2();
val glu = new GLU
gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(10, 1, -1, 100);
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
}
def drawBox(gl: GL2, size: Float) {
import Global._
gl.glBegin(GL2.GL_QUADS);
for (i <- 5 until -1 by -1) {
gl.glNormal3fv(boxNormals(i), 0);
val c = colors(i);
gl.glColor3f(c(0), c(1), c(2))
var vt: Array[Float] = boxVertices(boxFaces(i)(0))
gl.glVertex3f(vt(0) * size, vt(1) * size, vt(2) * size);
vt = boxVertices(boxFaces(i)(1));
gl.glVertex3f(vt(0) * size, vt(1) * size, vt(2) * size);
vt = boxVertices(boxFaces(i)(2));
gl.glVertex3f(vt(0) * size, vt(1) * size, vt(2) * size);
vt = boxVertices(boxFaces(i)(3));
gl.glVertex3f(vt(0) * size, vt(1) * size, vt(2) * size);
}
gl.glEnd();
}
def drawItem(gl: GL2, x: Float, y: Float, z: Float, size: Float) {
gl.glPushMatrix()
gl.glTranslatef(x, y, z);
gl.glRotatef(0.0f, 0.0f, 1.0f, 0.0f); // Rotate The cube around the Y axis
gl.glRotatef(0.0f, 1.0f, 1.0f, 1.0f);
drawBox(gl, size);
gl.glPopMatrix()
}
override def display(drawable: GLAutoDrawable) {
val gl = drawable.getGL().getGL2()
val glu = new GLU
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
gl.glLoadIdentity()
glu.gluLookAt(0.0, 0.0, -100.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f)
gl.glCallList(21)
}
}
어떤 하드웨어를 사용하고 있습니까? 이중 "버퍼링"이 활성화되어 있습니까? –
'caps.setDoubleBuffered (true)'를 추가했는데 성능에 영향을 미치지 않았습니다. 하드웨어에 관해서는, 1 년 또는 2 년 전의 미드 레인지 엔비디아 그래픽 카드가 있습니다. CPU는 수년 전부터 2 개의 듀얼 코어 옵테론입니다. – mentics
둘째, 사용하는 OpenGL 버전을 지정하십시오. GL2는 OpenGL 2를 가리 킵니까? _Oh_ 이것은 [JOGL] (http://jogamp.org/jogl/www/)이며 [GL2] (http://download.java.net/media/jogl/jogl-2.x-docs/ javax/media/opengl/GL2.html)은 OpenGL * 3 *을 의미합니다. _scala GL2_를 검색해도 많이 안타가 발생하지 않았습니다 ... –