Android, OpenGL และขยาย GLSurfaceView หรือไม่


12

คำถามนี้เป็นส่วนหนึ่งทางเทคนิคส่วนหนึ่งเมตาส่วนร่วมและเฉพาะเจาะจงมาก:

ฉันเป็นนักพัฒนาเกมอินดี้ที่ทำงานกับ Android และในช่วง 6 เดือนที่ผ่านมาฉันพยายามและในที่สุดก็ประสบความสำเร็จในการสร้างแอพเกม 3D ของฉันเองสำหรับ Android ดังนั้นฉันคิดว่าฉันจะกระโดดเพื่อให้และช่วยเหลือผู้อื่นที่กำลังต่อสู้กับ Android และ openGL-ES

GLSurfaceViewแต่ส่วนใหญ่ของคำถามที่เกี่ยวข้องกับการขยาย ฉันสร้างแอปทั้งหมดของฉันโดยไม่ขยายGLSurfaceView(และมันก็ทำงานได้ดี) ฉันไม่เห็นเหตุผลใด ๆ เลยGLSurfaceViewสำหรับคำถามส่วนใหญ่ที่ฉันเจอ

เลวร้ายยิ่งไปกว่านั้นเอกสาร Android นั้นบอกเป็นนัยว่าคุณควรจะทำ แต่ไม่ได้อธิบายอย่างละเอียดว่าทำไมหรือข้อดีข้อเสียคืออะไรที่ไม่ขยายและทำทุกอย่างผ่านการใช้งานของคุณเองGLSurfaceView.Rendererเหมือนที่ฉันทำ

ถึงกระนั้นปริมาณคำถามที่เลี่ยงไม่ได้ที่จะขยายGLSurfaceViewคือทำให้ฉันสงสัยว่าจริง ๆ แล้วมีบางเหตุผลที่ดีจริง ๆ ที่ทำแบบนั้นกับวิธีที่ฉันทำ (และแนะนำคำตอบของฉันให้คนอื่น ๆ ) ทำ).

ดังนั้นมีบางสิ่งที่ฉันขาดหายไปหรือไม่ ฉันควรหยุดตอบคำถามในเวลาเดียวกันหรือไม่?

เอกสารประกอบ openGL ของ Android


เป็นคำถามที่ดีฉันกระตือรือร้นเกี่ยวกับคำตอบ ..
Tofeeq

เหตุผลหนึ่งว่าทำไมขยาย GLSurfaceView สามารถพบได้ที่นี่: gamedev.stackexchange.com/questions/12629/ … โดยไม่ตระหนักถึงมันฉันจริง ๆ แล้ว sidestepped ปัญหาพูดคุยเกี่ยวกับในคำถามนี้ใน app ของฉันเองโดยโหลดพื้นผิวอื่น ๆonResume()
ช้อน Thumb

คำตอบ:


2

ฉันมีนามสกุลน้อยมากสำหรับฉันและส่วนใหญ่ของภูมิปัญญาเป็นของการดำเนินงานของฉันGLSurfaceView GLSurfaceView.Rendererฉันมีเหตุผลสามข้อต่อไปนี้ในการใช้เสื้อคลุมสำหรับGLSurfaceView:

  1. ฐานGLSurfaceViewไม่มีวิธีรับRendererอินสแตนซ์กลับ ฉันมีหลายพื้นผิวและเมื่อฉันได้รับเหตุการณ์ UI สำหรับหนึ่งในนั้นฉันต้องการส่งคำสั่งไปยังโหมดแสดงภาพที่เกี่ยวข้อง ดังนั้นฉันจึงแทนที่setRendererและเก็บข้อมูลอ้างอิงในชั้นเรียนที่ขยายเพิ่มเติมของฉัน

  2. GLSurfaceView.Rendererไม่ได้รับการแจ้งเตือนหรือonDetachedFromWindow() surfaceDestroyed()สิ่งนี้ทำให้เกิดปัญหากับการใช้งานของฉัน ส่วนขยายของฉันGLSurfaceViewแทนที่วิธีเหล่านี้และทำให้mRendererทราบ มันเป็นไปได้เพราะวรรค 1

  3. วิธีการบางอย่างถูกห่อเดียวที่จะเพิ่มtry { super.สิ่งใด ๆ ก็ตาม; } catch() { log( ) }ตัวอย่างเช่นqueueEvent()จะโยนหาก Renderer ไม่ได้ตั้งค่า; แต่สำหรับฉันมันก็โอเคที่จะเพิกเฉยต่อความไม่สอดคล้องกันของไทม์ไลน์ดังกล่าว


