Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [C++] Peliprojektin suoritinkäyttö normaali?

mika132 [29.03.2011 16:34:00]

#

Eli mietein kuuluuko tämä yleisiin vai tänne joten päätin pistää tänne.

Mutta onko se normaalia vai voiko asiaa jotenkin korjata, koska ihan sama millaisen projektin teen niin suoritinkäyttö on aina 40%-50%? Muistin varaus pysyy hallussa eli siinä noi 10 000-30 000kt riippuen projektitsta, mutta tuo suoritinkäyttö ihmetyttää.

User137 [29.03.2011 16:50:49]

#

Jos missään vaiheessa et kutsu jonkunlaista sleep() funktiota vaan koko ajan pyörittää silmukkaa täydellä prosessoriteholla, niin silloin suoritin on aina täysillä vaikka mitään ei piirrettäisi. Se että tuo on vain 50% eikä 100% voi johtua 2-ydin prosessorista.

mika132 [29.03.2011 17:17:47]

#

Juu 2ydin on minulla. Mihin tuo sleep komento kannattaisi sijoittaa jottei peli alka "pätkimään" Esimerkiksi. Jos laitan näin:

while (pelin_kello + ajan_muutos <= ohjelma::sekunnit()) {
	pelin_kello += ajan_muutos;
	piirretty = false;
	Sleep(10);
}
if (piirretty) {
	ohjelma::odota();
} else {
}

Niin prossunälkä putoaa 10-20%.

jos laitan sen näin:

while (pelin_kello + ajan_muutos <= ohjelma::sekunnit()) {
	pelin_kello += ajan_muutos;
	piirretty = false;
}
if (piirretty) {
	ohjelma::odota();
	Sleep(10);
} else {
}

niin prossunälkä on siellä 40-50

mutta loogisesti ajateltuna ensimmäisessä vaihtoehdossa tulee "nykmisitä" tuolla ajalla sitä ei huomaa, mutta jos prossunälkä kasvaa tuosta ja lisää sleepin aikaa niin nykimisen alkaa huomaamaan. Vai pitääkö se vain pitää tuossa ja antaa prossunälän kasvaa vai onko jokin erillainen ratkaisu vaihtoehto?

E: ja jos Sleepin ajan vaihtoehtoa yksi käyttäen muutetaan 20 peli jumiutuu.

Grez [29.03.2011 17:26:38]

#

Mun mielestä olis hyvin mielenkiintoista tietää mitä toi ohjelma::odota tekee. Mihin sitä tarvitaan.

Myöskin koko while -loopin tarkoitus olisi mielenkiitoista tietää. onko ohjelma::sekunnit tarkoitus kertoa kuinka kauan ohjelma saa pyöriä? Tuntuu aika erikoiselta.

Metabolix [29.03.2011 17:28:49]

#

Oletan, että koodi on kopioitu matopelioppaasta (ja "muokattu omaan käyttöön" eli rikottu). Siinä tapauksessa funktiossa ohjelma::odota nimenomaan on jo sleep-kutsu ja ohjelma::sekunnit yksinkertaisesti mittaa aikaa.

Aiempien keskustelujen perusteella tiedän, että olet moneen kertaan sotkenut koodin aivan totaalisesti. Ota siis uudestaan mallia oppaasta. Onko piirretty-muuttuja varmasti määritelty jo silmukan ulkopuolella, ja sijoitatko siihen varmasti arvon true aina piirtämisen jälkeen, jotta jatkossa odotetaan eikä piirretä turhaan uudestaan?

Koodin pitäisi näyttää tältä:

bool piirretty = false;
while (kaynnissa) {
    while (pelin_kello + ajan_muutos <= ohjelma::sekunnit()) {
        liiku();
        pelin_kello += ajan_muutos;
        piirretty = false;
    }
    if (piirretty) {
        ohjelma::odota();
    } else {
        piirra();
        piirretty = true;
    }
}

Käytännössä saman asian voi toki kirjoittaa näinkin:

bool piirretty = false;
while (kaynnissa) {
    piirra();
    while (pelin_kello + ajan_muutos > ohjelma::sekunnit()) {
        ohjelma::odota();
    }
    while (pelin_kello + ajan_muutos <= ohjelma::sekunnit()) {
        liiku();
        pelin_kello += ajan_muutos;
    }
}

mika132 [29.03.2011 18:05:29]

#

Tosiaan olin vahinkossa kirjoittanu piirretty muuttujalle piirron jälkeen arvon false. =)

Muutin trueksi ja suoritin käyttö ilman tuota minun omaa sleeppiä putosi 5% eli se on jo hyvä mielestäni. =)


kiitoksia.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta