Teknologian jakaminen

Pelikehityksen haastattelukysymykset 7

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Miltä taustalla oleva ArrayList-tietorakenne näyttää?

ArrayListin alin kerros on toteutettu taulukoiden perusteella. Se tekee tämän laajentamalla tai pienentämällä taulukon kokoa dynaamisesti. Kun kapasiteetti ei riitä, se luo suuremman taulukon, kopioi alkuperäiset tiedot ja lisää siihen lopuksi uudet tiedot.

ArrayList-laajennuksen mekanismi on: kun ensimmäinen elementti lisätään, ArrayListin kapasiteetti on 10 aina kun uusi elementti lisätään, jos kapasiteetti ylittyy, alkuperäinen kapasiteetti kaksinkertaistuu, eli alkuperäinen kapasiteetti * 2; , jos alkuperäinen kapasiteetti on 0, niin uusi kapasiteetti on 1.

ArrayList-laajennusmekanismin edut ja haitat:

etu:
  1. ArrayList-laajennusmekanismi on helppo ymmärtää ja helppo toteuttaa.
  2. Laajennetun kapasiteetin on oltava suurempi kuin alkuperäinen kapasiteetti, mikä voi vähentää matriisikopioiden määrää uusia elementtejä lisättäessä ja parantaa elementtien lisäämisen tehokkuutta.
puute:
  1. ArrayList-laajennusmekanismi johtaa muistin tuhlaukseen ja voi helposti aiheuttaa muistitilan tuhlausta.
  2. Kun kapasiteetti on suuri, jokainen laajennus vaatii paljon muistia ja prosessoriresursseja, mikä vaikuttaa suorituskykyyn. Siksi ArrayListiä käytettäessä alkukapasiteetti on asetettava asianmukaisesti.
ArrayList ei ole säikeen turvallinen

ArrayListin sisäinen toteutus perustuu taulukoihin, kun useat säikeet käyttävät samaa ArrayListiä samanaikaisesti, tietojen epäjohdonmukaisuutta voi esiintyä esimerkiksi silloin, kun yksi säie lukee ArrayListin tietoja ja toinen säie lisää/poistaa tietoja ArrayList, voi olla Muuta ArrayList-tietoja, jotta ArrayList-tietoja lukeva säie voi lukea vääriä tietoja, mikä aiheuttaa ohjelmavirheen.

Yleisiä menetelmiä ArrayList-säikeiden epävarmuuden ratkaisemiseksi ovat:
  1. Käytä vektoria ArrayListin sijaan: Vektori synkronoidaan ja synkronoimalla muokataan kaikkia menetelmiä, joten se on säikeen turvallista;
  2. Kääri ArrayList säikeen turvallisuuteen: Käytä Collections.synchronizedList(list) -menetelmää muuntaaksesi ArrayList säieturvaksi;
  3. Käytä CopyOnWriteArrayListiä: Se on ketjuturvallinen ja tehokas kokoelma. Tämän toteutuksen kustannukset ovat hyväksyttävällä tasolla.
  4. Käytä lukkoja langan turvallisuuden saavuttamiseksi: Voit käyttää lukitusmekanismeja, kuten ReentrantLock, toteuttaaksesi säikeen varman ArrayListin.

Ero pinon ja pinon välillä

  • Pino on erityinen lineaarinen taulukko. Sen ominaispiirre on, että tietoja voidaan lisätä ja poistaa vain toisesta päästä, ensimmäinen sisään, viimeinen ulos, viimeinen sisään ensimmäinen ulos -periaatteella. Se on tallennusrakenne, jota voidaan käyttää funktioparametriarvojen, paikallisten muuttujien jne. tallentamiseen.

  • Kasa on erityinen puurakenne, jolle on ominaista se, että kaikkien solmujen arvot ovat suurempia tai yhtä suuria kuin niiden lapsisolmujen arvot, ja juurisolmun arvo on suurin tai pienin. Keko on dynaaminen tallennusrakenne, jota voidaan käyttää suurten tietomäärien tallentamiseen, kuten lajitteluun, hakuun jne.

Alempi kerros korutiinia

Korutiinin ydin on kevyt säie.

