Ratings and Reviews of Online Casinos
1. Sol Casino
Free Sign-Up Bonus: 90 Free Spins ( Free Sign-Up Bonus Link )
First Deposit Bonus: 150% up to €/$ 500 ( Registration Link )
2. Fresh Casino
Free Sign-Up Bonus: 60 Free Spins ( Free Sign-Up Bonus Link )
First Deposit Bonus: 100% up to €/$ 500 ( Registration Link )
3. Jet Casino
Free Sign-Up Bonus: 80 Free Spins ( Free Sign-Up Bonus Link )
First Deposit Bonus: 200% up to €/$ 300 ( Registration Link )
Gamevev | Samsung -kehittäjät
Vulkan -käyttösuositukset
Esittely
Tämä vulkan -käyttöoppaan oletetaan, että lukija tuntee jo sovellusliittymän, mutta haluaa tietää, kuinka sitä voidaan käyttää tehokkaasti monilla galaksilaitteilla. Se olettaa myös, että lukija tuntee laattapohjaisen renderöinnin (TBR) GPU -arkkitehtuurien perusteet, joita yleisesti löytyvät mobiililaitteista. Jos olet uusi Vulkan, voit aloittaa suositellun kanssa SDKS jotka esittelevät sovellusliittymän käsitteet koodiesimerkkeinä. Voit myös oppia lisää GPU -arkkitehtuureista tässä.
Ennen tämän asiakirjan lukemista suosittelemme perehtymistämme Pelin omaisuuden optimointisuositukset.
Ymmärrä tavoitteesi
Kun kehitetään korkean suorituskyvyn sovelluksia, on välttämätöntä ymmärtää kohdistamasi sovellusliittymien ja laitteistojen ominaisuudet ja suorituskykyominaisuudet.
Vulkanille tämä sisältää:
-
Suurin grafiikan sovellusliittymäversio
-
Kyky
- e.g. Suurin tekstuurin tarkkuus
-
Pidennys
Kuten kaikki suorituskyvyn keskittyneet sovellusliittymät, Vulkanissa on tilanteita, joissa määrittelemätöntä käyttäytymistä voi tapahtua, jos sovellusliittymän käyttäjä ei vastaa sitä. Khronos Vulkan -validointikerrokset ja Grafiikan sovellusliittymän virheenkorjaustyökalut ovat hyödyllisiä sovellusliittymän väärinkäytön tunnistamisessa. On myös erittäin tärkeää testata sovelluksesi monilla laitteilla, piirisarjoilla ja GPU -arkkitehtuureilla virheiden tunnistamiseksi kehitysjakson varhaisessa vaiheessa.
-
Harkitse GPU -arkkitehtuurieroja.
-
Tarkista ominaisuudet ja laajennukset ajon aikana. Toteuttaa syksy.
-
Testaa sovelluksesi monilla laitteilla.
Omaisuuden optimointi
Katso meidän Pelin omaisuuden optimointisuositukset.
Varjostettu tarkkuus
Spir-V tukee tarkkuuskelpoisia (opDecorte Readed Precision). Tarkkuusvihjeet antavat kehittäjille mahdollisuuden kertoa kääntäjille, joissa vähentynyttä tarkkuutta voidaan käyttää ALU -operaatioiden suorituskyvyn parantamiseksi ja puolestaan vähentää GPU: n virrankulutusta.
Kääntäjien on pätevä edistää muuttujan pyydettyjä tarkkuutta, esimerkiksi 32-bittisen liukulukujen tarkkuuden käyttämiseksi. Kääntäjillä on taipumus tehdä tämä, kun tarkkuusmuunnokseen käyttöön otetut ohjeet tuovat enemmän yleiskustannuksia kuin laskelmien suorittaminen täydellä tarkkuudella.
-
Varo kääntäjiä, jotka edistävät tarkkuutta. Varjostimella, joka toimii täydellisesti laitteessa A (mainostettu tarkkuus), voi olla esineitä laitteessa B (Honors Precision Ecsifier)
-
Varo virheiden tekemistä, jotka on piilotettu joihinkin laitteisiin vähentyneellä tarkkuudella
Suositukset
-
Käytä vähentynyttä tarkkuutta suorituskyvyn parantamiseksi ja virrankulutuksen vähentämiseksi.
-
Varo kääntäjiä, jotka edistävät tarkkuutta. Testaa paljon laitteita Shader Precision -esineiden saamiseksi aikaisin.
-
Varo virheiden tekemistä, jotka on piilotettu joihinkin laitteisiin vähentyneellä tarkkuudella.
Putkilinjan hallinta
Putkilinjojen luominen veto -ajan voi tuoda esiin suorituskyvyn. Suosittelemme putkilinjojen luomista mahdollisimman varhaisessa vaiheessa sovellusten suorittamisessa. Jos et kykene uudelleen arkkittyä renderointimoottoriisi putkilinjojen luomiseen ennen piirtämisaikaa, suosittelemme putkistojen luomista kerran ja lisäämään ne karttaan, jotta niitä voidaan etsiä hajautetulta tilasta seuraavilla vetovoimalla.
Putkilinjan välimuistit antavat kuljettajalle mahdollisuuden käyttää tilaa välimuistissa olevista putkistoista, kun uusia putkistoja luodaan. Tämä voi parantaa suorituskykyä merkittävästi käyttämällä paistettua tilaa kalliiden operaatioiden, kuten Shader Compilationin, sen sijaan. Suosittelemme yhden putkilinjan välimuistin käyttämistä varmistaaksesi, että kuljettaja voi käyttää tilaa uudelleen kaikista aiemmin luotuista putkistoista. Suosittelemme myös putkilinjan välimuistin kirjoittamista tiedostoon, jotta sitä voidaan käyttää tulevaisuuden sovelluskäytännöillä.
Putkilinjan johdannaiset antavat sovellusten ilmaista “lapsen” putkilinjat inkrementaalisten tilan muuttumisena samanlaisesta “vanhemmasta”; Joissakin arkkitehtuureissa tämä voi vähentää vaihtamisen kustannuksia vastaavien tilojen välillä. Monet mobiili GPU: t saavat suorituskyvyn pääasiassa putkilinjan välimuistien kautta, joten putkilinjan johdannaiset eivät usein tarjoa hyötyä kannettaville mobiilisovelluksille.
Suositukset
-
Luo putkistoja varhaisessa vaiheessa sovelluksen suorittamisessa. Vältä putkilinjan luomista veto -aikaan.
-
Käytä yhtä putkilinjan välimuistia kaikkiin putkilinjan luomiseen.
-
Kirjoita putkilinjan välimuisti sovelluksen väliseen tiedostoon.
-
Vältä putkilinjan johdannaisia.
Kuvausjoukon hallinta
Kuvausjoukot määrittelevät resurssisidokset piirtämiseen. Ihannetapauksessa kuvausjoukot tulisi luoda rakennusaikana ja välimuistiin ajonaikaista suorituskykyä varten. Kun tämä ei ole mahdollista, kuvausjoukot tulisi luoda mahdollisimman varhaisessa vaiheessa sovelluksen suorittamisessa (sovelluskuorma tai tason kuorma).
Kuten useimmat Vulkan -resurssit, API -käyttäjä on vastuussa kuvausasetusten päivitysten synkronoinnista varmistaakseen,. Suosittelemme, että käytät kuvausryhmää swap -hakemistoa kohti resurssien synkronoinnin yksinkertaistamiseksi ja kuvaajien jakamisen helpottamiseksi tasaisten sitojien välillä samoilla sidoksilla. Jos et kykene uudelleen arkkittyä renderointimoottoriisi ja sinun on päivitettävä kuvaajasarjat veto-aikana, kuvausjoukkojen ja puskurinhallintastrategioita olisi harkittava erittäin huolellisesti, jotta vältetään lennon sisäisten kuvausten muuttaminen. Kuten puskurinhallinnassa keskustellaan, moottorin suunnittelu Spec -vähimmäis VkphysicalDevicelimits :: MaxUniformBufferrange -arvo on tärkeä, koska tämä raja voidaan helposti lyödä, kun jaat puskureita kuvaajien välillä.
Jos yhtenäiset tai säilytyspuskurit korvaukset on vaihdettava korkealla taajuudella (E.g. Perustetapa), suosittelemme, että puskurien sitominen on dynaaminen VK_Descriptor_Type _*_ Buffer_Dynamic -sovelluksella ja siirtymän asettaminen pDDynamicOffSetsille, kun VKCMDBindDescriptsetit kutsutaan. Tämä mahdollistaa siirtymien vaihtamisen ennen piirtämisen suorittamista muokkaamatta kuvaajajoukkoa.
Suositukset
-
Rakenna kuvaajasarjat mahdollisimman aikaisin (mieluiten omaisuuden rakennusaikana).
-
Älä sido resursseja, joihin piirto ei viittaa.
-
Jos puskurin siirtymiä on vaihdettava korkealla taajuudella (E.g. Välidyynnin välillä), käytä pdynamicoffsetteja, kun kuvaus on sidottu.
-
Vältä korkean taajuuden kuvaajasarjan muokkausta. Jos vaaditaan dynaamisia päivityksiä, varmista, että lukemat ja kirjoitukset synkronoidaan.
Puskurin hallinta
Kuten keskusteltiin Pelin omaisuuden optimoinnit: lomitettujen kärkipisteen määritteet, Paikkaominaisuudet tulisi tallentaa erilliseen puskuriin kaikille muille ominaisuuksille. Tämä mahdollistaa modernin mobiilin GPU: n suorittamisen kärjen varjostuksen tehokkaammin. Ellei päivitetä eri taajuuksilla, kaikki muut määritteet tulisi lomittää yhdessä puskurissa.
Yhtenäiset puskurit olisi allokoida mahdollisimman varhaisessa vaiheessa sovellusten suorittamisessa ja kehyksen kohdentamista olisi vältettävä (aiempien allokointien uudelleenkäyttö on paljon nopeampaa). Aidat tulisi käyttää varmistamaan lennon aikana tapahtuva Render-pääsypuskurialueet, joita nykyisen kehyksen sovelluspuhelut muokkaavat.
Yhtenäinen puskuri ei saisi sisältää tietoja, jotka päivitetään eri taajuuksilla. Esimerkiksi, jos piirtäminen riippuu staattisesta tiedosta, ja data, joka on asetettu kehyksenä (e.g. Transformaatiomatriisit) tulisi käyttää kahta puskuria. Yhdenmukaiset tiedot, jotka ovat yhteisiä useille vetolaitteille, tulisi tallentaa yhtenä puskuriin.
Tarpeellisten siirtojen välttämiseksi yhtenäinen puskurimuisti tulisi allokoida VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT -sarjalla. Tämä lippu mahdollistaa VKMAPMEMORY: n käytön isäntästä tehokkaisiin muutoksiin (yksi kopio vähemmän verrattuna lavastuspuskurin käyttöön). Usein kartta-/karttapuheluita tulisi välttää. Puskuri voidaan kartoittaa jatkuvasti asettamalla VKMEMORYPROPERTYFLAGBITS :: VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, jos käytettävissä. Varo: Pysyvä kartoitus vaikeuttaa API -sieppaustyökalujen paljon vaikeampaa, puskurimuutosten seuraaminen. Tästä syystä suosittelemme, että toteuttaminen ei-perässtöisesti kartoitettu varapäte alustoille, joilla on omistettu GPU-muisti, ja virheenkorjauksen yksinkertaistamiseksi.
Puskurit tulisi kohdistaa VkphysicalDevicelimits :: min*kohdistusrajoitukset.Puskurin allokointien ja kuvaajasarjojen enimmäiskoko voidaan kysyä:
VkphysicalDevicelimits :: MaxUniformBufferrange | Suurin tasainen puskurimuistialue |
VkphysicalDevicelimits :: MaxDescriptorsEniformBuffers | Enimmäismäärä yhtenäisiä puskureita, jotka voidaan sitoutua kuvausjoukkoon |
VkphysicalDevicelimits :: MaxDescriptorSetunmIformBuffersDynamic | Enimmäismäärä dynaamisia yhtenäisiä puskureita, jotka voidaan sitoutua kuvausjoukkoon |
VkphysicalDevicelimits :: MaxPerStageScriptorUnformBuffers | Enimmäismäärä yhtenäisiä puskureita, joihin pääsee yhdellä varjostimella |
Kuten kuvaajasarjan hallinnassa käsitellä.
Shader -tulojen osalta yhtenäiset puskurit tulisi aina olla parempia kuin säilytyspuskurit.
Suositukset
-
Tallenna määritetiedot kahteen puskuriin – yksi kärkipaikkoihin, yksi kaikille muille ominaisuuksille.
-
Kohdista yhtenäisten puskurien siirrot vkphysicalDevicelimits :: MinuniformBufferOffSeALIGNment.
-
Käytä vk_memory_property_host_visible_bit -laitteita, joissa on yhtenäinen muisti.
-
Shader -tulojen osalta yhtenäiset puskurit tulisi aina olla parempia kuin säilytyspuskurit.
Varjostot
Vulkan tarjoaa erilaisia mekanismeja Shader -vakioiden asettamiseen, mukaan lukien; yhtenäiset puskurit, erikoistumisvakiot ja työntövakiot.
Erikoistumisvakiot ovat staattisia arvoja, jotka voidaan asettaa putkilinjan luomisaikaan (kun Spir-V-binaarit kootaan).
Push -vakiot tarjoavat mekanismin Shader -vakiotulotietojen asettamiseksi Vulkan -komentojen kautta puskuriobjektien sijasta. Työnnä vakio säilytystila on rajallinen. Push -vakiovarastointia varten käytettävissä olevien tavujen enimmäismäärä voidaan asettaa VkphysicalDevicelimits :: MaxPushConstanSTSSIze. Kun saatavilla on erikoistuneita siirtymämekanismeja, kuten dynaamisia yhtenäisiä puskurin siirtymiä, tulisi olla parempia kuin työntövakiot. Jos renderointimoottori ei voi taata, että kaikki piirtämiset kuluttavat vähemmän kuin spec -vähimmäismaxPushconstantsSeze -tavut push -vakiotietoihin (128 tavua), on toteutettava yhtenäinen puskuripohjainen varaosasto. Tämä varmistaa, että moottori toimii vulkan -toteutuksissa, jotka tukevat vain pienintä määrää push -vakiotavuja. Dynaamisessa yhtenäisessä puskurin siirtymispolussa siirrot voidaan määrittää vetoomuskohtaisesti soittamalla VKCMDBindDescriptsetit.
Alla olevassa luettelossa hahmotellaan suosituksiamme vakioarvojen asettamiseksi varjostimissa:
-
Staattinen haara: Jos pystyt määrittelemään suorituspolut Spir-V-sukupolven aikana, luodaan omistettu spir-v suorituspolulle (esimerkiksi #define GLSL: ssä). Muussa tapauksessa käytä erikoistumisvakioita Spir-V-putkilinjan luomisaikaan
-
Putkilinjan luomisaikavakiot: Jos voit asettaa vakioarvoa putkilinjan luomisaikaan, käytä erikoistumisvakioita
-
Usein yhtenäiset päivitykset: Jos yhtenäiset datapäivitykset koskevat useita piirteitä VKCMDBindDescriptoresets -puhelun jälkeen, käytä käytä dynaamista yhtenäistä puskuria ja dynaamisia siirtymiä, kun VKCMDBindDescriptoresetit kutsutaan välttämään tarvittavat kuvausasetusmuokkaukset (katso kuvausasetusten hallinta lisätietoja). Jos yhtenäiset tiedot päivitetään korkeammalla taajuudella, esimerkiksi piirtämisessä, harkitse push-vakioita dynaamisten yhtenäisten puskurin siirtymien sijasta
Suositukset
-
Luo omistettu spir-v sukupolven staattiseen haarautumiseen (E.g. #define Shader -lähdössä).
-
Käytä erikoistumisvakioita Spir-V-kokoelman staattiseen haarautumiseen.
-
Käytä erikoistumisvakioita määrittelemään Spir-V-käännös-aika-vakioarvot.
-
Jos yhtenäiset datapäivitykset koskevat useita arvontoja VKCMDBindDescriptoreset -puhelun jälkeen, käytä dynaamisesti siirtymää yhtenäistä puskuria.
-
Harkitse push-vakioita yhtenäisten tietojen suhteen.
-
Luota vain push -vakioihin korkeataajuustietoihin, jos moottorisi käyttää <= 1 28 tavua. Jos tätä ei voida taata, toteuta dynaaminen yhtenäinen puskurin varapolku.
Varo: Ei implisiittisiä yhtenäisiä tyyppimuunnoksia
Toisin kuin OpenGL ES, Vulkan ei suorita implisiittisiä yhtenäisiä tyyppimuunnoksia. Kehittäjät ovat vastuussa puskurin sitomisen sisällön varmistamisesta vastaavat varjostimet, joihin ne ovat sitoutuneet.
Suositukset
- Varmista, että yhtenäiset puskuritietotyypit vastaavat varjostimet yhtenäisiä muuttujia.
Näytä frustumin teurastaminen
Halvin piirto, jota kuljettaja ja GPU koskaan käsittelee, on veto, jota ei koskaan toimiteta. Tarpeettoman ohjaimen ja GPU -prosessoinnin välttämiseksi moottorin optimoinnin yleinen renderöinti on lähettäminen grafiikka -sovellusliittymään vain, jos se kuuluu tai leikkautuu, näkymän rajoja frustum. Näytä frustumin teurastusta on yleensä halpaa suorittaa suorittimella, ja sitä tulisi aina harkita, kun tehdään monimutkaisia 3D -kohtauksia.
Suositukset
- Yritä aina käyttää View Frustum -kyselyä tarpeellisen ohjaimen ja GPU -prosessoinnin välttämiseksi.
Komentopuskurin rakennus
Vulkan’s on suunniteltu sallimaan komentopuskurien rakentaminen useiden säikeiden yli, mikä mahdollistaa tämän kalliiden tehtävän suorittamisen useissa CPU -ytimissä. Lisäksi toissijaiset komentopuskurit voidaan luoda, mikä helpottaa työn hajottamista pienempiin paloiksi. Toissijaiset komentopuskurit on sitouduttava ensisijaiseen komentopuskuriin niiden rakentamisen jälkeen. Joissakin toteutuksissa GPU vaatii kuitenkin kaikki renderöintikomennot, jotka kuuluvat yhteen vierekkäiseen muistilohkoon – tällöin näiden GPU: ien Vulkan -ohjaimet on memcpy () toissijainen komentopuskurit ensisijaiseen komentopuskuriin ennen Komennot suoritetaan. Tämän yleiskustannuksen takia suosittelemme ensisijaisten komentopuskurien suosimista toissijaisille komentopuskureille. Jos haluat monisuojata renderöintisi useiden CPU-ytimien välillä, suosittelemme ensisijaisia ensisijaisia komentopuskureitasi rinnakkain, ennen kuin harkitset toissijaisia komentopuskureita.
Jos päätät käyttää toissijaisia komentopuskureita, sinun tulee harkita huolellisesti osiointijärjestelmääsi. Kun kohtaus on rakennettu paloiksi, moottorin on vaikeampaa optimoida vetopuhelun lähetystilaus ja minimoida tilanmuutokset. Jos toissijainen komentopuskurin rakennuspolku toteutetaan, sinun on päätettävä ajon aikana, jos polkua vaaditaan, vai jos ensisijainen komentopuskurin rakennus olisi nopeampi.
Suositukset
-
Mieluummin komentojen lähettäminen ensisijaisiin komentopuskureihin kuin toissijaisten komentopuskurien käyttäminen.
-
Vältä toissijaisia komentopuskureita GPU-rajoitetuissa laitteissa.
-
Harkitse ensisijaisten komentopuskurien rakentamista rinnakkain ennen kuin harkitset toissijaisia komentopuskureita.
-
Jos käytät toissijaisia komentopuskureita, harkitse osiointijärjestelmääsi huolellisesti.
Varustetut tasapeli
Kaikki Vulkan cmddraw* -toiminnot hyväksyvät instancecount -parametrin. Instanssitiedot voidaan tarjota sitomalla puskuri VKVertExInputBindingDescription :: InputRate-asetettu VK_VERTEX_INPUT_RATE_INSTANCE.
Suositukset
- Käytä aina yksittäistä piirtämistä ja tapausta kohden tietoisia objekteihin.
Kehyspuskurin liitetiedostojen puhdistaminen
Vulkanissa on kolme mekanismia kehyspuskurin liitteiden puhdistamiseksi:
-
Renderpass -kuormitustoiminta (VK_Attachment_load_op_clear)
-
vkcmdclearattachments
-
VKCMDCLEARCOLORIMAGE ja VKCMDCLEARDEPTHSTSILIMAGE
Operaatioiden tehokkaasti suoritettavan varmistamiseksi on tärkeää varmistaa, että oikeaa mekanismia käytetään tiettyyn skenaarioon.
Suositukset
-
Kun tyhjennät liitteet render -passin alussa, käytä vk_attachment_load_op_clear.
-
Kun tyhjennät liitteet alaosassa, käytä VKCMDClearAttachments.
-
VKCMDCLEARCOLORIMAGE- ja VKCMDCLEARDEPTHSTSILIMAGE: tä voidaan käyttää renderöintin ulkopuolella. Nämä toiminnot ovat vähiten tehokas mekanismi laattapohjaisissa GPU-arkkitehtuureissa.
Tehokas renderöinti
Yleinen pullonkaula erittäin tuskin 3D-peleissä on fragmentin varjostuksen toteutusaika. Kehyksen perinnön varjostuskustannusten vähentämiseksi pelipaikka voidaan tehdä alennetulla resoluutiolla, joka on ylöspäin ennen kuin käytetään käyttöliittymän laitteen alkuperäisen tarkkuuden aikaansaamiseksi.
-
Render Pass a (vähentynyt resoluutio)
- Render -peli
-
Render Pass B (natiivi resoluutio)
-
Hyväpalkkainen pelikohtaus kuva
-
Tehdä käyttöliittymä
-
Hyväpalkkainen voidaan suorittaa kahdella tavalla:
-
VKCMDBLITIMAGE
eräs. Kopioi lähdekuvan alueet kohdekuvaan, mahdollisesti muodon muuntamisen, mielivaltaisen skaalauksen ja suodattamisen suorittaminen
b -. Toteutuksesta riippuen tämä toimenpide voidaan suorittaa Dedicated Blitting Hardware -laitteella, GPU: lla tai CPU: lla
-
Tee koko näytön quad
eräs. Aloita Render Pass B koko näytön piirtämispuhelulla, joka ottaa kuvan kuvan
Vaikka VKCMDBLitImage voi tuntua parhaalta vaihtoehdolta, se on yleensä vähemmän tehokasta kuin koko näytön nelosen tekeminen matkapuhelimella GPU: lla. Syynä tähän on, että se vaatii nimenomaisen kopion yhdestä VKIMAGE: sta toiseen VKIMAGE. Toteutuksissa, jotka käyttävät GPU: ta blit -operaatioon, tämä voidaan toteuttaa ylimääräisenä renderöintinä A- ja B -välillä kuluttavan muistin kaistanleveyden ja GPU -syklien välillä, jotka olisivat voineet käyttää muualla. Toisaalta koko näytön nelin lähestymistapa vaatii vain yhden VKIMAGE: n kuvan asettelun siirtymisen. Siirtymätyypistä riippuen toteutus voi pystyä suorittamaan tämän “ilmaiseksi”.
Suositukset
-
Harkitse pelin kohtausta vain, kun Fragment Shader Limited. Varo hyväpalkkaisen kaistanleveyden kustannuksia.
-
Mieluummin koko näytön neliömäinen upScaling VKCMDBLITIMAGE.
Alaryhmät
Mobiililaitteilla on rajoitettu muistin kaistanleveys. Lisäksi muistin kaistanleveyden tiedonsiirrot ovat voimakkuutta käyttää, joten on parasta käyttää sitä mahdollisimman vähän.
3D -grafiikan renderoinnissa Framebuffer voi tarvita useamman kuin yhden liitetiedoston. Monissa tapauksissa vain joitain kiinnitystietoja on säilytettävä – kaikki muut kiinnitystiedot ovat väliaikaisia. Esimerkiksi renderoituun kuvaan voidaan tarvita väripuskuria ja voidaan tarvita syvyyspuskurin varmistamiseksi, että primitiivit tehdään suunnitellussa järjestyksessä. Tässä skenaariossa syvyystietoja ei tarvitse säilyttää, joten sen kirjoittaminen GPU -muistista järjestelmämuisti jätteiden kaistanleveys. Lisäksi kehyksen N-1 väri- ja syvyyspuskurin sisältöä ei välttämättä vaadita kehykseen n. Kun näiden tietojen lähettäminen käyttäisi uudelleen muistin kaistanleveyttä, haluamme kertoa ohjaimelle, että näitä toimintoja ei tarvita.
Kiinnityskuorma OP
Jokaisen liitteen Vkattachmentloadop -ominaisuus määrittelee, kuinka liite tulisi alustaa alion alussa.
-
Vk_attachment_load_op_dont_care
- Tämä on tehokkain vaihtoehto. Sitä tulisi käyttää, kun kiinnitystä ei tarvitse alustaa, e.g. renderöinnissä, joissa jokainen pikseli värittää taivaslaatikon tai piirtämisen
-
Vk_attachment_load_op_clear
- Tämä operaatio on erittäin tehokas Tilersille. Kuten Clearing FrameBuffer Attacts -osiossa keskustellaan, se on tehokkain tapa puhdistaa kiinnitys renderöintin alussa
-
Vk_attachment_load_op_load
- Tämä on kallein toiminta. TBR: issä laatta-muisti alustetaan lataamalla liitteen säilynyt tiedot järjestelmän muistista
Liitetiedosto OP
Jokaisen liitteen Vkattachmentstoreop -ominaisuus määrittelee, kuinka liite tulisi tallentaa alion lopussa.
-
Vk_attachment_store_op_dont_care
- Tämä on tehokkain vaihtoehto. Sitä tulisi käyttää, kun kiinnitystä ei tarvitse säilyttää, e.g. Syvyys- ja kaavainliittymätiedot käytettiin vain tämän passin antamiseen
-
Vk_attachment_store_op_store
- Tämä on kallein toiminta. TBR: issä laatta-muisti säilytetään tallentamalla kiinnityskuva järjestelmän muistissa
Jos liitekuvaa ei koskaan ladata tai tallenneta, VKIMAGE tulisi luoda VK_Image_USAGE_TRANSENT_Attachment_bit ja sidottu muistiin VK_MEMORY_PROPERTY_LAZYY_ALLOCATED_BIT -ominaisuus. Tämän avulla kuljettaja voi käsitellä kuvaa ohimenevänä, siten, että muisti voidaan jakaa laiskasti.
Edistynyt alaryhmäkäyttö
Edistyneitä alaryhmiä, kuten monipäästöjen renderointi laskennallisille valaistusjärjestelmille, keskustellaan Johdanto Vulkan Render -koruihin artikla.
Suositukset
-
Käytä oletusarvoisesti Vk_attachment_load_op_dont_care, vk_attachment_load_op_clear, jos liite on tyhjennettävä ja vk_attachment_load_op_load, jos aiemmat liitetiedot on säilytettävä.
-
Käytä vk_attachment_store_op_dont_care kaikille liitteille, joita ei tarvitse säilyttää.
-
Jos liitekuvaa ei koskaan ladata tai tallenneta, allokota se VK_Image_USAGE_Transient_attachment_bit -sovelluksella ja takaisin muistilla, joka on varattu VK_MEMORY_PROPERTY_LAZY_ALLOCATED_BIT -ominaisuuden kanssa.
Synkronointi
Synkronointi Vulkanissa on monimutkainen ja yleinen virheiden lähde tukemoidemme peleissä. Seuraavat luvut kuvaavat synkronointisuosituksemme.
Terminologia
Ennen kuin yritetään ymmärtää synkronointia primitiivit, on tärkeää ymmärtää näissä spesifisissä luvuissa käytetty Vulkan -terminologia:
-
Synkronointi laajuus: Kokoelma operaatioita. Useimmissa synkronointikomennoissa synkronointialueet määritetään lähde- ja kohdeputkilinjan vaihe -naamioilla
-
Suoritusriippuvuus: Useimmat synkronointikomennot määrittelevät suoritusriippuvuuden. Kaikkien ensimmäisessä synkronointialueessa määriteltyjen toimintojen on suoritettava ennen kaikkia toisessa synkronointialueessa määriteltyjä toimintoja
-
Saatavuustoiminta: Määrittää muistioperaation, jonka on suoritettava ennen seuraavaa muistin käyttöä. Esimerkiksi kuvanmuistin este voi määrittää, että tietyn kuvan VKIMAGE: n väriliite kirjoittaa on suoritettava ennen seuraavaa pääsyä
-
Näkyvyystoiminta: Määrittää muistioperaation, jonka on tapahduttava, kun tietty saatavuusoperaatio on tapahtunut. Esimerkiksi kuvanmuistin este voi määrittää, että varjostin lukee liitteen, kun määritetyt saatavuusoperaatiot ovat suorittaneet
-
Resurssien siirtyminen: Jotkut VKIMAGE -resurssit voivat joutua siirtymään asettelusta toiseen saatavuuden ja näkyvyysoperaatioiden välillä. Kuvamuistin esteiden tapauksessa resurssimuutokset määrittelevät OldLayout ja NewLayout
-
Muistiriippuvuus: Määrittää joukon saatavuusoperaatioita, jotka on suoritettava ennen joukko näkyvyystoimenpiteitä. Muistiriippuvuus voi myös määritellä resurssinsiirron
Semafori
Semaforeita voidaan käyttää resurssien pääsyn hallintaan useiden jonojen välillä. Yleisin semaforin käyttötapaus on grafiikan ja esitysjonojen synkronointi.
Esimerkki: Grafiikkajono ⇔ Esitysjonon synkronointi
Koodilohko 1 kehystä
// Hanki kuva. Siirry semaforiin, joka on signaloitu vkacquirenextimagekhr (laite, swapchain, uint64_max, actoresemaphore, vk_null_handle, &imageDex);
VkpipeLinestageflags waitdStagemask = vk_pipineLine_stage_color_attachment_output_bit;
// Lähetä komentopuskurit lähettämään.WaitsemaPhoreCount = 1; lähettää.pwaitsemaphores = &hankijafaphore; lähettää.pwaitdststagemask = &WaitDSTSTAGEMASK; lähettää.CommandBufferCount = 1; lähettää.pcommandbuffers = &CommandBuffer; lähettää.signaalitMaphoreCount = 1; lähettää.psignalsemaphores = &grafiikkakaphore; Vkqueuesubmit (Graphicsqueue, 1, &Lähetä aita);
// Esitä kuvia näytölle.WaitsemaPhoreCount = 1; nykysäyte.pwaitsemaphores = &grafiikkakaphore; nykysäyte.swapChainCount = 1; nykysäyte.PSWAPChains = &vaihdeketju; nykysäyte.pimageIndices = &ImageDex; VkqueUepresentkhr (esittely, &PresentInfo);
Nähdä Tällä sivulla Lisätietoja.
Suositukset
- Käytä semaforeita aina grafiikan ja esitysjonojen synkronointiin.
Aidat
Aidat voidaan käyttää kommunikoimaan jonosta isäntään. Yleisin aidankäyttötapaus on ilmoittaa, kun grafiikan renderöinti on saatu päätökseen, jotta resursseja voidaan käyttää uudelleen seuraavaan kehykseen. Optimaalisen suorituskyvyn saavuttamiseksi suosittelemme 1: 1: n kartoitusta esittävien kuvien ja resurssien lukumäärän välillä
Suosittelemme välttämään VkwaitForfences -soittojen kutsumista kehyssilmukassa, koska tämä pysähtyy suorituskykyyn ja tuloksiin vähentyneeseen suorituskykyyn (1-3 fps pudotus, jota havaitaan profiloiduissa peleissä). Sen sijaan suosittelemme soittamaan vkgetfencestatus määrittääksesi, mikä esitettävä kuva on käytettävissä.
Esimerkki: Grafiikkajono ⇒ isäntäsynkronointi
Koodilohko 2 alustus
/* Luo aita jokaiselle vaihtoketjulle. Oletuksena kaikki signaloitua siten, että niitä pidetään “käytettävissä” myöhemmässä testissä */ aidalla.liput = vk_fence_create_signaled_bit; Vkfence -aidat [swapchain_image_count]; varten (int i = 0; i < Swapchain_image_count; i ++) vkcreatefence (laite, aita, nolla, aidat);
Koodilohko 3 kehyksen renderöintisisältöä
vkacquirenextimageKhr (laite, swapchain, uint64_max, hankijafaphore, vk_null_handle, &imageDex); /* Joidenkin kehyksen perimättömien toimintojen ei tarvitse kirjoittaa laitteen resursseille välittömästi. Jos aidalle ei ole vielä ilmoitettu, voimme kyselyä aidan tilasta ja prosessoida pieniä töitä odottaessamme. Työn suorittamisajan tulisi olla pieni (<1ms) aidan tilan varmistamiseksi. Huomaa, että ensimmäistä kertaa silmukan läpi, ennen mitään renderointia, aidat ilmoittavat siten, että emme estä */ vKresult fencestatus = vk_not_ready; sillä aikaa(!smalljobqueue.tyhjä() && fencestatus != Vk_success) // pop a työ jonosta ja suorita se //… fencestatus = vkgetfencestatus (laite, aidat [rexioximageIndex]); // Jos työpaikat ovat loppuneet ja aita ei ole ilmoitettu, odota vkwaitforfences (mdevice, 1, &aidat [rexioMageIndex], vk_true, uint64_max); // Aseta aitatila allekirjoittamattomiin vKresetfensseihin (MDEVICE, 1, &aidat [rexiomageIndex]);
// Lähetä työ jonoon. Aseta Vkfence, joka tulisi laukaista valmistumisen jälkeen VKQUEUEUEUBMIT (Graphicsqueue, 1, &Lähetä aidat [ImageIndex]);
// Esitä kuvia näytölle // … VkqueUepresentkhr (esittely, &PresentInfo);
Suositukset
-
Käytä aina aitauksia synkronoidaksesi grafiikkajonon isännän kanssa.
-
Pidä viittauksia dynaamisiin resursseihin ympyräpuskurissa ja käytä aitauksia määrittääksesi, milloin kukin resurssi voidaan käyttää uudelleen.
-
Vältä soittamalla vkwaitforfences -kehyssilmukassa ja käytä sen sijaan vkgetfencestatus.
Rajat
Vulkanin esteet antavat API -käyttäjille mahdollisuuden lisätä riippuvuuksia saman jonon komentojen välillä tai samassa alaryhmässä olevien komentojen välillä. Suoritusriippuvuudet määritellään putkilinjan synkronointiasaloilla. Suoritusriippuvuuksien lisäksi VKCMDPipelineBarrier. Muistin esteet antavat API -käyttäjille mahdollisuuden varmistaa kirjoitusoperaatiot ensimmäisen synkronoinnin aikana (tai ennen) valmistumisen aikana ennen kuin luevat operaatiot toisessa synkronointialueessa. Kuten nimestä päätellä. Hienojyväisempiä synkronointia varten voidaan käyttää puskurimuistin ja kuvan muistin esteitä.
Top_of_pipe_bit | |||
Host_bit | |||
Transfer_bit | |||
Compute_shader_bit | |||
Draw_indirect_bit | Draw_indirect_bit | ||
Vertex_input_bit | |||
Vertex_shader_bit | |||
Tessellation_control_shader_bit | |||
TESSELLATION_EVALUATE_SHADER_BIT | |||
Geometry_shader_bit | |||
Aikaisin_fragment_tests_bit | |||
Fragment_shader_bit | |||
Myöhään_fragment_tests_bit | |||
Color_attachment_output_bit | |||
Bottom_of_pipe_bit |
Yllä olevan taulukon neljä saraketta osoittavat Vulkanin putkistot. Top_of_pipe_bit ja pohja_f_pipe_bit ovat yhteisiä kaikille putkistoille. Vastaavasti ne merkitsevät yleisiä putkilinjan vaihetta ensimmäiselle komennolle, joka aloittaa suorituksen ja viimeisen, joka täydentää suoritusta.
Putkilinjakuplien välttämiseksi on tärkeää, että API -käyttäjät harkitsevat esteiden suoritusriippuvuuksia erittäin huolellisesti. Tämä pätee erityisesti laattapohjaisten GPU-arkkitehtuurien alilaitossa tehtyihin estepuheluihin. Esimerkiksi, jos alaryhmään asetettu este, jolla on pohja_f_pipe_bit ensimmäisen synkronointialueessa ja top_of_pipe_bit toisessa laajuudessa, kaikkien GPU -komennot ennen esteen huuhtelua ja komentoja sen jälkeen He voivat alkaa suorittaa.
Kuplien välttämiseksi esteen ensimmäinen synkronointialue tulisi asettaa mahdollisimman varhain putkilinjalle ja toinen synkronointialue tulisi asettaa uusimpiin mahdollisiin putkilinjan vaiheisiin. Lisäksi ensimmäisen ja toisen synkronointialueen tulisi olla mahdollisimman kapea. Top_of_pipe_bit SrcStagEMask -sovelluksen asettaminen ei koskaan estä estettä ja käyttäytyy ikään kuin ensimmäinen synkronointialue on tyhjä. Samoin DSTSTAGEMASK BOWN_OF_PIPE_BIT tarkoittaa tyhjän toisen synkronointialueen laajuutta. On tapauksia, joissa tämä käyttäytyminen on toivottavaa – kun toinen synkronointi (E.g. semaforit) Valitse jo vaadittavat riippuvuudet – mutta näitä vaihtoehtoja tulisi käyttää huolellisesti.
Globaalien muistiesteiden tulisi olla parempia kuin puskurimuistin esteet, ellei vaadita hienorakeista puskurisynkronointia – esimerkiksi synkronointi kirjoittaa tiettyyn puskurialueeseen. Kuva- ja puskurimuistin esteet, jotka riippuvat samoista synkronointialueista, tulisi erottaa yhdessä VKCMDPipelineBarrier -puhelussa.
Suositukset
-
Aseta lähteesi riippuvuus mahdollisimman varhain putkilinjassa ja määränpääsi mahdollisimman myöhään.
-
Varo putkilinjan kuplia, jotka voidaan ottaa käyttöön asettamalla esteitä laattapohjaisille arkkitehtuureille.
-
Mieluummin globaalit muistin esteet muistiesteiden kanssa.
-
Eräkuva- ja puskurin muistin esteet yhdeksi VKCMDPipelineBarrier -puhelulle, jos heillä on samat laajuudet.
-
Ota yhteyttä Khronos -ryhmään Synkronointiesimerkit Käytettäessä tapauskohtaisia suosituksia.
Tapahtumat
Tapahtumat tarjoavat hienorakeisen synkronointimekanismin:
-
Isäntä grafiikkajonon synkronointi
-
Komentoriippuvuudet renderöinnissä
VKCMDWAITEVENTTIMET VAIKUTTAVAT VAKUUT VKCMDPIPELINEBARRER. Lisäparametrit ovat EventCount ja Pevents. Peventsin ja Srcstagemaskin määrittelemän synkronointialueen on suoritettava suorituksensa ennen komentoja VKCMDWAITEventsin ja DSTSTAGEMASK: n suorittamisen jälkeen.
Grafiikkajonojonon isäntä Tapahtuman synkronointi voi olla hyödyllistä, kun resurssien kirjoitusten on tapahduttava, kun näistä resursseista riippuvainen komento on kirjoitettu komentopuskurille. Esimerkiksi käyttäjän syöttö- ja GPU -suorituksen välisen viiveen vähentämiseksi VR -kompositori voi kirjoittaa matriisin, joka edustaa pään suunnan suistoa. VKCMDWAITEvents estää suorituksen, kunnes tämä tapahtuma on merkitty. Huomaa kuitenkin, että järjestelmä voi tappaa GPU -lähetys, joka vie liian kauan (olettaen, että se on vain kaatunut), joten tämän lähestymistavan avulla tarvitaan äärimmäistä varovaisuutta.
Suositukset
- Mieluummin esteitä tapahtumiin.
Odottaa
Odota tyhjäkäynti on erittäin raskas synkronoinnin muoto. Vkqueuewaitidle odottaa kaikkien jonooperaatioiden suorittamista ja vastaa toiminnallisesti aidan odottamista. VkDeviceWaitidle odottaa kaikkien laiteoperaatioiden suorittamista. Odota tyhjäkäynnin toiminnot takaavat, ettei päällekkäisyyksiä ole, ja sitä tulisi käyttää vain moottorin repimiseen.
Suositukset
- Käytä vain Waitidle -toimintoja moottorin repimiseen.
Vaihtoketju
Kun luot vaihtosuuntausta, suosittelemme, että VK_PRESENT_MODE_FIFO_KHR -esitystila käytetty ja minimAGECOUNT on asetettu 3: ksi.
VK_PRESENT_MODE_MAILBOX_KHR -esitystilan käyttö voi mahdollisesti tehdä kehyksenopeudesta vakaamman; Tämä tapahtuu kuitenkin heittämällä pois kokonaiset renderoidut kehykset, työskentelemällä GPU: ta enemmän kuin tarvitaan (ja siten käyttämällä enemmän voimaa). Suosittelemme voimakkaasti profilointia ja optimointia FIFO: n avulla ja vain postilaatikkoa käyttämällä, kun minimaalinen latenssi on ehdottomasti vaadittu.
Tärkein näkökulma vaihtosuunnitelman kuvien määrän päättämisessä on muistin käytön tasapainottaminen sileyden avulla. Android tukee vaihtosuunnitelman luomista vain 2 kuvaa. Tämä vähentää tarvittavaa muistia, mutta tuo kuplia renderointiputkessa, jos kehystä ei tehdä ajoissa V-Syncille. Vaihtoketju on mahdollista pyytää yli 3 kuvaa, mutta tämän verrattuna lisämuistikulutuksen etuja tulisi harkita huolellisesti.
Semaforeita tulisi käyttää grafiikan ja esitysjonojen synkronointiin. Aidoksia tulisi käyttää grafiikkajonon synkronointiin isännän kanssa. Lisätietoja on seuraavista esimerkeistä:
-
Esimerkki: Grafiikkajono ⇔ Esitysjonon synkronointi
-
Esimerkki: Grafiikkajono ⇒ isäntäsynkronointi
Suositukset
-
Käytä VK_PRESENT_MODE_FIFO_KHR -esitystilaa.
-
Aseta vaihtosuuntainen minimaitos 3: ksi.
-
Synkronoida semaforia grafiikan ja esitysjonojen synkronoimiseksi.
-
Synkronoi grafiikkajono isännän kanssa aidat aidat.
Minimoimalla ylikierron
Fragmentit rasterisoidaan siinä järjestyksessä, että primitiivit toimitetaan grafiikkajonoon. Jos useat primitiivit ovat päällekkäisiä, kaikki fragmentit voidaan tehdä, vaikka lopullisessa kuvassa muuttuu tuloksena olevat fragmentit. Fragmenttien, joiden arvot arvostavat myöhemmät fragmentit.
Joillakin arkkitehtuureilla on optimoinnit vähentämään varjostusfragmenttien yleiskustannuksia, jotka myöhemmin hämärtyvät. Siitä huolimatta, että parhaan kannettavan suorituskyvyn saamiseksi on suositeltavaa käyttää varhaista syvyys-/kaavaimen testausta ja lähettämään läpinäkymättömät vetopuhelut syvyysjärjestyksessä (tyypillisesti etuosa taaksepäin, syvyyden testitilasta riippuen), mikä antaa GPU: n määrittää, onko primitiivinen on näkyvissä ennen varjostusta. Läpinäkyvät primitiivit tulisi tehdä läpinäkymättömien primitiivien jälkeen sekoituskäyttäytymisen säilyttämiseksi.
Suositukset
- Lajittele läpinäkymättömät piirteet edestä taaksepäin, tee sitten läpinäkyvät primitiivit. Tilaamisen ei tarvitse olla täydellistä, jotta voidaan antaa hyvää ylivoiman vähentämistä. Löydä algoritmi, joka antaa hyvän tasapainon CPU -lajittelun yläpuolella ja ylikuormituksen vähentämisen välillä.
Vältä tarpeettomia sovellusliittymiä
Vaikka tarpeettomat vulkan -puhelut, kuten toistuvasti valtion asettaminen ilman renderointia, eivät todennäköisesti aiheuta pullonkauloja, heillä on silti kustannukset.
Suositukset
- Vältä tarpeettomia sovellusliittymiä.
Vahva puskurin käyttö
Vulkan -kuljettajat olettavat, että sovellusliittymän käyttäminen käyttää oikein kutsumista koskeva sovellus. Tämä oletus antaa kuljettajalle mahdollisuuden välttää kalliita ajoajan validointitarkistuksia. Hakemukset voivat pyytää voimakkaampia kestävyystakuita ottamalla käyttöön VarhtBufferaccess -ominaisuus. Vahvan puskurin pääsyn ensisijainen tarkoitus on tarjota rajojen puskurin tarkistukset. Vulkan -eritelmät takaavat, että ReadBufferaccess on fyysisen laitteen käytettävissä oleva ominaisuus, mutta sen mahdollistaminen voi aiheuttaa merkittäviä suoritusrangaistuksia joillekin arkkitehtuureille.
Suositukset
- Käytä kehityksen aikana vahvaabufferaccessia virheiden saamiseksi. Poista se käytöstä julkaisussa.
Validointikerrokset
Khronos -ryhmän Vulkan -validointikerrosten tulisi käyttää säännöllisesti kehityksen aikana sovellusliittymän väärinkäytön tunnistamiseksi. Parhaat tulokset suosittelemme uusimpien käytettävissä olevien validointikerrosten käyttöä. Validointikerrosten lähdekoodi on isännöi GitHubissa ja on yksinkertaista rakentaa. Jokainen kerroksen julkaisu on merkitty SDK-*.
Sinun ei pitäisi luottaa käytettävissä oleviin kerroksiin. Kaikkien mahdollisten ongelmien saamiseksi suosittelemme säännöllisesti kaikkia Khronosin tarjoamia kerroksia.
Renderöintimoottorina voi käyttää erilaisia vulkan -ominaisuuksia eri laitteissa (E.g. tekstuurimuodot), suosittelemme validointikerrosten suorittamista useilla galaksilaitteilla. Kaikki validointikerrosviestit tulisi käsitellä ennen pelin julkaisua.
Virhekoodit eivät ole viestikohtaisia. He luokittelee eräänlainen ongelma, ja useampi kuin yksi viesti voidaan käyttää uudelleen. Emme suosittele kerroksen lähdön jäsentämistä, koska virhekoodit ja viestiteksti voivat vaihdella validointikerroksen julkaisujen välillä.
Jos kerroksen ilmoittaman viestin merkitys ei ole selkeä, suosittelemme validointilähdekoodin etsimistä syyn ymmärtämiseksi paremmin.
Jos tunnistat vääriä positiivisia tai tilanteita, joissa virheellistä sovellusliittymän käyttöä ei ole kiinni, ilmoita kysymys Githubin kerroksia vastaan.
Jos haluat tietää enemmän Khronosin validointikerroksista, suosittelemme Lunargin lukemista Vulkan -validointikerrokset syvä sukellus liukumäki.
Suositukset
-
Käytä Khronos -validointikerroksia säännöllisesti kehityksen aikana.
-
Käytä aina uusinta kerrosjulkaisua.
-
Käytä useiden laitteiden kerroksia laitteen erityisten viestien tarttumiseen.
-
Varo: Virhekoodit luokitele ongelma – ne eivät ole yksilöivä tunniste tietylle viestille.
-
Jos viesti on epäselvä, katso kerroksen lähdekoodi.
ARM -resurssit
- Vulkan ® UnifiedSamples -varasto
- Khronosin isännöity näytevarasto, jossa kuka tahansa voi käyttää Khronos-tarkistamia, korkealaatuisia vulkan-koodinäytteitä
- ARM Mali Application Developer Best Practices (Sisältää sekä Vulkanin että OpenGL ES -sovellusliittymät)
- ARM MALI Vulkan -näyteskoodi
- Varren perfdoc
- Vulkan -validointikerros, jonka tavoitteena on vahvistaa sovellukset ARM Mali Application Developer Best Practices
- ARM MALI Vulkan -kehittäjäresurssit
Write a comment: