Først en ansvarsfraskrivelse: Jeg er langt fra en ekspert på emnet, jeg er bare en vanlig Joe som tilfeldigvis bruker OpenSCAD og har gjort noen eksperimenter med det. Jeg tror svaret nedenfor er riktig, men jeg vil være veldig takknemlig hvis feil eller misforståelser ble gjort oppmerksom på meg i kommentarene. :)
Jeg har lest at funksjonen gjengivelse noen ganger er nyttig for å øke hastigheten på gjengivelsen. Er dette riktig, eller har jeg misforstått det?
Jeg er ikke klar over om det er mulig å bruke render ()
for å øke hastigheten på "total gjengivelse", men Jeg er ganske trygg på at det tiltenkte formålet for render ()
er å forenkle representasjonen i minnet av modellen og dermed responsen til forhåndsvisningsvinduet , i stedet for å øke den endelige gjengivelsen.
Hvordan fungerer dette?
For å forstå hvordan dette fungerer, må man forstå hvordan konstruktiv solid geometri (CSG) fungerer.
Hele forutsetningen for CSG er at bruk av boolske operasjoner mellom primitive faste former, er det mulig å representere komplekse former.
Imidlertid, mens den menneskelige operatøren kan se subtraktive operasjoner som forskjell og skjæringspunkt som noe som gjør modellen mindre i volum og dermed muligens lettere å håndtere, datamaskinen ser hver eneste operasjon som legger til geometri og kompleksitet til delen, som følgende bilde passende illustrerer:
Når du manipulerer modellen i CAD-visningsprogrammet, er OpenSCAD i forhåndsvisningsmodus og alt som "usynlig geometri" må behandles for hver justering av visningsområdet. Det er lett å nå et nivå der OpenSCAD-visningen blir nervøs eller ikke svarer.
Hva render ()
-funksjonen gjør, er å fortelle OpenSCAD å beregne masken som følge av de boolske operasjonene som er omsluttet av render ()
-anropet, og bruke det enkeltnettet i stedet for de underliggende boolske-kombinerte primitivene når du håndterer modellen i visningen. Netting er det som vanligvis brukes i gjengivelsesmodus av OpenSCAD (F6) i stedet for i forhåndsvisningen en, men her er deres fordel ikke bedre visuell kvalitet, men det faktum at OpenSCAD trenger å håndtere mye mindre geometri.
Under hvilke omstendigheter kan jeg bruke den?
Du kan bruke den når som helst du vil, egentlig, men det er en kompromiss : en modell som bruker render ()
-funksjonen internt, vil ta lenger tid å vise sin første forhåndsvisning (fordi å generere masken er en kostbar operasjon), men den vil oppføre seg veldig bra i betrakteren. Omvendt vil en stor modell som ikke utnytter render ()
være nervøs å håndtere i betrakteren, men den vil gjengis til skjerm i en brøkdel av tiden. Det må bemerkes at OpenSCAD benytter hurtigbufring tungt, så den første forhåndsvisningen er den som vil ta lengst tid, mens påfølgende kan være mye raskere.
For referanse oppførte koden nederst i dette svaret (som genererer bildet ovenfor) slik:
- Med
gjengi () kode>: 15s for forhåndsvisning, 1m29s mer for riktig gjengivelse ( TOTAL: 1m44s ).
- Uten
gjengivelse ()
: 0s for forhåndsvisning , 1m45s mer for riktig gjengivelse ( TOTAL: 1m45s ).
Jeg vet ikke om det faktum at totalene ligner hverandre er et tilfeldighet som er spesiell for modellen min eller en generell tommelfingerregel (funksjonen render ()
skaper effektivt en del av den endelige gjengivelsen under forhåndsvisning), men du er fri til å leke med koden og hvis du finner ut et mønster, vær så snill å legge igjen en kommentar.
I den følgende koden må du kanskje øke rutenettstørrelsen til 20x20 hvis du vil se forskjellen i respons mellom vaniljekode og funksjonen render ()
.
Husk også å lukke og åpne OpenSCAD på nytt mellom testene, for å tømme hurtigbufferen.
$ fn = 30; module shape () {render () difference () {sphere () ; sylinder (r = 0,3, h = 3, sentrum = sann); roter ([90, 0, 0]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([0, 90, 0]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([45, 0, 0]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([- 45, 0, 0]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([0, 45, 0]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([0, -45, 0]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([90, 0, 45]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([90, 0, -45]) sylinder (r = 0,3, h = 3, sentrum = sann); }} modullinje (x, y) {translate ([x * 2, y, 0]) form (); hvis (x > 0) linje (x - 1, y);} modul rutenett (x, y) {linje (x, y * 2); hvis (y > 0) rutenett (x, y - 1);} rutenett (3, 3);