C# GC (roskatkeräys) -periaate

  1. Viitteiden laskenta: Kun objektiin viitataan, sen viitemäärää lisätään 1:llä. Kun viittaus lakkaa, sen viitemäärää pienennetään yhdellä. Jos kohteen viitemääräksi tulee 0, roskankerääjä ottaa kohteen takaisin.
  2. Merkitse ja tyhjennä: Kun roskakeräin on käynnissä, se kulkee kohteiden läpi viitesuhteiden mukaisesti, merkitsee käytettävissä olevat kohteet "eläviksi", merkitsee luoksepääsemättömät kohteet "kuolleiksi" ja tyhjentää sitten kaikki kohteet, jotka on merkitty "kuolleiksi".
  3. Kopiointialgoritmi: Roskankerääjä jakaa käytettävissä olevan muistin kahteen lohkoon ja käyttää vain yhtä lohkoa kerrallaan. tilaa.
  4. Merkintä-täydennysalgoritmi: Kun roskakeräys on käynnissä, se merkitsee ensin kaikki elossa olevat kohteet ja siirtää sitten kaikki elossa olevat objektit toiseen päähän tyhjentääkseen käyttämättömät tilanpalaset.

Ero tilan synkronoinnin ja kehyssynkronoinnin välillä

Tilan synkronointi Se viittaa kunkin koneen tilan (kuten sijainti, nopeus, kiihtyvyys jne.) lähettämiseen monikonejärjestelmässä muille koneille kussakin ohjausjaksossa, jotta jokainen kone pysyy synkronoituna. Tilasynkronoinnilla voidaan saavuttaa monen koneen yhteistoiminnallisen ohjauksen reaaliaikainen suorituskyky, mutta koska jokaisessa ohjausjaksossa on lähetettävä suuri määrä dataa, sen tarkkuus voi olla suhteellisen alhainen.

Kehyssynkronointi Se tarkoittaa, että jokaisessa ohjausjaksossa monikonejärjestelmän jokaisen koneen ohjauskomennot välitetään muille koneille siten, että jokainen kone pysyy synkronoituna. Kehyssynkronointi voi saavuttaa usean koneen yhteisohjauksen tarkkuuden, mutta koska jokaisessa ohjausjaksossa lähetetään vain pieni määrä ohjauskäskyjä, sen reaaliaikainen suorituskyky voi olla suhteellisen alhainen.

Yleisiä suunnittelumalleja

Singleton malli
Tehdaskuvio
Komposiittikuvio
Välityspalvelimen malli

Linkitettyjen luetteloiden, binääripuiden ja hash-taulukoiden ominaisuudet

1. Linkitetty luettelo:
  • Se on lineaarinen listarakenne, jolle on tunnusomaista, että jokaisessa solmussa on osoitin, joka osoittaa seuraavaan solmuun, muodostaen siten linkitetyn listan;
  • Riippumatta solmun lisäämisestä tai poistamisesta, sinun tarvitsee vain muuttaa osoittimen suuntaa, ja aika monimutkaisuus on O(1);
  • Solmun löytämisen aikamonimutkaisuus on O(n), ja sinun on etsittävä järjestyksessä alkaen pääsolmusta;
  • Linkitettyjen luetteloiden ei tarvitse ottaa huomioon tilanvarausongelmia. Yleensä dynaamista muistin varaamista käytetään joustavaan muistinhallintaan.
2. Binääripuu:
  • Binääripuu on puurakenne, jossa jokaisella solmulla on enintään kaksi lasta;
  • Binääripuun haku-, lisäys- ja poistotoimintojen aikamonimutkaisuus on O(log2n), O(log2n) ja O(log2n), vastaavasti;
  • Koska binaaripuun jokaista solmua ei tallenneta jatkuvasti, vaan se tallennetaan hierarkkisesti ja jokaisella solmulla voi olla vain kaksi lasta, tallennustilaa voidaan käyttää tehokkaammin.
3. Hash-taulukko:
  • Hajautustaulukko on tietorakenne, joka kartoittaa avaimen taulukon sijaintiin päästäkseen tietueisiin hakujen nopeuttamiseksi;
  • Hajautustaulukon hakuajan monimutkaisuus on O(1) ja lisäys- ja poistoajan monimutkaisuus on O(n);
  • Hajautustaulukon toteuttaminen vaatii lisätilaa itse hash-taulukon tallentamiseen, ja tiivistetörmäysongelma on ratkaistava.

HashMapin perusperiaate

HashMapin alin kerros on toteutettu taulukkoon linkitetyllä listalla (puna-musta puu). Se tallentaa tiedot avaimen hashCode-arvon mukaan koodia ja käyttää linkitettyä luetteloa (puna-musta puu) tietojen tallentamiseen. HashMap Java 8:ssa, kun linkitetyn luettelon pituus ylittää kynnyksen (oletus on 8), se muunnetaan punamustaksi puuksi kyselyn tehokkuuden parantamiseksi.Kun kapasiteetti ei riitä, se laajenee automaattisesti Oletuskuormituskerroin on 0,75 ja laajennusmenetelmä on 2 kertaa kapasiteetti.

