整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Nginx Lua編程基礎(chǔ)

          ua是一門(mén)腳本動(dòng)態(tài)語(yǔ)言,并不太適合做復(fù)雜業(yè)務(wù)邏輯的程序開(kāi)發(fā),但是,在高并發(fā)場(chǎng)景下,Nginx Lua編程是解決性能問(wèn)題的利器。

          Nginx Lua編程主要的應(yīng)用場(chǎng)景如下:

          • API網(wǎng)關(guān):實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)前置、請(qǐng)求過(guò)濾、API請(qǐng)求聚合、AB測(cè)試、灰度發(fā)布、降級(jí)、監(jiān)控等功能,著名的開(kāi)源網(wǎng)關(guān)Kong就是基于Nginx Lua開(kāi)發(fā)的。
          • 高速緩存:可以對(duì)響應(yīng)內(nèi)容進(jìn)行緩存,減少到后端的請(qǐng)求,從而提升性能。比如,Nginx Lua可以和Java容器、Redis整合,由Java容器進(jìn)行業(yè)務(wù)處理和數(shù)據(jù)緩存,而Nginx負(fù)責(zé)讀緩存并進(jìn)行響應(yīng),從而解決Java容器的性能瓶頸
          • 簡(jiǎn)單的動(dòng)態(tài)Web應(yīng)用:可以完成一些業(yè)務(wù)邏輯處理較少但耗費(fèi)CPU的簡(jiǎn)單應(yīng)用,比如模板頁(yè)面的渲染。一般的Nginx Lua頁(yè)面渲染處理流程為:從Redis獲取業(yè)務(wù)處理結(jié)果數(shù)據(jù),從本地加載XML/HTML頁(yè)面模板,然后進(jìn)行頁(yè)面渲染。
          • 網(wǎng)關(guān)限流:緩存、降級(jí)、限流是解決高并發(fā)的三大利器,Nginx內(nèi)置了令牌限流的算法,但是對(duì)于分布式的限流場(chǎng)景,可以通過(guò)Nginx Lua編程定制自己的限流機(jī)制

          ngx_lua是Nginx的一個(gè)擴(kuò)展模塊,將Lua VM嵌入Nginx,請(qǐng)求時(shí)創(chuàng)建一個(gè)VM,請(qǐng)求結(jié)束時(shí)回收VM,這樣就可以在Nginx內(nèi)部運(yùn)行Lua腳本,使得Nginx變成一個(gè)Web容器。以O(shè)penResty為例,其提供了一些常用的ngx_lua開(kāi)發(fā)模塊:

          • lua-resty-memcached:通過(guò)Lua操作memcache
          • lua-resty-mysql:通過(guò)Lua操作MySQL
          • lua-resty-redis:通過(guò)Lua操作Redis緩存
          • lua-resty-dns:通過(guò)Lua操作DNS域名服務(wù)器
          • lua-resty-limit-traffic:通過(guò)Lua進(jìn)行限流
          • lua-resty-template:通過(guò)Lua進(jìn)行模板渲染
          • lua-resty-jwt:通過(guò)Lua生成jwt
          • lua-resty-kafka:通過(guò)Lua操作kafka

          Lua腳本需要通過(guò)Lua解釋器來(lái)解釋執(zhí)行,除了Lua官方的默認(rèn)解釋器外,目前使用廣泛的Lua解釋器叫做LuaJIT。LuaJIT采用C語(yǔ)言編寫(xiě),被設(shè)計(jì)成全兼容標(biāo)準(zhǔn)Lua 5.1,因此LuaJIT代碼的語(yǔ)法和標(biāo)準(zhǔn)Lua的語(yǔ)法沒(méi)多大區(qū)別。但是LuaJIT的運(yùn)行速度比標(biāo)準(zhǔn)Lua快數(shù)十倍。

          Nginx Lua的執(zhí)行原理

          在OpenResty中,每個(gè)Worker進(jìn)程使用一個(gè)Lua VM,當(dāng)請(qǐng)求被分配到Worker時(shí),將在這個(gè)Lua VM中創(chuàng)建一個(gè)協(xié)程,協(xié)程之間數(shù)據(jù)隔離,每個(gè)協(xié)程都具有獨(dú)立的全局變量。

          ngx_lua是將Lua VM嵌入Nginx,讓Nginx執(zhí)行Lua腳本,并且高并發(fā)、非阻塞地處理各種請(qǐng)求Lua內(nèi)置協(xié)程可以很好地將異步回調(diào)轉(zhuǎn)換成順序調(diào)用的形式。ngx_lua在Lua中進(jìn)行的IO操作都會(huì)委托給Nginx的事件模型,從而實(shí)現(xiàn)非阻塞調(diào)用。開(kāi)發(fā)者可以采用串行的方式編寫(xiě)程序,ngx_lua會(huì)在進(jìn)行阻塞的IO操作時(shí)自動(dòng)中斷,保存上下文,然后將IO操作委托給Nginx事件處理機(jī)制,在IO操作完成后,ngx_lua會(huì)恢復(fù)上下文,程序繼續(xù)執(zhí)行,這些操作對(duì)用戶程序都是透明的。

          每個(gè)Worker進(jìn)程都持有一個(gè)Lua解釋器或LuaJIT實(shí)例,被這個(gè)Worker處理的所有請(qǐng)求共享這個(gè)實(shí)例。每個(gè)請(qǐng)求的context上下文會(huì)被Lua輕量級(jí)的協(xié)程分隔,從而保證每個(gè)請(qǐng)求是獨(dú)立的。

          ngx_lua采用one-coroutine-per-request的處理模型,對(duì)于每個(gè)用戶請(qǐng)求,ngx_lua會(huì)喚醒一個(gè)協(xié)程用于執(zhí)行用戶代碼處理請(qǐng)求,當(dāng)請(qǐng)求處理完成后,這個(gè)協(xié)程會(huì)被銷(xiāo)毀。每個(gè)協(xié)程都有一個(gè)獨(dú)立的全局環(huán)境,繼承于全局共享的、只讀的公共數(shù)據(jù)。所以,被用戶代碼注入全局空間的任何變量都不會(huì)影響其他請(qǐng)求的處理,并且這些變量在請(qǐng)求處理完成后會(huì)被釋放,這樣就保證所有的用戶代碼都運(yùn)行在一個(gè)sandbox(沙箱)中,這個(gè)沙箱與請(qǐng)求具有相同的生命周期。

          得益于Lua協(xié)程的支持,ngx_lua在處理10000個(gè)并發(fā)請(qǐng)求時(shí),只需要很少的內(nèi)存。根據(jù)測(cè)試,ngx_lua處理每個(gè)請(qǐng)求只需要2KB的內(nèi)存,如果使用LuaJIT就會(huì)更少

          Nginx Lua配置指令

          ngx_lua定義的Nginx配置指令大致如下:

          • lua_package_path:配置Lua外部庫(kù)的搜索路徑,搜索的文件類型為.lua。
          • lua_package_cpath:配置Lua外部搜索庫(kù)的搜索路徑,搜索C語(yǔ)言編寫(xiě)的外部庫(kù)文件。
          • init_by_lua:Master進(jìn)程啟動(dòng)時(shí)掛載的Lua代碼塊,常用于導(dǎo)入公共模塊。
          • init_by_lua_file:Master進(jìn)程啟動(dòng)時(shí)掛載的Lua腳本文件。
          • init_worker_by_lua:Worker進(jìn)程啟動(dòng)時(shí)掛載的Lua代碼塊,常用于執(zhí)行一些定時(shí)任務(wù)
          • init_worker_by_lua_file:Worker進(jìn)程啟動(dòng)時(shí)掛載的Lua文件,常用于執(zhí)行一些定時(shí)任務(wù)
          • set_by_lua:類似于rewrite模塊的set指令,將Lua代碼塊的返回結(jié)果設(shè)置在Nginx的變量中。
          • set_by_lua_file:同上,執(zhí)行的是腳本Lua腳本文件。
          • rewrite_by_lua:執(zhí)行在rewrite階段的Lua代碼塊,完成轉(zhuǎn)發(fā)、重定向、緩存等功能。
          • rewrite_by_lua_file:同上,執(zhí)行的是Lua腳本文件。
          • access_by_lua:執(zhí)行在access階段的Lua代碼塊,完成IP準(zhǔn)入、接口權(quán)限等功能。
          • access_by_lua_file:同上,執(zhí)行的是Lua腳本文件。
          • content_by_lua:執(zhí)行在content階段的Lua代碼塊,執(zhí)行結(jié)果將作為請(qǐng)求響應(yīng)的內(nèi)容。
          • content_by_lua_file:同上,執(zhí)行的是Lua腳本文件。
          • content_by_lua_block:content_by_lua的升級(jí)款,在一對(duì)花括號(hào)中編寫(xiě)Lua代碼,而不需要做特殊字符轉(zhuǎn)譯。
          • header_filter_by_lua:響應(yīng)頭部過(guò)濾處理的Lua代碼塊,可以用于添加設(shè)置響應(yīng)頭部信息,如Cookie相關(guān)屬性。
          • body_filter_by_lua:響應(yīng)體過(guò)濾處理的Lua代碼塊,例如加密響應(yīng)體。
          • log_by_lua:異步完成日志記錄的Lua代碼塊,例如既可以在本地記錄日志,也可以記錄到ETL集群。

          ngx_lua配置指令在Nginx的HTTP請(qǐng)求處理階段所處的位置如圖:

          常用配置指令

          • lua_package_path指令:用于設(shè)置".lua"外部庫(kù)的搜索路徑,此指令的上下文為http配置塊,默認(rèn)值為LUA_PATH環(huán)境變量?jī)?nèi)容或者lua編譯的默認(rèn)值。
            • 格式:lua_package_path lua-style-path-str。
            • lua_package_cpath指令:用于設(shè)置Lua的C語(yǔ)言塊外部庫(kù)".so"(Linux)或".dll"(Windows)的搜索路徑,此指令的上下文為http配置塊。
            • 格式:lua_package_cpath lua-style-cpath-str
          http {
            ...
            #設(shè)置“.lua”外部庫(kù)的搜索路徑,此指令的上下文為http配置塊
          	#";;"常用于表示原始的搜索路徑
          	lua_package_path	"/foo/bar/?.lua;/blah/?.lua;;";
          	lua_package_cpath	"/usr/local/openresty/lualib/?/?.so;/usr/local/openresty/lualib/?.so;;";
          }
          

          對(duì)于以上兩個(gè)指令,OpenResty可以在搜索路徑中使用插值變量。例如,可以使用插值變量$prefix或${prefix}獲取虛擬服務(wù)器server的前綴路徑,server的前綴路徑通常在Nginx服務(wù)器啟動(dòng)時(shí)通過(guò)-p PATH命令在指定。

          • init_by_lua指令:只能用于http上下文,運(yùn)行在配置加載階段。當(dāng)Nginx的master進(jìn)程在加載Nginx配置文件時(shí),在全局Lua VM級(jí)別上運(yùn)行由參數(shù)lua-script-str指定的Lua腳本塊。若使用init_by_lua_file指令,后面跟lua文件的路徑( lua_file_path),則在全局Lua VM 級(jí)別上運(yùn)行l(wèi)ua_file_path文件指定的lua腳本。如果Lua腳本的緩存是關(guān)閉的,那么每一次請(qǐng)求都運(yùn)行一次init_by_lua處理程序。

          格式為:init_by_lua lua-script-str。

          • lua_load_cache指令:用于啟用或禁止Lua腳本緩存。可以使用的上下文為http、server、location配置塊。默認(rèn)開(kāi)啟。

          格式為:lua_code_cache on | off

          http {
            ...
          	#項(xiàng)目初始化
            init_by_lua_file	conf/luaScript/initial/loading_config.lua;
            	
            #調(diào)試模式,關(guān)閉lua腳本緩存
            lua_code_cache on;
            ...
          }

          在緩存關(guān)閉的時(shí),set_by_lua_file、content_by_lua_file、access_by_lua_file、content_by_lua_file等指令中引用的Lua腳本都將不會(huì)被緩存,所有的Lua腳本都將從頭開(kāi)始加載。

          • set_by_lua指令:將Lua腳本塊的返回結(jié)果設(shè)置在Nginx變量中。

          格式為:set_by_lua $destVar lua-script-str params

          location /set_by_lua_demo {
          	#set 指令定義兩個(gè)Nginx變量
            set $foo 1;
            set $bar 2;
            			
            #調(diào)用Lua內(nèi)聯(lián)代碼,將結(jié)果放入Nginx變量$sum
            #Lua腳本的含義是,將兩個(gè)輸入?yún)?shù)$foo、$bar累積起來(lái),然后相加的結(jié)果設(shè)置Nginx變量$sum中
            set_by_lua $sum 'return tonumber(ngx.arg[1]) + tonumber(ngx.arg[2])' $foo $bar;
            
            echo "$foo + $bar = $sum";
          }

          運(yùn)行結(jié)果:

          ?  work curl http://localhost/set_by_lua_demo
          1 + 2 = 3
          • access_by_lua指令:執(zhí)行在HTTP請(qǐng)求處理11個(gè)階段的access階段,使用Lua腳本進(jìn)行訪問(wèn)控制。運(yùn)行于access階段的末尾,總是在allow和deny這樣的指令之后運(yùn)行。

          格式為:access_by_lua $destVar lua-script-str

          location /access_demo {
            access_by_lua	'ngx.log(ngx.DEBUG, "remote_addr = "..ngx.var.remote_addr);
            if ngx.var.remote_addr == "192.168.56.121" then
            	return;
            end
            ngx.exit(ngx.HTTP_UNAUTHORIZED);
            ';
            echo "hello world";
          }
            		
          location /access_demo_2 {
            allow "192.168.56.121";
            deny all;
            echo "hello world";
          }

          運(yùn)行結(jié)果:

          ?  work curl http://localhost/access_demo
          <html>
          <head><title>401 Authorization Required</title></head>
          <body bgcolor="white">
          <center><h1>401 Authorization Required</h1></center>
          <hr><center>openresty/1.13.6.2</center>
          </body>
          </html>
          
          #上述案例運(yùn)行日志:
          2022/02/15 10:32:17 [debug] 26293#0: *17 [lua] access_by_lua(nginx-lua-demo.conf:85):1: remote_addr = 127.0.0.1
          2022/02/15 10:32:17 [info] 26293#0: *17 kevent() reported that client 127.0.0.1 closed keepalive connection
          
          ?  work curl http://localhost/access_demo_2
          <html>
          <head><title>403 Forbidden</title></head>
          <body bgcolor="white">
          <center><h1>403 Forbidden</h1></center>
          <hr><center>openresty/1.13.6.2</center>
          </body>
          </html>
          
          #上述案例運(yùn)行日志
          2022/02/15 10:33:11 [error] 26293#0: *18 access forbidden by rule, client: 127.0.0.1, server: localhost, request: "GET /access_demo_2 HTTP/1.1", host: "localhost"
          2022/02/15 10:33:11 [info] 26293#0: *18 kevent() reported that client 127.0.0.1 closed keepalive connection
          • content_by_lua/content_by_lua_block指令:用于設(shè)置執(zhí)行在content階段的Lua代碼塊,執(zhí)行結(jié)果將作為請(qǐng)求響應(yīng)的內(nèi)容。該指令用于location上下文。

          格式為:content_by_lua lua-script-str

          location /errorLog {
            content_by_lua '
              ngx.log(ngx.ERR, "this is an error log ");
            	ngx.say("錯(cuò)誤日志調(diào)用成功");
            ';
          }
            		
          location /infoLog {
          	content_by_lua '
          		ngx.log(ngx.ERR, "this is an info log ");
            	ngx.say("業(yè)務(wù)日志調(diào)用成功");
            ';
          }
          
          location /debugLog {
            content_by_lua '
              ngx.log(ngx.ERR, "this is an debug log ");
            	ngx.say("調(diào)試日志調(diào)用成功");
            ';
          }

          OpenResty v0.9.17版本以后,使用content_by_lua_block指令代替content_by_lua指令,避免對(duì)代碼塊中的字符串進(jìn)行轉(zhuǎn)譯。

          運(yùn)行結(jié)果:

          ?  work curl http://localhost/errorLog
          錯(cuò)誤日志調(diào)用成功
          ?  work curl http://localhost/infoLog 
          業(yè)務(wù)日志調(diào)用成功
          ?  work curl http://localhost/debugLog
          調(diào)試日志調(diào)用成功

          Nginx Lua的內(nèi)置常量和變量

          內(nèi)置變量

          • ngx.arg:類型為L(zhǎng)ua table,ngx.arg.VARIABLE用于獲取ngx_lua配置指令后面的調(diào)用參數(shù)。
          • ngx.var:類型為L(zhǎng)ua table,ngx.var.VARIABLE用于引用某個(gè)Nginx變量。前提是Nginx變量必須提前聲明
          • ngx.ctx:類型為L(zhǎng)ua table,可以用來(lái)訪問(wèn)當(dāng)前請(qǐng)求的Lua上下文數(shù)據(jù),其生存周期與當(dāng)前請(qǐng)求相同
          • ngx.header:類型為L(zhǎng)ua table,用于訪問(wèn)HTTP響應(yīng)頭,可以通過(guò)ngx.header.HEADER形式引用某個(gè)頭
          • ngx.status:用于設(shè)置當(dāng)前請(qǐng)求的HTTP響應(yīng)碼

          內(nèi)置常量

          內(nèi)置常量基本是見(jiàn)名知意的,可以根據(jù)后面的實(shí)戰(zhàn)案例,加深理解。

          核心常量

            • ngx.OK(0)
            • ngx.ERROR(-1)
            • ngx.AGAIN(-2)
            • ngx.DONE(-4)
            • ngx.DECLINED(-5)
            • ngx.nil

          HTTP方法常量

            • ngx.HTTP.GET
            • ngx.HTTP.HEAD
            • ngx.HTTP.PUT
            • ngx.HTTP.POST
            • ngx.HTTP.DELETE
            • ngx.HTTP.OPTIONS
            • ngx.HTTP.MKCOL
            • ngx.HTTP.MOVE
            • ngx.HTTP.PROPFIND
            • ngx.HTTP.PROPPATCH
            • ngx.HTTP.LOCK
            • ngx.HTTP.UNLOCK
            • ngx.HTTP.PATH
            • ngx.HTTP.TRACE

          HTTP狀態(tài)碼常量

            • ngx.HTTP_OK(200)
            • ngx.HTTP_CREATED(201)
            • ngx.HTTP_SPECIAL_RESPONSE(300)
            • ngx.HTTP_MOVED_PERMANENTLY(301)
            • ngx.HTTP_MOVER_TEMPORARILY(302)
            • ngx.HTTP_SEE_OTHER(303)
            • ngx.HTTP_NOT_MODIFIED(304)
            • ngx.HTTP_BAD_REQUEST(400)
            • ngx.HTTP_UNAUTHORIZED(401)
            • ngx.HTTP_FORBIDDEN(403)
            • ngx.HTTP_NOT_FOUND(404)
            • ngx.HTTP_NOT_ALLOWED(405)
            • ngx.HTTP_GONE(410)
            • ngx.HTTP_INTERNAL_SERVER_ERROR(500)

          日志類型常量

            • ngx.STDERR
            • ngx.EMERG
            • ngx.ALERT
            • ngx.CRIT
            • ngx.ERR
            • ngx.WARE
            • ngx.NOTICE
            • ngx.INFO
            • ngx.DEBUG

          Nginx+LUA基礎(chǔ)到此結(jié)束,下一篇開(kāi)始實(shí)戰(zhàn)!并在實(shí)戰(zhàn)中掌握基礎(chǔ)。

          Lapis是一個(gè)為L(zhǎng)ua語(yǔ)言設(shè)計(jì)的Web應(yīng)用開(kāi)發(fā)框架,它主要針對(duì)OpenResty,這是一個(gè)基于Nginx的高性能Web平臺(tái)。Lapis不僅提供了一個(gè)簡(jiǎn)潔而強(qiáng)大的API來(lái)構(gòu)建Web服務(wù),還支持現(xiàn)代Web開(kāi)發(fā)中的多種需求,包括路由、模板、數(shù)據(jù)庫(kù)集成、安全性等。

          核心特性

          1. 高性能

          Lapis利用OpenResty的強(qiáng)大性能,通過(guò)LuaJIT在Nginx內(nèi)部運(yùn)行Lua代碼,實(shí)現(xiàn)了高性能的處理能力。這意味著開(kāi)發(fā)者可以享受到接近C語(yǔ)言級(jí)別的執(zhí)行效率,同時(shí)保持Lua語(yǔ)言的簡(jiǎn)潔性和靈活性。

          2. 異步編程

          Lapis支持Lua協(xié)程,允許開(kāi)發(fā)者編寫(xiě)看起來(lái)是同步的代碼,但實(shí)際上是異步執(zhí)行的。這種方式可以顯著提高應(yīng)用程序的并發(fā)處理能力,同時(shí)避免了回調(diào)地獄,使代碼更加清晰易讀。

          3. 路由和URL匹配

          Lapis提供了一個(gè)靈活的路由系統(tǒng),允許開(kāi)發(fā)者定義各種URL模式,并將其映射到相應(yīng)的處理函數(shù)。這使得URL的設(shè)計(jì)和處理變得簡(jiǎn)單而直觀。

          4. 模板系統(tǒng)

          Lapis內(nèi)置了HTML模板系統(tǒng),支持etlua模板語(yǔ)言,允許開(kāi)發(fā)者以一種聲明式的方式編寫(xiě)HTML頁(yè)面。此外,Lapis的模板系統(tǒng)還提供了HTML構(gòu)建器語(yǔ)法,使得HTML的生成既安全又便捷。

          5. 數(shù)據(jù)庫(kù)集成

          Lapis支持PostgreSQL、MySQL和SQLite等多種數(shù)據(jù)庫(kù),提供了一個(gè)強(qiáng)大的模型層抽象,使得數(shù)據(jù)庫(kù)操作變得簡(jiǎn)單。開(kāi)發(fā)者可以通過(guò)繼承Model類來(lái)創(chuàng)建自己的數(shù)據(jù)庫(kù)模型,并輕松地進(jìn)行數(shù)據(jù)的增刪改查操作。

          6. 安全性

          Lapis提供了CSRF保護(hù)和會(huì)話支持,幫助開(kāi)發(fā)者構(gòu)建更安全的Web應(yīng)用。通過(guò)內(nèi)置的安全特性,可以有效地防止跨站請(qǐng)求偽造等常見(jiàn)的Web安全威脅。


          開(kāi)發(fā)示例

          基礎(chǔ)路由示例

          local lapis = require "lapis"
          local app = lapis.Application()
          
          
          app:match("/", function(self)
            return "Hello world!"
          end)
          
          
          return app

          帶參數(shù)的路由示例

          app:match("/profile/:username", function(self)
            local username = self.params.username
            return "Welcome, " .. username .. "!"
          end)

          使用類定義路由

          local lapis = require "lapis"
          local app = lapis.Application()
          
          
          class extends lapis.Application
            "/": =>
              "Hello world!"
          
          
            ["/profile/:username"]: =>
              local username = @params.username
              "Welcome, " .. username .. "!"
          
          
          return app

          數(shù)據(jù)庫(kù)模型示例

          local Model = require("lapis.db.model").Model
          
          
          class Users extends Model
          
          
          local app = lapis.Application()
          
          
          app:get("/users", function(self)
            local users = Users:select("*")
            return { render = true, users = users }
          end)
          
          
          return app

          模板渲染示例

          local lapis = require "lapis"
          local app = lapis.Application()
          
          
          app:match("/", function(self)
            return self:render("index")
          end)
          
          
          return app

          結(jié)語(yǔ)

          Lapis是一個(gè)功能強(qiáng)大且高效的Web開(kāi)發(fā)框架,它結(jié)合了Lua語(yǔ)言的靈活性和OpenResty的性能優(yōu)勢(shì)。無(wú)論是構(gòu)建簡(jiǎn)單的Web服務(wù)還是復(fù)雜的Web應(yīng)用,Lapis都是一個(gè)值得考慮的選擇。隨著社區(qū)的不斷壯大和生態(tài)系統(tǒng)的完善,Lapis有望成為L(zhǎng)ua Web開(kāi)發(fā)領(lǐng)域的重要力量。

          如你想踏入游戲開(kāi)發(fā)或是游戲設(shè)計(jì),而仍不確定自己想要什么,或是需要什么,這里有幾款容易入手的游戲引擎可以參考。文內(nèi)引擎的挑選標(biāo)準(zhǔn)為功能完整,能夠承擔(dān)一款遊戲從開(kāi)發(fā)初期到最終釋出,按字母順序排列。

          App Game Kit

          The Game Creators出品

          支持平臺(tái):Windows,Linux, Mac OSX, iOS, Android, web browser, Raspberry Pi, SteamVR

          語(yǔ)言:C++、AppGameKit Script

          App Game Kit簡(jiǎn)單易用易學(xué)習(xí)的2D/3D游戲開(kāi)發(fā)工具包,擁有完整的游戲引擎功能,可快速建立內(nèi)容發(fā)布到移動(dòng)平臺(tái),極適合個(gè)人、興趣、學(xué)校教育方面使用。

          特點(diǎn):輕量化、更新極快速、多平臺(tái)編輯器支持

          授權(quán):一次性支付.99,免版權(quán)費(fèi)分成。一些擴(kuò)充功能包另外購(gòu)買(mǎi)。

          Game Blender

          BlenderFoundation維護(hù)

          支持平臺(tái):Windows, Mac OSX, Linux

          語(yǔ)言:Python

          Blender是一款免費(fèi)開(kāi)源的3D內(nèi)容創(chuàng)作套件。包括建模、uv展開(kāi)、材質(zhì)繪制、動(dòng)畫(huà)制作、合成、流體/煙霧、粒子、渲染系統(tǒng)等功能,也包含一個(gè)游戲引擎。Game Blender有圖形邏輯編輯器,可定義交互行為而無(wú)須編程,也擁有各種引擎基本功能,訂制、擴(kuò)充能力極強(qiáng)。

          特點(diǎn):開(kāi)源、更新極快速、真正的Allin One、強(qiáng)大的擴(kuò)展性、多平臺(tái)編輯器支持。

          授權(quán):GPL3許可證。

          CopperCube 5

          Ambiera出品

          支持平臺(tái):Windows,Mac OSX, web browser, Android, Flash

          語(yǔ)言:C++,Javascript

          CopperCube一款簡(jiǎn)易但完整的游戲引擎,擁有完整的編輯工具以及游戲預(yù)設(shè),可以利用內(nèi)建的功能建模并完成一款簡(jiǎn)單的游戲,或是快速制作大型游戲的原型用以評(píng)估項(xiàng)目。

          特點(diǎn):快速上手、普通更新速度、支持中文。

          授權(quán):一次性支付.99,免版權(quán)費(fèi)分成。

          外加9.99,獲得一些額外功能,獲得完整C++原碼。

          CryEngine V

          Crytek公司出品

          支持平臺(tái):Windows,Linux, PlayStation 4, Xbox One, Oculus Rift, HTC Vive, OSVR 與 PlayStation VR

          語(yǔ)言:C++、C#、Schematyc

          CryEngine V是一套完整強(qiáng)大的游戲開(kāi)發(fā)工具,擁有明確的工具體系,以及完成一款大型游戲的完善功能。 擁有極其優(yōu)化的代碼和高度整合的后期處理效果,能在性能與畫(huà)面呈現(xiàn)上取得極佳的平衡效果。

          特點(diǎn):完整的開(kāi)發(fā)生態(tài)鏈、更新快速、完全免費(fèi)、穩(wěn)定的大型場(chǎng)景乘載。

          授權(quán):任何平臺(tái)在游戲及影視領(lǐng)域使用免使用費(fèi),免版權(quán)費(fèi)。可在任何階段選擇性支付任何價(jià)格(PayWhat You Want授權(quán))。

          Esenthel Engine

          Esenthel/Grzegorz Slazinski出品

          支持平臺(tái):Windows,Windows Phone, Xbox, Mac OS, iOS, Android, Linux, Web

          語(yǔ)言:C++

          Esenthel是一款功能完整的商業(yè)游戲引擎,擁有多平臺(tái)部屬及完整的多人聯(lián)機(jī)特性。

          特點(diǎn):完整工具鏈、普通更新速度、帶原碼的多人模板、多平臺(tái)編輯器支持。

          授權(quán):免費(fèi)試用。高級(jí)功能訂閱每月.40或每年4。完整原碼每年訂閱8。

          Game Guru

          The Game Creators出品

          支持平臺(tái):Windows

          語(yǔ)言:Lua

          Game Guru是一款簡(jiǎn)易的游戲引擎,擁有完整的編輯工具以及游戲預(yù)設(shè),可以利用內(nèi)建的功能完成一款簡(jiǎn)單的游戲。能購(gòu)買(mǎi)AppGame Kit的擴(kuò)充包將兩者整合。

          特點(diǎn):快速上手、更新較快、內(nèi)置游戲模塊。

          授權(quán):一次性支付.99,免版權(quán)費(fèi)抽成。

          Gamestudio

          Conitec Datasystems出品

          支持平臺(tái):Windows

          語(yǔ)言:C++、C#、Delphi、Lite-C

          Gamestudio或稱3D Gamestudio是一款老牌的游戲引擎,包含完整的渲染、優(yōu)化、粒子、物理碰撞、2D引擎、音效引擎、網(wǎng)絡(luò)、和游戲模塊等等,可以應(yīng)用于各種游戲、應(yīng)用程序創(chuàng)建。

          特點(diǎn):完整的工具鏈和SDK、緩慢的更新速度、穩(wěn)定、強(qiáng)大的可擴(kuò)充性、擁有龐大的小區(qū)貢獻(xiàn)和幫助。

          授權(quán):免費(fèi)版,免版權(quán)費(fèi)分成,需開(kāi)源自己的原碼/腳本。

          加強(qiáng)版,一次性支付,功能同免費(fèi)版,外加打包、編譯、加密功能,以及插件/引擎SDK。

          商業(yè)版,一次性支付9,擁有中大型規(guī)模游戲所需大部分功能。

          專業(yè)版,一次性支付9,擁有大型游戲所需所有功能。

          Hero Engine

          IdeaFabrik出品

          支持平臺(tái):Windows

          語(yǔ)言:C++,C#, HeroScript Language

          Hero Engine是一套擁有完整開(kāi)發(fā)鏈的游戲開(kāi)發(fā)工具,雖然各種游戲皆能開(kāi)發(fā),但對(duì)于客路端和服務(wù)器架構(gòu)皆集成到開(kāi)發(fā)流程中,是非常適合用來(lái)開(kāi)發(fā)MMO的游戲引擎。

          特點(diǎn):完整的開(kāi)發(fā)生態(tài)鏈、更新快速、超大場(chǎng)景建立、網(wǎng)絡(luò)游戲特化、百人以上開(kāi)發(fā)團(tuán)隊(duì)在線協(xié)作解決方案、官方服務(wù)器建設(shè)解決方案,大幅節(jié)省開(kāi)發(fā)成本支出。

          授權(quán):免費(fèi)方案,免費(fèi)使用引擎。

          入門(mén)方案,每年.95,兩名使用者,可于測(cè)試階段免費(fèi)使用官方服務(wù)器資源,可于官方平臺(tái)免費(fèi)使用Awesomium、RAD Game Tools、SpeedTree、DPVS Umbra、FMOD、FaceGen等第三方軟件和插件。

          基本、標(biāo)準(zhǔn)、專業(yè)、高級(jí)方案?jìng)€(gè)別為每年9.95、9.95、9.95、9.95,對(duì)應(yīng)5、15、50、100名使用者。

          終生方案95.95,300名使用者,包含源碼折扣。

          訂閱入門(mén)以上方案在Alpha、Beta、最終release階段可由官方協(xié)助尋找、架設(shè)服務(wù)器,此階段由官方吸收成本,最終上線后收入分成30%。

          jMonkey Game Engine

          The jME Core團(tuán)隊(duì)出品

          支持平臺(tái):Windows,OSX, Linux, Android, iOS, Oculus Rift

          語(yǔ)言:Java

          jMonkeyEngine是一款基于Java開(kāi)發(fā)的游戲引擎,擁有跨平臺(tái)、易學(xué)的特性,可以在任何支持的IDE環(huán)境下開(kāi)發(fā),只要擁有Java技能就能夠開(kāi)發(fā)任何一種3D游戲。

          特點(diǎn):開(kāi)源、更新較慢、跨平臺(tái)。

          授權(quán):BSD許可證

          Leadwerks

          Leadwerks公司出品

          支持平臺(tái):Windows,Linux, SteamOS, HTC Vive, Oculus Rift, OSVR

          語(yǔ)言:C++、Lua、Flowgraph

          Leadwerks是一個(gè)基于OpenGL,3D的游戲引擎。 它具有延遲照明系統(tǒng),屏幕空間環(huán)境遮擋,模擬實(shí)時(shí)全局照明,高級(jí)著色器,支持巨大的地形,新的植被系統(tǒng),內(nèi)置的UI設(shè)計(jì)工具,集成的LUA腳本編輯器等等。

          特點(diǎn):輕量化、普通更新速度、高度訂制化、社群活躍、多平臺(tái)編輯器支持。

          授權(quán):一次性支付.99,免版權(quán)費(fèi)。C++原代碼另外加.99

          Lumberyard

          Amazone出品

          支持平臺(tái):Windows,Xbox One, PlayStation, iOS, Android, Oculus Rift, HTC Vive, OSVR, PlayStationVR

          語(yǔ)言:C++、Lua、Flowgraph

          Lumberyard是Amazone公司基于CryEngine 3與自家Amazon Web Services平臺(tái)開(kāi)發(fā)的免費(fèi)跨平臺(tái)游戲引擎,擁有CryEngine 3大部分的圖形技術(shù)外,其重構(gòu)了引擎的網(wǎng)絡(luò)代碼,能夠輕易集成AWS服務(wù)做到大小規(guī)模在線游戲。

          特點(diǎn):完整的開(kāi)發(fā)生態(tài)鏈、更新較快、穩(wěn)定的大型場(chǎng)景乘載、網(wǎng)絡(luò)游戲特化。

          授權(quán):免費(fèi)使用,免版權(quán)費(fèi)分成。若無(wú)自己的網(wǎng)絡(luò)設(shè)備,限制僅能集成、租用AWS網(wǎng)絡(luò)服務(wù)。

          Neoaxis

          NeoAxis Group Ltd公司出品

          支持平臺(tái):Windows,Mac OSX

          語(yǔ)言:C#

          擁有開(kāi)發(fā)游戲的完整功能,內(nèi)置physX,內(nèi)置網(wǎng)絡(luò)支持和尋路組件,內(nèi)置UI系統(tǒng)。擁有功能完善的SDK、資源導(dǎo)入流程。

          特點(diǎn):輕量、功能完整、更新較慢。

          授權(quán):SDK免費(fèi)使用,免版權(quán)費(fèi)抽成。專業(yè)授權(quán)每人5,獲得編輯器、資源導(dǎo)入、定型、對(duì)象、網(wǎng)絡(luò)等代碼。完整授權(quán)每人95,獲得所有引擎代碼。

          Panda 3D/ RenderPipeline

          Carnegie Mellon University

          支持平臺(tái):Windows,Mac OSX, Linux, FreeBSD

          語(yǔ)言:C++、Python

          Panda3D是一款開(kāi)源的游戲/渲染引擎,包括有物理、粒子、GUI、AI、高級(jí)著色器等特性。RenderPipeline為Panda3D的延伸項(xiàng)目,為引擎導(dǎo)入了PBR渲染、延遲渲染、高級(jí)后處理特效、TOD系統(tǒng)、插件系統(tǒng)等。

          特點(diǎn):開(kāi)源項(xiàng)目、普通更新速度、WaltDisney Imagineering加持。

          授權(quán):訂制的BSD許可證。

          S2Engine HD

          Profenix Studio, Fabio Di Paola個(gè)人出品

          支持平臺(tái):Windows

          語(yǔ)言:C++,GameMachine, S2Engine HD script

          S2Engine HD為一款由個(gè)人制作/維護(hù)的游戲引擎,擁有整合好的高級(jí)畫(huà)面效果處理系統(tǒng)、類C的腳本語(yǔ)言、可視化腳本/編程模塊、音頻、物理、UI編輯器等,可以快速制作出美觀的游戲。

          特點(diǎn):快速上手、普通更新速度、完整的游戲制作流程、對(duì)中型以上團(tuán)隊(duì)較不友善。

          授權(quán):一次性支付.99,免版權(quán)費(fèi)分成。

          Serious Engine

          Croteam出品

          支持平臺(tái):Windows,Xbox, Linux, Mac OSX

          語(yǔ)言:C++

          Serious Engine目前最高版本為Serious Engine 4,可創(chuàng)建大型開(kāi)放世界,渲染大量敵人,擁有逼真的后處理效果。其開(kāi)源版本為1.10,可取得UI工具、建模工具、完整的游戲引擎原碼和編譯工具。

          特點(diǎn):開(kāi)源、停止更新

          授權(quán):GPL-2.0許可證。

          Shive3D

          ShiVaTech出品

          支持平臺(tái):Windows,Mac OSX, Linux, Android, Blackberry, iOS, PlayStation 4, PlayStation3, Xbox360, Xbox One, Vita, Wii, Windows Phone, 網(wǎng)頁(yè)瀏覽器

          語(yǔ)言:C++、Lua

          Shive3D是擁有完整生態(tài)及工具鏈的一款引擎,對(duì)移動(dòng)設(shè)備支持較好,曾經(jīng)是移動(dòng)設(shè)備游戲的首選引擎之一。近年來(lái)由于引擎老化創(chuàng)新不足,用戶已大幅流失,但仍不失為一個(gè)輕便好用的引擎。

          特點(diǎn):輕量化、緩慢更新速度、移動(dòng)設(shè)備支持良好。

          授權(quán):Web版可使用所有編輯器功能,可部屬到網(wǎng)頁(yè),免版權(quán)費(fèi),鎖定部分引擎特性。

          Basic版一次性支付0,可部屬到所有平臺(tái),其余限制與Web版相同。

          Advanced版一次性支付00,可使用所有高級(jí)功能。

          Source Engine/Source SDK

          Valve公司出品

          支持平臺(tái):Windows,macOS, Linux, Android

          語(yǔ)言:C++(底層)、Squirrel

          歷久彌新的一款引擎/模塊編輯器,擁有許多模塊及小區(qū)資源。

          特點(diǎn):老經(jīng)典

          授權(quán):免費(fèi),擁有任一款Source引擎開(kāi)發(fā)的游戲即可使用。

          Stingray

          Autodesk出品

          支持平臺(tái):Windows,PlayStation, Xbox, Android, iOS, Oculus Rift, HTC Vive, OSVR, Playstation VR

          語(yǔ)言:Lua

          Stingray為一款與Autodesk建模及IBM軟件高度集成的游戲/渲染引擎,并完美整合旗下的AutodeskGameware產(chǎn)品線,以及得益于數(shù)度重構(gòu)而擁有干凈整齊的底層模塊,適合程序從頭建立游戲/應(yīng)用程序內(nèi)容。

          特點(diǎn):干凈、普通更新速度、與Autodesk建模工具景密結(jié)合、快速建立每訴內(nèi)容、快速建立動(dòng)畫(huà)內(nèi)容。

          授權(quán):每月或每年0,與Maya LT捆綁訂閱,免版權(quán)費(fèi)抽成。

          源碼另議。

          Tombstone Engine (C4Engine)

          Terathon Software公司出品

          支持平臺(tái):PlayStation4, Windows, Mac OSX, Linux, iOS

          語(yǔ)言:C++、OpenDDL、視覺(jué)腳本編輯器

          Tombstone Engin是功能完整,開(kāi)發(fā)速度快的游戲引擎,以前的C4引擎。擁有完整SDK、素材導(dǎo)入、UI編輯器、腳本編輯器等,可快速開(kāi)發(fā)出可玩的FPS游戲。

          特點(diǎn):恐怖游戲特化、普通更新速度

          授權(quán):?jiǎn)我皇跈?quán),一次性支付5,包含完整原碼、工具、示例游戲,無(wú)游戲、軟件數(shù)量限制,無(wú)版權(quán)費(fèi)抽成。

          Torque3D

          GarageGames公司出品

          支持平臺(tái):Windows,Mac OSX, Linux

          語(yǔ)言:C++

          Torque是一款老牌的開(kāi)放原始碼引擎,集Collada、PhysX等庫(kù),擁有完整的生態(tài)鏈,穩(wěn)定、易于擴(kuò)充。

          特點(diǎn):老牌、開(kāi)源、更新慢。

          授權(quán):MIT許可證。

          Unigine 2

          支持平臺(tái):Windows,Mac OSX, Linux, Oculus Rift, HTC Vive, OSVR

          語(yǔ)言:C++、C#、UnigineScript

          Unigine為一款實(shí)時(shí)的3D互動(dòng)解決方案,擁有適合中小型團(tuán)隊(duì)制作游戲/應(yīng)用程序的版本,以及仿真特化的高級(jí)版本,可以做到星球級(jí)別的大地形、大氣海洋模擬等,在專業(yè)應(yīng)用、教育訓(xùn)練、影視等產(chǎn)業(yè)擁有極高的優(yōu)勢(shì)。

          特點(diǎn):專業(yè)應(yīng)用、更新較快、較多的官方示范模板

          授權(quán):基礎(chǔ)單人,一次性支付95,免版權(quán)費(fèi)分成。基礎(chǔ)團(tuán)隊(duì),一次性支付95,最多十人。

          專業(yè)版按座位定價(jià)。

          仿真版按需求定價(jià)。

          Unity 5

          Unity Technologies公司出品

          支持平臺(tái):Windows,Mac OSX, Linus, Android, BlackBerry, iOS, PlayStation 3, PlayStation 4,PlayStation Vita, Unity Web Player, Wii, Wii U, Windows Phone 8, Xbox 360, XboxOne還有其他以前的和未來(lái)的所有平臺(tái)

          語(yǔ)言:C#、C++(底層)、UnityScript(JavaScript)

          家喻戶曉,擁有世界上最大的開(kāi)發(fā)鏈和社群、用戶、資源,不知道自己想做什么時(shí)第一個(gè)上手。

          特點(diǎn):完整的開(kāi)發(fā)生態(tài)鏈、更新極快速、世界最多人使用以及與這個(gè)稱號(hào)相應(yīng)的海量資源、移動(dòng)設(shè)備支持良好、多平臺(tái)編輯器支持。

          授權(quán):個(gè)人或小公司限制版本免費(fèi),收入需低于0,000

          Plus版擁有完整功能,每人每月訂閱,收入需低于0,000

          Pro版擁有完整功能,每人每月訂閱5,無(wú)限制使用。

          Unreal Engine 4

          Epic Games公司出品

          支持平臺(tái):Windows,macOS, Linux, SteamOS, HTML5, iOS, Android, Nintendo Switch, PlayStation 4,Xbox One 與virtual reality (包含但不限于SteamVR/HTCVive, Oculus Rift, PlayStation VR, Google Daydream, OSVR 與 Samsung Gear VR)

          語(yǔ)言:C++、Blueprint

          Unreal Engine 4是一套完整強(qiáng)大的游戲開(kāi)發(fā)工具,擁有明確的工具體系,以及完成一款大型游戲的完善功能。 擁有令人屏息的畫(huà)面以及極度靈活的腳本系統(tǒng)。從2D手機(jī)游戲到游戲機(jī)臺(tái)到VR,UE4為您提供開(kāi)始,創(chuàng)建和發(fā)布游戲所需的一切。

          特點(diǎn):完整的開(kāi)發(fā)生態(tài)鏈、更新極快速、擁有龐大的小區(qū)貢獻(xiàn)和錯(cuò)誤修復(fù)、擁有龐大的市場(chǎng)和教學(xué)資源、穩(wěn)定的大型場(chǎng)景乘載、多平臺(tái)編輯器支持。

          授權(quán):免費(fèi)使用,在游戲或程序推送以后,每個(gè)季度收入達(dá)到,000以后須支付總收入的5%予Epic公司。

          Wave Engine 2

          Wave Engine團(tuán)隊(duì)維護(hù)

          支持平臺(tái):Windows,Linux, Mac OSX, SteamOS, Xbox, iOS, Android, Oculus Rift, Hololens

          語(yǔ)言:C#

          Wave engine是一款基于.NET的開(kāi)源跨平臺(tái)2D/3D游戲開(kāi)發(fā)工具,內(nèi)置有各種游戲所需的完整模塊,以及活潑的開(kāi)發(fā)者社群,能夠獲得各種資源及解決問(wèn)題。

          特點(diǎn):開(kāi)源、更新較快、容易學(xué)習(xí)

          授權(quán):訂制的開(kāi)源授權(quán),唯一限制為所開(kāi)發(fā)產(chǎn)品激活時(shí)需標(biāo)明Wave標(biāo)志。

          千萬(wàn)記得,承載游戲的是引擎,但完成游戲的是人的手。

          記得關(guān)注小編哦

          文章來(lái)源引擎世界網(wǎng)。

          作者:我叫大春天。


          主站蜘蛛池模板: 日本免费一区二区久久人人澡| 国产精品一区二区av不卡| 亚洲AV无码一区二区三区在线 | 亚洲av无码一区二区三区天堂古代 | 国产福利电影一区二区三区,免费久久久久久久精 | 国产福利一区二区| 国产av福利一区二区三巨| 国产另类TS人妖一区二区| 亚洲视频一区二区三区| 免费看无码自慰一区二区| 精品国产日韩亚洲一区| 日本午夜精品一区二区三区电影| 亚洲一区AV无码少妇电影| 一区国严二区亚洲三区| 无码精品人妻一区二区三区中| 无码国产精品一区二区免费I6| 亚洲成av人片一区二区三区| 久久精品国产第一区二区三区| 夜夜高潮夜夜爽夜夜爱爱一区| 国产日韩一区二区三免费高清| 99久久精品日本一区二区免费 | 不卡无码人妻一区三区音频| 91视频一区二区| 一区二区三区四区在线观看视频| 亚洲成AV人片一区二区| 国产日韩精品一区二区在线观看 | 99久久精品国产一区二区成人| 无码人妻一区二区三区av| 国产无套精品一区二区| 国产日韩精品一区二区在线观看 | 无码人妻精品一区二区三区蜜桃| 精品一区二区AV天堂| 色狠狠一区二区三区香蕉| 视频一区视频二区制服丝袜| 2021国产精品一区二区在线| 精品久久久久一区二区三区| 久久人妻无码一区二区| 日韩国产精品无码一区二区三区| 一区五十路在线中出| 亚洲无码一区二区三区| 无码少妇一区二区|