【问题标题】:LibGDX/Socket.io: No OpenGL context found in the current threadLibGDX/Socket.io:在当前线程中找不到 OpenGL 上下文
【发布时间】:2017-02-18 07:42:23
【问题描述】:

我使用 Node.js 尤其是 Socket.io 使用 LibGDX 编写多人游戏。 当新玩家连接时,客户端会收到一个名为 getPlayers 的事件:

public void configSocketEvents(){
socket.on("getPlayers", new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            JSONArray objects = (JSONArray) args[0];
            try {
                for(int i = 0; i < objects.length(); i++){

                    Player enemy = new Player();
                   //...

播放器类:

public Player() {
    renderer = new ShapeRenderer();
    init();
}

现在,当第二个客户端连接时,两个客户端都会输出以下错误:

Exception in thread "EventThread" java.lang.RuntimeException: No OpenGL context found in the current thread.
...
at de.ej.facharbeitsspiel.Game.Player.<init>(Player.java:26)
at de.ej.facharbeitsspiel.Screens.GameScreenMP$1.call(GameScreenMP.java:149)

第 149 行是Player enemy = new Player(); 行,所以很明显存在一个新的ShapeRenderer() 无法加载的问题,因为它不是OpenGL 渲染线程。

知道如何解决这个问题吗?提前谢谢你

【问题讨论】:

  • 当然,不要在另一个线程中创建需要在渲染线程中创建的东西。您可能想阅读:en.wikipedia.org/wiki/Separation_of_concerns。您的 Player 类(游戏逻辑)不应该关心 ShapeRenderer(渲染逻辑)。无论如何,请阅读:stackoverflow.com/help/how-to-ask,因为您的问题太宽泛(没有包含足够的细节)而无法回答。
  • 但是如果我在套接字事件之外创建一个播放器,一切正常。我的问题中缺少哪些信息?
  • 如果您真的想采用这种方法(不推荐),那么这将帮助您包含所需的信息:stackoverflow.com/help/mcve。不过一般来说,如果你想在渲染线程上做点什么,那么使用Gdx.app.postRunnable
  • 好的,我解决了这个问题。正如您所建议的,我没有在 Player 类中创建一个新的 ShapeRenderer,而是在我的 WorldRenderer 类中创建了一个并使用了这个。非常感谢您的帮助!

标签: android node.js opengl-es socket.io libgdx


【解决方案1】:

好的,我解决了这个问题。

正如 Xoppa 在问题下方的评论部分中建议的那样,在播放器类中创建 ShapeRenderer 是个坏主意,因此我在 WorldRenderer 类中创建了一个并使用了这个。

【讨论】:

    猜你喜欢
    • 2013-04-18
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多