Tôi đang chạy mã Scala sau đây. Nó biên soạn một danh sách hiển thị duy nhất của 10.000 hình khối. Sau đó, nó sẽ hiển thị chúng trong vòng lặp hiển thị với trình làm hoạt hình chạy nhanh nhất có thể. Nhưng FPS chỉ khoảng 20. Tôi đã nghĩ rằng việc sử dụng danh sách hiển thị sẽ có thể xử lý việc này rất nhanh chóng. Tôi có một tình huống mà tôi cần để có thể hiển thị 10k-100k đối tượng. Có cách nào tốt hơn để làm như vậy không? Trong vòng lặp hiển thị, khá nhiều tất cả nó làm là gọi gluLookAt và glCallList (đó là phương pháp cuối cùng).Hiệu suất OpenGL cho 10.000 hình khối tĩnh
Tôi đang sử dụng JOGL 2.0-rc5 từ jogamp.org cho biết nó hỗ trợ "OpenGL 1.3 - 3.0, 3.1 - 3.3, ≥ 4.0, ES 1.x và ES 2.x + gần như tất cả tiện ích mở rộng nhà cung cấp"
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)
}
}
bạn đang sử dụng phần cứng nào? Tính năng "đệm" đôi có được bật không? –
Tôi đã thêm 'caps.setDoubleBuffered (true)' và nó không ảnh hưởng đến hiệu suất. Đối với phần cứng, tôi có một card đồ họa tầm trung nvidia từ một hoặc hai năm trước. CPU là 2 opteron lõi kép từ nhiều năm trước. – mentics
Thứ hai, vui lòng chỉ định phiên bản OpenGL bạn sử dụng. 'GL2' có chỉ ra OpenGL 2 không? _Oh_, đây là [JOGL] (http://jogamp.org/jogl/www/) và [GL2] (http://download.java.net/media/jogl/jogl-2.x-docs/ javax/media/opengl/GL2.html) có nghĩa là OpenGL * 3 *. Tìm kiếm _scala GL2_ không dẫn đến nhiều lần truy cập ... –