Kuinka määrittää, onko linkitetyssä luettelossa sykli

  1. Käytä hash-taulukkoa linkitetyn luettelon jokaisen solmun läpi ja tallenna solmun osoite hash-taulukkoon. Jos nykyinen solmu on jo olemassa hash-taulukossa, se tarkoittaa, että linkitetyssä luettelossa on jakso.
  2. Määritä kaksi osoitinta, hidas osoitin liikkuu askel kerrallaan ja nopea osoitin kaksi askelta kerrallaan. Jos nopea osoitin kohtaa hitaan osoittimen, se tarkoittaa, että linkitetyssä luettelossa on jakso.

Mitkä ovat pinojen ja jonojen käyttöskenaariot?

Selaimen eteenpäin- ja taaksepäin-toiminnot: Selaimen vierailemat verkkosivut voivat toteuttaa eteenpäin- ja taaksepäin-toiminnot pinotietorakenteen kautta.

Tiedätkö mitään tcp sticky -ongelmasta?

TCP-kiihtymisongelma viittaa siihen, että TCP-protokolla ei fragmentoi dataa siirrettäessä dataa, jolloin vastaanottavan pään vastaanottaman datan määrä on suurempi kuin lähettävän pään lähettämän datan määrä.

Tapoja ratkaista TCP-kiihtymisongelma ovat seuraavat:
  1. Erottimen lisääminen lähetyspäähän: Lisää erotin lähetyspäähän Kun vastaanottava pää on vastaanottanut erottimen, se voi jakaa tiedot erottimen perusteella.
  2. Lisää otsikko lähetyspäähän: Lähetyspää lisää otsikon ennen tietojen lähettämistä. Vastaanottava pää jakaa tiedot otsikon pituustietojen perusteella.
  3. Lisää puskuri lähetyspäähän: Ennen tietojen lähettämistä lähetyspää laittaa tiedot puskuriin ja lähettää joka kerta vain osan puskurissa olevasta tiedosta tiedon vastaanottamisen jälkeen, lähetetäänkö se tiedot perustuvat tietojen kokonaispituuteen.

Kuinka ottaa käyttöön yksinkertainen TCP UDP:tä käyttämällä

Ensinnäkin UDP-datagrammit voivat auttaa toteuttamaan kolmisuuntaisen kättelyprosessin TCP/IP-protokollassa. Ensimmäisessä kättelyssä asiakas lähettää kättelypyynnön sisältävän UDP-datagrammin. Kun palvelin vastaanottaa tämän viestin, se vastaa vahvistusviestillä, joka osoittaa, että palvelin on vastaanottanut asiakkaan kättelypyynnön ja on valmis tarjoamaan palveluita. Toisessa kättelyssä asiakas lähettää uudelleen UDP-datagrammin Tällä kertaa viesti sisältää hyödyllisiä tietoja, kuten asiakkaan IP-osoitteen, portin numeron jne., jotta palvelin voi tunnistaa asiakkaan. Kolmannessa kättelyssä palvelin lähettää UDP-datagrammin, joka ilmoittaa, että yhteys on muodostettu ja asiakas voi aloittaa tiedon lähettämisen.

Toiseksi, UDP-datagrammit voivat myös auttaa toteuttamaan tiedonsiirtoprosessin TCP/IP-protokollassa. Kun asiakkaan on lähetettävä dataa palvelimelle, tiedot kapseloidaan UDP-datagrammiin ja lähetetään palvelimelle, kun palvelin on vastaanottanut UDP-datagrammin, se jäsentää viestin sisältämät tiedot ja suorittaa siihen liittyvän käsittelyn.

Lopuksi UDP-datagrammit voivat myös auttaa toteuttamaan yhteyden katkaisuprosessin TCP/IP-protokollassa.Kun asiakas ei enää tarvitse kommunikoida palvelimen kanssa, se voi lähettää UDP-datagrammin ilmoittamaan, että asiakas katkaisee yhteyden Kun palvelin on vastaanottanut tämän viestin, se vapauttaa vastaavat resurssit ja täydentää näin koko TCP/IP-protokollan yhteysprosessi

Oletko käyttänyt korutiineja? Miksi käyttää korutiineja?Miksi korutiinit ovat nopeampia

Korutiinit mahdollistavat ohjelmien vaihtamisen eri tehtävien välillä, mikä parantaa ohjelman tehokkuutta ja lyhentää ohjelman ajoaikaa. Korutiinien avulla ohjelma voi vaihtaa useiden tehtävien välillä sen sijaan, että odottaisi yhden tehtävän valmistumista ennen uuden aloittamista. Se voi myös jakaa muuttujia eri säikeiden välillä, mikä lyhentää ohjelman ajoaikaa. Monitoimisovelluksissa korutiinien käyttö voi parantaa merkittävästi suorituskykyä, mikä johtaa nopeampiin käyntinopeuksiin.

