Avatar
sam3
Člen
Avatar
sam3:

Ahoj, dělám si vlastní 2D RPG hru a používám knihovny LWJGL a Slick.
Rozhodl jsem se, že implementuji multiplayer...
(UPD) Server a klient běží ve vlastním vlákně a tady je problém...
LWJGL se musí používat jen v jednom vlákně, takže nemůžu vykreslovat nebo načítat textury v jiném vlákně než tam, kde je openGL inicializované...
Takže když jsem po připojení hráče na server ho chtěl inicializovat a přidat do arraylistu (z vlákna toho serveru) s objekty worldu, tak mi to vyhodilo chybu, že openGL nebylo inicializováno v tom vlákně...

Takže pokud máte nějaká řešení, hrozně rád bych je uvítal...

 
Odpovědět 17.11.2014 11:09
Avatar
Silvinios
Redaktor
Avatar
Odpovídá na sam3
Silvinios:

Jak sám píšeš, vykreslovat je třeba ve vlákně, v kterém je OpenGL inicializované. Napadlo mě, že bys mohl použít třídu LinkedBlockin­gDeque. Z jednoho vlákna můžeš plnit frontu požadavky na vykreslení a z "OpenGL" vlákna můžeš požadavky vybírat a kreslit co je třeba.

Zde je příklad:

import java.util.concurrent.LinkedBlockingDeque;

public class KresliciVlakno extends Thread {

    private final LinkedBlockingDeque<Runnable> fronta;

    public KresliciVlakno(LinkedBlockingDeque<Runnable> fronta) {
        super("Kreslici vlakno");
        this.fronta = fronta;
    }

    @Override
    public void run() {
        Runnable runnable;
        try {
            for (;;) {
                runnable = fronta.take();
                runnable.run();
            }
        } catch (InterruptedException e) {
            System.out.println("Kreslici vlakno zastaveno");
        }
    }

}
import java.util.concurrent.LinkedBlockingDeque;

public class Main {

    public static void main(String[] args) throws InterruptedException {
        Thread.currentThread().setName("Hlavni vlakno");
        LinkedBlockingDeque<Runnable> fronta = new LinkedBlockingDeque<Runnable>();
        KresliciVlakno kresliciVlakno = new KresliciVlakno(fronta);

        System.out.println("[" + Thread.currentThread().getName() + "] Spoustim kreslici vlakno...");
        kresliciVlakno.start();
        for (int i = 0; i < 5; i++) {
            final int n = i;
            fronta.add(new Runnable() {
                @Override
                public void run() {
                    System.out.println("[" + Thread.currentThread().getName() + "] Kreslim obrazek " + n);
                }
            });
            Thread.sleep(1000L);
        }
        System.out.println("[" + Thread.currentThread().getName() + "] Zastavuji kreslici vlakno...");
        kresliciVlakno.interrupt();
        System.out.println("[" + Thread.currentThread().getName() + "] Cekam na kreslici vlakno...");
        kresliciVlakno.join();
        System.out.println("[" + Thread.currentThread().getName() + "] Kreslici vlakno ukonceno. Ukoncuji program.");
    }

}
Editováno 18.11.2014 18:41
 
Nahoru Odpovědět  +1 18.11.2014 18:39
Avatar
sam3
Člen
Avatar
Odpovídá na Silvinios
sam3:

Hele a abych měl teda jasno... já v jednom vlákně vytvořím objekt, který má i parametr texturu. Ten objekt se přidá do arraylistu z druhého vlákna a já pak jen ty textury těch objektů vykresluji ve třetím vlákně, kde je inicializované openGL... mělo by to fungovat ne?

Editováno 22.11.2014 1:13
 
Nahoru Odpovědět 22.11.2014 1:13
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.