Problém s vykreslováním okna v realtime (pro hru) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s vykreslováním okna v realtime (pro hru) – C / C++ – Fórum – Programujte.comProblém s vykreslováním okna v realtime (pro hru) – C / C++ – Fórum – Programujte.com

 

ingiraxo+15
Grafoman
6. 4. 2012   #1
-
0
-

Ahoj, nevíte někdo, jak mám v Qt řešit update pro vykreslování?

Vytvořím si nějakej widget, tam mám funkce paintEvent a timerEvent, kterej volá update() kreslící plochy zhruba každých 30ms, ale přijde mi to strašně pomalý pro animace...

Když se dělá nějaká hra, tak se musí vykreslovat nějak 30x za 1s, aby to bylo plynulý, ale když jsem tohle udělal, tak se mi to lehce škubalo, tak jsem zkusil dát každou 1ms, to se sice trochu zlepšilo, ale CPU mi šel na 30% a to jsem vykresloval jen jednu kuličku :/

Můžete mi nějak poradit, jak to mám vykreslovat v realtime aby mi to nešežralo CPU a bylo to krásně plynulý?

Vim, že např. v XNA frameworku pro C# je po vytvoření čistýho projektu funkce update(...) a pár dalších a když jsem dal cokoli vykreslit do funkce update(...) tak nebyl problém, bylo to čistý bez trhání a CPU se ani nehlo

PS: Používám QBasicTimer jako časovač

Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
liborb
~ Redaktor
+18
Guru
6. 4. 2012   #2
-
0
-

Pokud ti vykreslení řeší CPU, tak ti ho to samozřejmě bude brát .... QGLWidget, Qt3D ...

Nahlásit jako SPAM
IP: 78.80.52.–
m4r100
Návštěvník
6. 4. 2012   #3
-
0
-

Nezapomen na double/triple buffer

Nahlásit jako SPAM
IP: 88.101.122.–
ingiraxo+15
Grafoman
6. 4. 2012   #4
-
0
-

#2 liborb
tyhle třídy neznám, to jsou nějaky pro openGL tipuju, v každým případě jsem koukal do doc a má virtuální fci update, takže doufám, že to bude obdobný jako v XNA frameworku a pokud ano, tak je to přesně to, co jsem hledal :)

Pokud narazim na problém, tak se ještě ozvu.. jinak dík

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
ingiraxo+15
Grafoman
7. 4. 2012   #5
-
0
-

No tak jsem to zkoušel a abych řekl pravdu, tak rozdíl moc nevidim, když vytvořim QWidget nebo QGLWidget, tak v obou případech to musím vykreslit přes paintEvent a abych to měl jako animaci, tak používám QBasicTimer a v timerEvent volám update(), ale ta kulička se mi stále lehce škube

Nevíte teda jak to mám nastavit? Nebo jestli mám špatně nastavenej časovač já nevim :/ Když nastavim rychlost časovače podle cpu, čili 0, tak mám sice cpu na cca 2% ale škube se to stále

class Game : public QGLWidget
{
    Q_OBJECT

public:
    Game(QWidget* parent = 0);

protected:
    void initializeGL();
    void paintEvent(QPaintEvent*);
    void timerEvent(QTimerEvent*);

private:
    QBasicTimer iTimer;
    Ball* iBall;
};

 a CPP

Game::Game(QWidget* parent) : QGLWidget(parent)
{
    iBall = new Ball(10, this); // velikost kulicky
}

void Game::initializeGL()
{
    iTimer.start(1, this); // kazdou 1ms
}

void Game::paintEvent(QPaintEvent*)
{
    QPainter g(this);

    g.fillRect(0, 0, width(), height(), Qt::white);

    iBall->draw(g); // vykresli kulicku
}

void Game::timerEvent(QTimerEvent*)
{
    iBall->update(this); // pohybuje kulickou a kontroluje kolizi
    update();
}

Možná se na tohle používá jiná technika a pokud jo, tak bych byl rád o její prozrazení :)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
liborb
~ Redaktor
+18
Guru
7. 4. 2012   #6
-
0
-

Principů je několik. Jednak se snažíš, co nejvíce práce přenechat GPU, tj. grafické kartě (OpenGL). Dále tu je již zmíněný doublebuffering, tj. mít paměťovou oblast, do které si předpřipravím následující zobrazení a při paint už jenom klopíš celé zobrazení. No a pak tu je samozřejmě optimalizace překreslení, kdy se překresluje jen to, co se změnilo, kreslí se jen viditelné věci atd. Je toho hodně :)

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 80.84.1.–
ingiraxo+15
Grafoman
7. 4. 2012   #7
-
0
-

#6 liborb
tohle vim, ale jde o to, že nevim co bych tam měl teda přidat nebo upravit, aby se to pohybovalo plynule a vykreslovalo to GPU :)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
liborb
~ Redaktor
+18
Guru
10. 4. 2012   #8
-
0
-

#7 ingiraxo
Tak sem celý (nejlépe co nejjednodušší, abych mu rozuměl ;)) projekt a můžeme se pobavit, co je potřeba.

Nahlásit jako SPAM
IP: 78.80.52.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

Podobná vlákna

Problém s vykreslováním — založil Alman

GUI - pro hru — založil zuufku

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý