• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Lua vs Unreal Script & Lua vs Python
#1
Lua vs Unreal Script:

Introduzione:

UnrealScript è un linguaggio di programmazione progettato per mappare naturalmente sulla necessità di programmazione del gioco entro [Epic Games]'Unreal Engine.

UnrealScript è bytecode based: il codice viene compilato in una serie di bytecode simile al P-code o il bytecode Java. In questo modo UnrealScript resta indipendente dalla piattaforma e facilita il porting verso altre piattaforme come Mac o console. UnrealScript è anche un Garbage Collection. Tutti gli oggetti e gli attori in Unreal sono garbage collection con un seguito di garbage collector-albero simile a quella della VM di Java.

Il ragionamento per indagare la performance relativa di UnrealScript vs Lua è vedere se Lua può essere utilizzato in un motore di gioco nello stesso modo che UnrealScript è così stato utilizzato con successo in tutta Unreal Engine basato giochi.

Caratteristiche:

Lua e UnrealScript sono piuttosto diverse lingue. Sono entrambi compilati in bytecode, eseguiti tramite una macchina virtuale, offrono un ambiente pointerless con garbage collection automatica, e fornire una sandbox sicura esecuzione. Questo è dove le loro somiglianze finiscono qui.

UnrealScript è un linguaggio fortemente tipizzato come Ada e C + +. Questo offre il vantaggio di catturare gli errori di tipo non intenzionale in fase di compilazione, mentre sacrificare una certa flessibilità. Lua D'altra parte è dinamicamente tipizzati. In pratica, ciò può portare a qualche tempo sprecato il debug, in alcuni casi, ma non è un problema così grande come sembra prima. Sempre a mio parere Lua potrebbe usare una garza come passare prima della compilazione.

UnrealScript supporta anche concetti importanti come il tempo, lo stato, proprietà e messa in rete attraverso la funzionalità del linguaggio esplicito. Questo rimuove un sacco di complessità che sarebbe necessaria se realizzati a livello di script. Naturalmente Lua non ha queste caratteristiche, come è inteso per uso generale, ma è il supporto per i meta-meccanismi potrebbero essere utilizzati per fornire funzionalità simili.

Performance:

Sulla base delle performance ravvicinamento citato popolarmente, Lua è 10 volte più lento di codice C. Epic sostiene che UnrealScript è una performance 20x colpo di codice C + +. Qui di seguito ho portato parametri di riferimento diversi da [The Great Win32 Computer Language Shootout] a UnrealScript nel tentativo di fare un confronto diretto delle prestazioni.

Per fare tutti i tempi ho usato scritto una piccola funzione di test in cui Lua volte il codice testato con os.clock più volte () in un ciclo. E poi getta fuori il risultato più veloce e più lento e media i tempi per ottenere una sincronizzazione finale. UnrealScript è più complessa in quanto nessuna delle funzioni documentate per il codice relazione di temporizzazione risultati coerenti. Così ho invece li lancio via UCC e un [commandlet]. Per rimuovere il sovraccarico di lancio UCC ho tempo irreale di una funzione di vuoto che poi ho subract dai test.

La release 5.0.2 Lua è usato (l'ultima versione stabile), UnrealScript era in esecuzione all'interno di Unreal Tournament 2004 build 3.323, e il C + + test è stato fatto in Microsoft Visual C + +. NET 2003.

Tutti i test eseguiti su un P4 a 2,8 GHz Intel con 1GB di memoria.

Array di accesso:

Il parametro di riferimento per Lua5 accesso array nella sparatoria ha un bug (un superfloues "+ 1" in linea 10). Ho corretto per il test di seguito.

C + +

Codice PHP:
// -*- mode: c++ -*-
// $Id: ary3.g++,v 1.2 2001/06/20 03:20:02 doug Exp $ // http://www.bagley.org/~doug/shootout/

#include <iostream>
#include <vector>

using namespace std;

int main(int argcchar *argv[]) {
    
int ik= ((argc == 2) ? atoi(argv[1]) : 1);
    
typedef vector<intARY;
    
ARY x(n);
    
ARY y(n);

    for (
i=0i<ni++) {
    
x[i] = 1;
    }
    for (
k=0k<1000k++) {
    for (
int i 1>= 0; --i) {
        
y[i] += x[i];
    }
    }

    
cout << y[0] << " " << y.back() << endl; } 

Resultati:

n = 1000, 0.0306s
n = 3000, 0.03188s
n = 5000, 0.03564s
n = 7000, 0.03876s

UnrealScript:

Codice PHP:
static final function string ArrayTestoptional int n ) {
    
local int ik;
    
local array<intx;
    
local array<inty;

    if ( 
== ) {
        
1;
    }

    
x.Length n;
    
y.Length n;

    for ( 
0ni++ ) {
        
x[i] = 1;
    }

    for ( 
k=0k<1000k++ ) {
        for (
n-1>= 0i--) {
             
y[i] += x[i];
        }
    }

    return ( 
y[0]$ " " $y[n-1] );


Risultati:

n = 1000, 0.27252s
n = 3000, 0.81316s
n = 5000, <runaway loop error>
n = 7000, <runaway loop error>

UnrealScript ha la protezione contro passanti in fuga che viene attivato con la prova a oltre 3000. Quindi questo è tutto ciò che arriva a proseguire per questa prova.

Lua:

Codice PHP:
function array_test)

    
local x= {}, {}

    for 