ผมได้เริ่มต้นการทำเช่นนี้เป็นอย่างดีแม้ว่าคำถามที่มีวัตถุประสงค์เพื่อเพิ่มเติมได้ที่ว่าทำไมคุณอาจจะใส่ตรรกะที่เกิดขึ้นจริงในการขยายมากกว่าGLSurfaceView GLSurfaceView.Rendererแม้ว่าในจุดที่ 1 ฉันเก็บ renderer เป็นตัวแปรในกิจกรรมของฉัน ในทางทฤษฎีฉันสามารถเอามันมาจากที่ใดก็ได้โดยการแสดงบริบท: ((MyActivity)view.getContext()).getRenderer(). อาจจะมีอันตรายมากกว่าเล็กน้อยเนื่องจากวัตถุบริบทอาจไม่จำเป็นต้องเป็นMyActivity
Spoon Thumb

ไม่เป็นไรถ้าคุณมี renderer หนึ่งตัว แต่อย่างที่ฉันพูดไว้ก่อนหน้านี้เรามีผู้แสดงผลหลายคนและพวกเขาเชื่อมต่อกับ SurfaceViews ที่แตกต่างกัน - เป็นระเบียบ!
Alex Cohn

0

เหตุผลที่ดีอย่างน้อยหนึ่งข้อในการขยาย GLSurfaceView ก็คือสามารถสร้างอินสแตนซ์ได้โดยตรงจากไฟล์เค้าโครง xml เช่นเดียวกับวิดเจ็ตอื่น ๆ :

    <RelativeLayout ... >
      <com.example.MyGlSurfaceView
        android:id="@+id/my_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
      />
     </RelativeLayout>

1
คุณสามารถทำเช่นนั้นได้โดยใช้<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
Spoon Thumb

จุดดี. ความแตกต่างคือในตัวอย่างของฉันกรอบ Android ขยายตัวและตั้งค่าทุกอย่างโดยไม่ต้องใช้โค้ดพิเศษ วิธีการของคุณเป็นรหัสเพิ่มเติม แต่มีความยืดหยุ่นในการแทนที่การใช้งาน นอกจากนั้นทั้งสองวิธีก็ดูคล้ายกัน
Amir Uval

-1

เอาล่ะ ... GLSurfaceView เป็นสิ่งที่ฉันแน่ใจว่าคุณสังเกตเห็นเพียงแค่เสื้อคลุมสำหรับสินค้าทั่วไป มันสรุปฟังก์ชั่นทั้งหมดที่หนึ่งจะต้องมีการแสดงผลด้วย OpenGL มีตัวเลือกที่จะรวมมันอย่างดีกับลำดับชั้นดู Android

คุณไม่ได้ให้ทางเลือกของคุณดังนั้นจึงเป็นไปไม่ได้ที่จะเปรียบเทียบ แต่ฉันหวังว่าคุณจะวางไข่เธรดอื่นสำหรับการเรนเดอร์ตามที่ GLSurfaceView ทำหรือการป้อนข้อมูลผู้ใช้ของคุณอาจล่าช้า

ดังนั้นอีกครั้ง: GLSurfaceView จัดเตรียมเธรดใหม่สำหรับการเรนเดอร์ดังนั้นคุณไม่ต้องกังวลเกี่ยวกับความล่าช้าในการป้อนข้อมูลของผู้ใช้


2
ใช่ แต่GLSurfaceViewทำเช่นนั้น (เริ่มเธรดการแสดงผล) แม้ว่าคุณจะไม่ขยายออก ฉันใช้GLSurfaceViewแต่ไม่ขยาย ฉันขอให้สิ่งที่มีประโยชน์จากการขยายมันและเอาชนะวิธีการที่แตกต่างกันนั้นเมื่อเทียบกับเพียงแค่มีทุกอย่างในRenderer
Spoon Thumb

Welp ฉันลอง :) ฉันอาจจะดูในภายหลังตอนนี้ฉันก็สนใจ!
Greg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.