Onko nopeampaa kulkea samanpituisen taulukon tai linkitetyn luettelon läpi? Miksi?

Taulukot ovat nopeampia, koska taulukon jokaisen elementin osoite on jatkuva ja kiinteä, ja seuraavan elementin osoite voidaan saada nopeasti, kun taas linkitetyn luettelon jokaisen elementin osoite on epäjatkuva ja sinun täytyy kulkea osoitin saadaksesi seuraavan elementin osoitteen, joten taulukon läpikulku on nopeampi.

Puhutaanpa virtuaalifunktioista Miksi tarvitsemme virtuaalisia toimintoja?

Virtuaalifunktio on erikoistoiminto, joka eroaa tavallisista funktioista siinä, että kääntäjä määrittää sen automaattisesti ja sitä voidaan kutsua käännöshetkellä. Virtuaalifunktion ominaisuus on, että sen toteutus määräytyy ajon aikana, ei käännösaikana.
Virtuaalisten funktioiden päätarkoitus on saavuttaa polymorfismi. Abstrakti luokka voi määritellä useita virtuaalisia funktioita, ja sitten sen alaluokat voivat toteuttaa nämä funktiot.

Voiko tuhoaja olla virtuaalinen toiminto? Pitääkö sen olla virtuaalinen toiminto? Miksi? Mikä ongelma on, jos se ei ole virtuaalinen toiminto?

Sen ei tarvitse olla virtuaalinen funktio, mutta yleensä suositellaan virtuaalisen funktion käyttöä, koska johdannainen luokka voi ohittaa virtuaalifunktion, jolloin johdetun luokan tuhoaja voidaan suorittaa oikein ei käytetä, johdetun luokan tuhoajaa ei kutsuta, mikä voi aiheuttaa ongelmia, kuten muistivuotoja.

Esittelyssä renderöintiputki

Renderöintiputki on sarja vaiheita, joita käytetään pelikohtausten tietojen muuntamiseen syöttötiedoista näytöllä näytetyiksi kuviksi.

Rappausputkilinjan prosessi on jaettu kolmeen päävaiheeseen: valmisteluvaihe, geometriavaihe ja valaistusvaihe.

Valmisteluvaiheessa pelimoottori lataa pelin kohtauksen mallit ja tekstuurit grafiikkasuoritusyksikköön (GPU) ja järjestää tiedot myöhempiä vaiheita varten.

Geometriavaiheessa matriisimuunnoksilla malli sijoitetaan kolmiulotteiseen avaruuteen ja malli muunnetaan sellaiseen muotoon, jota voidaan tukea ruudun pikseleillä.

Valaistusvaiheessa valonlähteen ja valaistusmallin avulla lasketaan kunkin pikselin väriarvo, ja tuloksena saatu kuva näytetään lopuksi näytöllä.

Puhutaanpa binäärihakupuiden lisäys-, kysely- ja poistotoiminnoista ja mikä on aika monimutkaisuus?

  1. lisää:
  • Aika monimutkaisuus: O(log n)
  • Askeleet:
  1. Käsittele lisättävää solmua uutena lehtisolmuna alkaen juurisolmusta;
  2. Jos lisättävä solmun arvo on pienempi kuin nykyinen solmun arvo, siirry nykyisen solmun vasempaan lapsisolmuun;
  3. Jos lisättävä solmun arvo on suurempi kuin nykyinen solmun arvo, siirry nykyisen solmun oikeaan lapsisolmuun;
  4. Jos nykyisellä solmulla ei ole lapsisolmuja, lisättävä solmu on nykyisen solmun lapsisolmu;
  5. Muussa tapauksessa toista vaiheita 2–4, kunnes löydetään solmu, jossa ei ole lapsisolmuja, ja lisättävää solmua käytetään tämän solmun lapsisolmuna.

Mitkä ovat ehdot, jotta ahne algoritmi saa optimaalisen ratkaisun?

Edellytykset ahneelle algoritmille optimaalisen ratkaisun saamiseksi ovat "optimaalinen alirakenne" ja "ahneen valinnan ominaisuus":

  1. Optimaalinen alirakenne: Ongelman optimaalinen ratkaisu sisältää optimaaliset ratkaisut ongelman osaongelmiin;
  2. Ahne valintaominaisuus: Jokaisessa vaiheessa tehdään paikallinen optimaalinen valinta, ja lopputuloksena on globaali optimaalinen ratkaisu.