i=1,do
        
x[i] = i
        y
[i] = 0
    end

    
for k=1,1000 do
        for 
j=n,1,-do
            
y[j] = y[j] + x[j]
        
end
    end

    
return y[1] .. " " .. y[n]
end 

Risultati:

n = 1000, 0.21872s
n = 3000, 0.65432s
n = 5000, 1.09124s
n = 7000, 1.52688s

Lua sta eseguendo a circa 1/7th la velocità di C + + per n = 1000 e 1/40th per n = 7000. Si tratta di circa il 24% più veloce rispetto UnrealScript

Lua vs Python:

La prossima versione di Javascript che apparentemente non hanno una funzione molto simile a generatori di Python; l'alternativa di stile coroutine Lua è stata respinta dopo un lungo dibattito che si riassume in [Mix blog di Neil].
Come i generatori Python differiscono da coroutine Lua? La caratteristica più importante è che in Lua, coroutine.yield () è una funzione ordinaria, che può essere richiamato in qualsiasi punto la misura dinamica di una coroutine.resume () con la limitazione che non si può produrre attraverso una C richiamata (a meno che non si utilizza MikePall 's [Coco] raccolta.) In Python, resa è sintattica, e non può che essere nel corpo lessicale della funzione di generatore.

Ciò significa che i generatori Python deve essere scritto come generatori, e non può essere facilmente scomposto in parti più piccole funzioni, né possono facilmente essere ricorsive. È possibile ottenere la ricorsione da una forma di concatenamento; un messaggio sulla [mailing list Python] descrive sia il meccanismo:

!!Python
def inorder(t):
if t:
for x in inorder(t.left):
yield x
yield t.label
for x in inorder(t.right):
yield x

In Lua, si potrebbe scrivere un altro agnostico inorder funzionare come una funzione di ordine superiore:

Codice PHP:
function inorder(ft)
  if 
t then
    inorder
(ft.left)
    
f(t.label)
    return 
inorder(ft.right)
  
end
end 

La funzione Lua potrebbe poi essere usato sia come l'iteratore in una per ciclo:

Codice PHP:
for label in coroutine.wrap(inorder), coroutine.yield, do
  -- 
something with label
end 

o come una sorta di foreach funzione:

Codice PHP:
inorder(print, t

Nel tentativo di ridurre il confronto di generatori ricorsivi al minimo, ho scritto un paio di semplici programmi che generano l'infinito [funzione Ruler]. (Un interessante pagina di informazioni su questa funzione è Michael Naylor [Abacaba-Dabacaba] che comprende una esplorazione musicale.)

La funzione righello può essere generato in modo non ricorsivo, ma in questo esempio è in piedi per qualcosa come una prima ricerca in profondità, per cui ci limiteremo a esaminare l'implementazione ricorsiva. I programmi di generare i primi 2 ^ k valori nella sequenza e aggiungerli su come una sorta di test di validità, poiché è facile dimostrare che la somma dei primi 2 ^ k elementi della funzione righello è 2 ^ (k +1) -1. Python funzioni built-in e libreria standard sono a portata di mano qui, in Lua, ho dovuto attuare la somma e islice (prima k elementi di una sequenza) funziona me stesso, ma per fortuna non è difficile.

Quindi, ecco l'applicazione Lua:

Codice PHP:
function ruler(putk)
  for 
1do
    
put(i)
    
ruler(puti-1)
  
end
end
 
function eachruler()
  return 
coroutine.wrap(function()
    return 
ruler(coroutine.yield, 100)
  
end)
end
 
function sumseq(kfos)
  
local sum 0   
  
for v in fodo
    
ksum k-1sum v
    
if <= 0 then break end
  end        
  
return sum
end
 
local howmany 
tonumber(arg[1]) or 24
local now 
os.clock()
local sum sumseq(2^howmanyeachruler())
local took os.clock()-now
print(("%2i: %7.3f seconds  %i check %i"):format(howmanytooksum2^(howmany+1)-1)) 

e l'implementazione di Python molto simili e un po 'più breve:

Codice PHP:
!Python
from itertools import islice
from sys import argv
from time import clock
 
def ruler
(k):
  for 
i in range(1k+1):
    yield 
i
    
for x in ruler(i-1): yield x
 
howmany 
int(argv[1])
now clock()
total sum(islice(ruler(100), 2**howmany))
took clock()-now
print "%2d: %7.3f seconds %d check %d" % (howmanytooktotal2**(howmany+1)-1

La formulazione un po 'strano della ricorsione è il risultato di modificare manualmente le tailcall in una di loop, perché Python non fa tailcalls, e l'attuazione tailcall originale messo in Python anche più di uno svantaggio.

Dal momento che entrambi i programmi superato il controllo, io solo incollare i tempi comparativa qui (in secondi come riportato sopra). Io non credo che questo sia semplicemente un "Lua è più veloce di Python" benchmark "; Penso che dimostra che coroutine sono intrinsecamente più veloci, la differenza principale non si trova a dover passare i valori attraverso una catena di rendimenti.

N Lua Python
-- ----- ------
12: 0.000 0.008
13: 0.000 0.023
14: 0.008 0.055
15: 0.016 0.109
16: 0.031 0.227
17: 0.078 0.469
18: 0.148 0.961
19: 0.305 1.961
20: 0.602 4.000
21: 1.211 8.148
22: 2.430 17.211
23: 4.820 40.094
24: 9.875 94.992








Fonte: lua-users.org
 
Rispondi
#2
interessante...
1)Cos'è sto lua ????
2)in cosa si usa ???siccome confronta l'Unreal Script che si usa nel UDK/Unreal Engine mentre questo ?
3) tradotto con google traduttore ?
 
