2012-03-27 14 views
14

के लिए ओपनजीएल प्रदर्शन मैं निम्नलिखित स्कैला कोड चला रहा हूं। यह 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) 
    } 
} 
+0

आप किस हार्डवेयर का उपयोग कर रहे हैं? डबल "बफरिंग" सक्षम है? –

+0

मैंने 'caps.setDoubleBuffered (true) 'जोड़ा और यह प्रदर्शन को प्रभावित नहीं किया। हार्डवेयर के लिए, मेरे पास एक या दो साल पहले मध्य श्रेणी के एनवीडिया ग्राफिक्स कार्ड हैं। सीपीयू साल पहले से दो ड्यूल-कोर ऑप्टरन्स हैं। – mentics

+0

दूसरा, कृपया उपयोग किए जाने वाले ओपनजीएल संस्करण को निर्दिष्ट करें। क्या 'जीएल 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_ के लिए खोज करने से अधिक हिट नहीं हुईं ... –

उत्तर

10

आप एक वर्टेक्स बफर है, जो तेजी से प्रतिपादन के लिए जानकारी ड्राइंग स्टोर करने के लिए एक तरीका है का उपयोग कर के बारे में सोचना चाहते हो सकता है।

अवलोकन करने के लिए यहाँ देखें:

http://www.opengl.org/wiki/Vertex_Buffer_Object

+0

यह उस पृष्ठ के बारे में क्यों बात करता है जिस पर सामान खराब हो गया है? क्या वीबीओ बहिष्कृत है, या उस पृष्ठ पर क्या है? यह भ्रमित करने वाला है। – mentics

+1

@taotree: यह 'glVertexPointer',' glTexCoordPointer' और अन्य सामान के बारे में कॉल कर रहा है। इसे हटा दिया गया है। बफर ऑब्जेक्ट्स अभी भी वहां हैं।मैं उस पृष्ठ को साफ करने के लिए चारों ओर नहीं मिला है। –

+1

मैंने इस उदाहरण की कोशिश की जो वीबीओ का उपयोग करता है: http://wadeawalker.wordpress.com/2010/10/17/tutorial-faster-rendering-with-vertex-buffer-objects/ और यह 1 मिलियन सरल आकार में करने में सक्षम था लगभग 28 एफपीएस। – mentics

4

आप एक शीर्ष बफर वस्तु में शीर्ष जानकारी स्टोर है, तो यह ओपन पर अपलोड, तो आप शायद प्रदर्शन में एक बड़ी वृद्धि देखेंगे, खासकर यदि आप स्थिर वस्तुओं ड्राइंग कर रहे हैं। ऐसा इसलिए है क्योंकि वर्टेक्स डेटा हर बार CPU से लाने के बजाय ग्राफिक्स कार्ड पर रहता है।

+0

मैंने सोचा कि डिस्प्ले सूचियां ग्राफिक्स कार्ड पर डेटा स्टोर करती हैं। – mentics

1

आप एक प्रदर्शन सूची है जिसमें आप प्रत्येक घन के लिए drawItem फोन पैदा करते हैं। प्रत्येक घन के लिए drawItem के अंदर आप वर्तमान परिवर्तन मैट्रिक्स को धक्का और पॉप करते हैं और घुमाएंगे और क्यूब को सही तरीके से रखने के लिए स्केल करें। सैद्धांतिक रूप से यह हो सकता है कि घन समन्वय पर परिवर्तन पूर्वकंप्यूटेड हो सकता है और इसलिए ड्राइवर द्वारा अनुकूलित किया जा सकता है। जब मैंने ऐसा करने की कोशिश की (Minecraft में बहुत सारे क्यूब्स प्रदर्शित करें) लेकिन बिना घुमाव के, यानी मैंने केवल glpush/glPopMatrix() और glTranslate3f() का उपयोग किया, मुझे एहसास हुआ कि वास्तव में इन अनुकूलन, यानी अनावश्यक मैट्रिक्स से छुटकारा पा रहा है/पॉप और एप्लिकेशन, मेरे ड्राइवर द्वारा नहीं किया गया था। तो लगभग 10-20 के cubes के लिए मुझे केवल 40fps और 200K cubes के लिए केवल 6-7 एफपीएस मिला। फिर, मैं मैन्युअल रूप से अनुवाद करने की कोशिश की, यानी मैं जोड़ा संबंधित मेरी घनों के कोने करने के लिए वैक्टर ऑफसेट सीधे, प्रदर्शन सूची के अंदर यानी कोई मैट्रिक्स धक्का/पॉप और कोई glTranslatef अब, मैं एक बहुत बड़ा गति उठकर था, तो मेरा कोड तेजी से लगभग 70 गुना भाग गया।

संबंधित मुद्दे