使用 OpengGLSurface 为 Android 制作游戏循环的最佳方法

发布于 2025-01-04 23:14:18 字数 536 浏览 0 评论 0原文

据我所知,如果我想制作一个非 opengl 游戏循环,我可以做的是有一个游戏线程,在循环期间将更新游戏状态(或游戏物理),并通过锁定Canvas,通过 Canvas.drawXXX(...) 方法进行绘图,然后解锁它,此时图形将针对循环进行更新。

在使用 GLSurfaceView 和 Renderer 时,我真的不知道如何做到这一点。据我了解,我不能再让我的手工制作的 gameThread 按需绘制,就像我在常规表面和 Canvas 上那样,因为现在有一个渲染线程将调用 Renderer。 onDrawFrame() (在我传递给 GLSurfaceView 的渲染器类的实现上)。

那么我的问题是,使用 GLSurfaceView 和 Renderer 制作游戏循环的好方法是什么?我是否仍然应该创建单独的游戏线程,但仅处理其中的游戏状态(物理)更新,然后在 Renderer.onDrawFrame() 的实现中使用该游戏状态来根据当前状态实际绘制图形?我应该只使用 Rendere 的线程来进行状态更新吗?

From what I've seen, if I wanna make a NON-opengl game loop what I can do is have a game thread that during the loop will update the game state (or game physics) and also update the graphics by locking a Canvas from a (normal) SurfaceView, doing the drawing via Canvas.drawXXX(...) methods and then unlocking it at which point the graphics get updated for the loop.

I don't really get how to do that when using GLSurfaceView and Renderer. From what I understand, I can no longer have my hand-made gameThread draw on demand as I had with the regular surface and it's Canvas, because now there's a rendering thread that will call Renderer.onDrawFrame() (on my implementation of the renderer class that I pass to the GLSurfaceView).

My question is then, what's a good way to make a game loop with GLSurfaceView and Renderer? Should I still make my separate game thread, but only handle game state (physics) updates in it and then use that game state in my implementation of Renderer.onDrawFrame() to actually draw graphics based on current state? Should I only use the Rendere's thread to also do state updates?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清君侧 2025-01-11 23:14:18

事实证明,最好的方法是使用 GLSurface 提供的线程。它的挂钩来自于 Renderer 接口的实现。实际上,渲染器的 onDrawFrame() 方法可以被视为类似于常规线程的 run() 方法。这种方式抛弃了每秒固定更新范式的概念(不是真的,但在这种情况下这样做太复杂了),但另一方面,您可以获得最佳的图形更新。

这里有一个关于 Android 和 OpenGL 的很棒的教程:

http://insanitydesign.com/wp/projects/nehe-android -端口/

Well, as it turns out, best way to go is to use the thread provided by the GLSurface. The hook to it comes through an implementation of the Renderer interface. Effectively the Renderer's onDrawFrame() method can be considered analogous to a regular Thread's run() method. This kind of throws out the window the concept of a fixed updates per second paradigm (not really, but it's too convoluted to do in this context) but on the other hand you get optimal graphics updates.

There's a great tutorial on Android and OpenGL here:

http://insanitydesign.com/wp/projects/nehe-android-ports/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文