2017-07-19 11 views
12

का उपयोग करके रेंडरिंग मेरे पास एक एंड्रॉइड एप्लिकेशन है जो प्रतिपादन के लिए जीएलएस का उपयोग करता है। वर्तमान में सामान प्रस्तुत करने के लिए जावा का उपयोग करना, और प्रतिपादन ठीक है। एंड्रॉइड जावा एप्लिकेशन मेमोरी में सीमा के कारण मैं अपने जावा प्रतिपादन कोड में देशी प्रतिपादन को एकीकृत करने की योजना बना रहा हूं।एंड्रॉइड ओपनगलएस सी ++ और जावा

ऐसा करने के लिए मैंने मूल देशी जीएलएस ट्यूटोरियल्स का पालन किया। एकीकृत करने के बाद, जावा प्रतिपादन दिखाई नहीं दे रहा था, केवल सी ++ में प्रस्तुत की गई चीज़ों को देखा गया था।

कोड का सबसे सरल संस्करण है: https://github.com/khedd/JavaCppGLES जावा कोड त्रिकोण प्रदान करता है, सी ++ एक ट्रैक्टर प्रस्तुत करता है। अगर दोनों को केवल क्वाड कहा जाता है तो रेंडरर होता है।

मैं इस मुद्दे को कैसे हल कर सकता हूं? क्या मुझे सी ++ में सबकुछ बंद करना चाहिए?

संक्षेप में कोड।

MyGLRenderer(){ 
    mTriangle = new Triangle(); 
    mCppRenderer = new MyCppRenderer(); 
} 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    gl.glClearColor(1.0f, 0.0f, 1.0f, 1.0f); 

    //init java triangle 
    mTriangle.init(); 
    //init c quad 
    mCppRenderer.init(); //comment this line to make java triangle appear 
} 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    gl.glViewport(0, 0, width, height); 
} 

@Override 
public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    mTriangle.draw(); 
    mCppRenderer.draw(); 
} 
+0

आपने इसे "स्मृति कारणों" के लिए किया था? आप उम्मीद क्यों करते हैं कि यह कम स्मृति का उपयोग करेगा? साथ ही, आपके सी ++ और जावा ओपनजीएल कॉल अलग-अलग धागे पर हो रहे हैं, लेकिन, जावा और सी ++ के बीच आईटरोप के किसी भी कोड या विचार के बिना, सलाह देने के लिए यह बहुत कठिन होगा। – MuertoExcobito

+0

यह कम स्मृति का उपयोग नहीं करेगा लेकिन मूल में मैं और अधिक जगह का उपयोग कर सकता हूं। इसके अलावा आप सही हैं मैं कल नमूना कोड प्रदान करने की कोशिश करूंगा। मुझे पूरा यकीन है कि वे जावा के ड्राफ्रेम कॉल के भीतर एक ही थ्रेड पर हैं। – Hakes

उत्तर

11

समस्या बफर को अनबाइंड करने के कारण हुई थी।

glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

init और सुधारों समस्या प्रस्तुत करना इन दो पंक्तियों को जोड़ने।

2

ऐसा करने का सबसे आसान तरीका है सीधे अपने सी ++ कोड को अपनी सतह रेंडरर से कॉल करना।

private class PlayerRenderer implements GLSurfaceView.Renderer { 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     surface_created(); // native c++ 
    } 

    @Override 
    public void onSurfaceChanged(GL10 gl, int wid, int hgt) { 
     surface_changed(wid, hgt); // native c++ 
    } 

    @Override 
    public void onDrawFrame(GL10 gl) { 
     surface_draw(); // native c++ 
    } 
} 

private native void surface_created(); 
private native void surface_changed(int w, int h); 
private native void surface_draw(); 

संदर्भ स्विचिंग की कोई आवश्यकता नहीं है।

+0

मैं ऐसा करने की कोशिश कर रहा हूं, हालांकि मेरे पास जावा में विरासत कोड है, इसलिए मेरा पहला विकल्प इन्हें एक साथ उपयोग करना है, मेरे कोड में जिस तरह से मैंने देशी सतह_क्रेटेड नहीं कहा और सतह बदल गई केवल सतह ड्रॉ का उपयोग किया जाता है। मैं इसे देख लूंगा, धन्यवाद। – Hakes

+1

मैंने अपना प्रारंभिक सीपीपी में ले जाया, लेकिन कुछ भी नहीं बदला है जावा त्रिभुज अभी भी प्रस्तुत नहीं किया जा रहा है। – Hakes

+0

यदि आप अपना प्रारंभिकरण और ड्राइंग कोड दिखाते हैं, तो मुझे बेहतर समझने में सक्षम होना चाहिए। – WLGfx

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