菜鸟教程小白 发表于 2022-12-13 00:05:46

android - OpenGL绘图代码在跨平台项目中去哪里了?规划我的引擎代码


                                            <p><p>我正在尝试开发一个跨平台的应用程序。我将使用尽可能多的 C++ 编写 iOS 版本,然后在 Android 上使用相同的 C++ 代码。如果我更新 C++ 代码,我可以在另一个平台上重新编译。我计划完全在 XCode 中进行开发,专注于 iOS 开发,然后将 C++ 文件转移到我的 Android 项目中。</p>

<p>我正在尝试规划我正在编写的图形引擎,但我不确定应该在 C++ 部分中放置哪些代码以及应该在平台特定部分中放置哪些代码。</p>

<p>例如,一旦在 Java 或 Swift 代码中创建了 OpenGL ES 上下文,C++ 代码就可以使用该上下文进行绘制调用,还是有问题?我的绘图代码应该在 C++ 部分还是特定于平台的部分?理想情况下,我希望唯一特定于平台的代码是关于文件保存、发送触摸事件 ID 和位置、获取设备分辨率的细微差别。但是,我不确定这有多现实。</p>

<p>由于我将在 c++ 代码中使用多线程,我是否需要担心多线程在 Android 上的工作方式与在 iOS 上的不同?</p>

<p>iOS 或 Android 上的速度是否会因为这一变化而有所损失?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>iOS 和 Android 的上下文创建调用是完全正交的。 iOS 你一般用<a href="https://developer.apple.com/reference/quartzcore/caeagllayer" rel="noreferrer noopener nofollow"><code>CAEAGLLayer</code></a>/<a href="https://developer.apple.com/reference/opengles/eaglcontext" rel="noreferrer noopener nofollow"><code>EAGLContext</code></a>对象,它们是 Apple 专有的 API。在 Android 上,您通常使用 <a href="https://www.khronos.org/egl" rel="noreferrer noopener nofollow">EGL</a>功能,可移植到多个平台。通常,在 Android 上 <a href="https://developer.android.com/reference/android/opengl/GLSurfaceView.html" rel="noreferrer noopener nofollow"><code>GLSurfaceView</code></a>使用了帮助类,它为您处理大部分 EGL 接口(interface)调用,但这不是特别需要的。互联网上有很多教程展示了如何在这两个平台上进行设置。</p>

<p>iOS 上的 Objective-C/C++ 和 Swift 以及 Android 上的 Java 或 C/C++ 中都有语言绑定(bind)来创建上下文。用任何语言创建的上下文都与用 C/C++ 进行的绘制调用兼容(反之亦然)。</p>

<p>虽然两个平台之间的基本 OpenGL ES API 相同,但它们提供的扩展会有所不同。苹果给了<a href="https://developer.apple.com/library/content/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/BestPracticesforAppleA7GPUsandLater/BestPracticesforAppleA7GPUsandLater.html#//apple_ref/doc/uid/TP40008793-CH505-DontLinkElementID_4" rel="noreferrer noopener nofollow">specific list</a>他们支持的扩展,而 Android GPU 供应商决定哪些扩展可用,并且存在很多差异。因此,虽然没有明确地特定于平台,但您可能需要一些处理不同扩展的代码,如果扩展不可用,则使用后备渲染路径。如何组织你的代码显然取决于你,但你的代码的“绘图”部分可以放在共享代码中,只有很小的差异(使用 <code>#define</code>/<code># ifdef</code> 基于平台的预处理器语句)。 </p>

<p>虽然 iOS 和 Android 之间的多线程操作类似,但在 OpenGL ES(通常)中,多线程是一个考虑因素。一个线程一次可能只有一个 OpenGL ES 上下文处于 Activity 状态(并且用于设置它的函数在两个平台之间是特定的),并且跨线程共享上下文需要同步。通常,OpenGL/ES 应用程序仅在单个线程上与上下文交互(并且可能让其他线程执行其他非 OpenGL 工作)。</p></p>
                                   
                                                <p style="font-size: 20px;">关于android - OpenGL绘图代码在跨平台项目中去哪里了?规划我的引擎代码,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/42732267/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/42732267/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: android - OpenGL绘图代码在跨平台项目中去哪里了?规划我的引擎代码