Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
sam3
Člen
Avatar
sam3:17.11.2014 11:09

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
Tvůrce
Avatar
Odpovídá na sam3
Silvinios:18.11.2014 18:39

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
18.11.2014 18:39
Avatar
sam3
Člen
Avatar
Odpovídá na Silvinios
sam3:22.11.2014 1:13

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.