Miért kell ebben a DirectX-es függvényben 2 paramétert megadni?
Noob vagyok DirectX-ből, és matekból is, úgyhogy pár könyvből, meg netes tutorialból neki álltam DirectX-et és matekot tanulni. El is akadtam ott, hogy "vektorok normalizálása".
Erre van egy függvény:
D3DXVECTOR2 * D3DXVec2Normalize ();
A probléma az, hogy nem értem miért kell 2 paramétert megadni. Az egyik azt adja meg, hogy az egység vektor mekkora legyen, pl. D3DXVECTOR2 vec (1,0); és ezt beállítom, de akkor mi a másik?
Bocs a rossz fogalmazásért, és a noob-oskodásért...
The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXVec2Normalize function can be used as a parameter for another function.
Vagyis a visszatérési érték megegyezik a kimeneti paraméter értékével. Ez azért hasznos, mert használhatod ezt a függvényt paraméterként egy másik függvényhez. Erre nem tér ki a leírás, de értelemszerűen ha a visszatérési érték helyett a kimeneti mutatót használod, akkor optimálisabb futásidejű eredményt érsz el, mint ha még el kellene tolni a veremmutatót is, meg bele is írni az értéket a verembe. Szóval kevesebb művelet, ami egy nagyon sokszor meghívott függvény esetében számottevő lehet. Meg egyébként amiatt, hogy nem kell eltolni a veremmutatót, a rekurzió lehetősége kevésbé szűkül, bár nem hiszem, hogy rekurzív függvényben szeretnéd ezt meghívni.
Ha nem triviális, hogy ez miért van:
A legtöbb programozási nyelv a függvényhívásokra egy vermet használ, ami tulajdonképpen egy előre lefoglalt, viszonylag kis méretű terület. Általában csak int-eket és mutatókat szokás benne tárolni, tehát a kis méret is elég lehet. A C(++) nyelv nem ügyel a verem karban tartására, mindössze annyit tesz, hogy számon tartja, hol van a verem vége. Ha új érték kerül a verembe, akkor eltolja a veremmutatót, és letárolja az értéket. Ha kikerül belőle egy érték, akkor pedig csak csökkenti a veremmutatót, a "maga mögött hagyott" értékkel nem foglalkozik, nem is nullázza azt, tehát amíg nem kerül a helyére más érték, tulajdonképpen a memóriában marad. Amikor meghív egy függvényt, akkor a paraméterei a verembe kerülnek, illetve a függvények visszatérési értékei. Ha egy konkrét változóban szeretnéd eltárolni az eredményt, akkor optimálisabb a kimeneti változókat használni, mert akkor nem kell piszkálni a vermet fölöslegesen. Ha viszont egy másik függvénynek szeretnéd átadni az értéket, akkor mindenképp használd a visszatérési értéket, mert az közvetlenül a veremben dolgozik, vagyis pár memóriamozgatási művelettől megkíméli a processzort, ráadásul a lassabb fajtából, mert jó esetben ugye végig cache-ben maradtunk. Ez általában biztonságos is, mert okosan van kitalálva a C nyelv, és ez a módszer elég gyors is. A verem aktívan használt részének memóriaelérési sebessége egyébként processzorokon általában elég gyors a cache-nek köszönhetően. Természetesen a videokártya is ugyanúgy fel van készítve ezekre a dolgokra.
(kdani)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!