के लिए ओपनजीएल प्रदर्शन मैं निम्नलिखित स्कैला कोड चला रहा हूं। यह 10,000 क्यूबों की एक एकल डिस्प्ले सूची संकलित करता है। फिर यह उन्हें एक एनिमेटर के साथ डिस्प्ले लूप में प्रदर्शित करता है जो जितना तेज़ हो सके उतना तेज़ चलता है। लेकिन एफपीएस केवल 20 के आसपास है। मैंने सोचा था कि डिस्प्ले सूचियों का उपयोग करके इसे बहुत जल्दी संभालने में सक्षम होंगे। मेरे पास एक ऐसी स्थिति है जहां मुझे 10k-100k की वस्तुओं को प्रदर्शित करने में सक्षम होना चाहिए। क्या ऐसा करने का कोई बेहतर तरीका है? डिस्प्ले लूप में, यह बहुत कुछ करता है कॉल gluLookAt और glCallList (यह आखिरी विधि है) है। "- 3.0, 3.1 - 3.3, ≥ 4.0, ES 1.x और ES 2.x + लगभग सभी विक्रेता एक्सटेंशन ओपन 1.3"10,000 स्थिर क्यूब
मैं जो कहना है कि वह समर्थन करता है 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) 'जोड़ा और यह प्रदर्शन को प्रभावित नहीं किया। हार्डवेयर के लिए, मेरे पास एक या दो साल पहले मध्य श्रेणी के एनवीडिया ग्राफिक्स कार्ड हैं। सीपीयू साल पहले से दो ड्यूल-कोर ऑप्टरन्स हैं। – mentics
दूसरा, कृपया उपयोग किए जाने वाले ओपनजीएल संस्करण को निर्दिष्ट करें। क्या 'जीएल 2' ओपनजीएल 2 इंगित करता है? _Oh_, इस [JOGL] (http://jogamp.org/jogl/www/) है, और [gl2 के] (http://download.java.net/media/jogl/jogl-2.x-docs/ जावैक्स/मीडिया/ओपनग्ल/जीएल 2.html) का मतलब है कि यह ओपनजीएल * 3 * है। _scala GL2_ के लिए खोज करने से अधिक हिट नहीं हुईं ... –