Rispondi
#3
E' sempre tradotto con google.
Siccome qui si mette a confronto: Lua vs Unreal Script e Lua vs Puthon, già si può dedurre che sia un linguaggio scripting molto semplice, e sembra anche che sia più performante del Python e del Unreal Script.
Essendo un linguaggio scripting come anche Unreal Script etc... si può usare in tutte le applicazioni/giochi/engine e quant'altro che lo supportano.
 
Rispondi
#4
Lua è un linguaggio di scripting, tra i più usati per la programmazione di videogames (per questo lo paragona a unreal script).
Lo hanno usato per molti script in meeting 2, grand theft auto 4, world of warcraft, ecc..
 
Rispondi
#5
informandomi il lua viene definito un linguaggio di programmazione vero e proprio:
http://en.wikipedia.org/wiki/Lua_(programming_language)
 
Rispondi
#6
Con linguaggo di programmazione solitamente si intende linguaggio compilato.
I linguaggi di scripting sono quelli che vengono interpretati (infatti leggendo le prime righe del link che hai postato "Lua is a lightweight multi-paradigm programming language designed as a scripting language").

Tecnicamente il termine "linguaggio di programmazione" integra sia quelli compilati che quelli interpretati, però solitamente lo si usa solo per quelli compilati.

Il principale vantaggio nell'usare un linguaggio di scripting per parte di un videogames è che permette modifiche al codice senza ricompilazione (se il gioco è molto grande richiede molto tempo ricompilare tutto). Grazie a questo vantaggio è anche possibile moddare un gioco visto che la sh non è costretta a rilasciare tutto il codice (rilascia solo la parte che vuole far moddare).

Qui c'è una lista di videogames che usano lua in alcuni script
 
Rispondi
#7
OK ora mi è chiaro...
umhhh guardandone alcuni mi è sembrato che siano stati fatti tutti con altri engine e non UE3...lua è supportato in UE3 ? mi sembra più semplice come strutturazione, anche se simile
 
Rispondi
#8
No, tutti i prodotti di Unreal Engine, ha solo Unreal Script come linguaggio scripting.
 
Rispondi
  


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  qualcono conosce il LUA scripting? daryl 7 2,443 25-10-2012, 10:58 PM
Ultimo messaggio: Skyline
  Python: Guide, Librerie e Tool Utili MickeyCrashRayman 0 1,434 01-02-2012, 05:02 PM
Ultimo messaggio: MickeyCrashRayman
  Lua Riddick 0 1,374 27-12-2010, 02:32 PM
Ultimo messaggio: Riddick
  [Python] Esercizi da svolgere Leux 0 2,521 26-07-2010, 10:15 AM
Ultimo messaggio: Leux
  Python Xav 3 1,430 12-07-2010, 12:34 AM
Ultimo messaggio: Xav
  [Python]Creare una semplice moltiplicazione della tabellina del 4 Riddick 4 2,684 12-06-2010, 04:49 PM
Ultimo messaggio: Riddick
  Creare l'exe di un programma fatto in Python Riddick 0 2,038 11-06-2010, 02:27 AM
Ultimo messaggio: Riddick
  Python-Ogre Riddick 6 1,906 05-06-2010, 08:23 PM
Ultimo messaggio: Riddick
  Panda3D è compatibile con la versione di Python 3.1? Riddick 2 1,085 05-06-2010, 06:26 PM
Ultimo messaggio: Riddick

Vai al forum:


Browsing: 1 Ospite(i)