CSLight研究院之与uLua的效率对比(三)
在脚本中调用Unity自身的方法,比如Resource.Load、 Instantiate 、uLua效率要高一些。
但是如果处理脚本与C#之间的来回调用,那么CSLight效率更高一些。
测试到这里,我觉得无论你用uLua还是CSLight都可以进行Unity的热更新,因为它俩效率差不多呵呵。就看你的个人喜好了!
测试代码比较丑,不过能说明问题,因为 C# 的代码和 CSLight的代码完全一样,所以这里我只贴C#和ulua的代码。
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
using
UnityEngine
;
using
System
.
Collections
;
using
System
.
Collections
.
Generic
;
public
class
UIMain
{
private
static
int
SpriteCount
=
100
;
private
static
List
<
UISprite
>
spriteList
;
// Use this for initialization
static
public
void
Start
(
string
root
)
{
spriteList
=
new
List
<
UISprite
>
(
)
;
Transform
rootUI
=
GameObject
.
Find
(
root
)
.
transform
;
GameObject
yusongPrefab
=
Resources
.
Load
(
"yusong"
)
as
GameObject
;
GameObject
ruoruoPrefab
=
Resources
.
Load
(
"ruoruo"
)
as
GameObject
;
GameObject
yusongPrefab1
=
Resources
.
Load
(
"yusong1"
)
as
GameObject
;
GameObject
ruoruoPrefab1
=
Resources
.
Load
(
"ruoruo1"
)
as
GameObject
;
for
(
int
i
=
0
;
i
<
SpriteCount
;
i
++
)
{
GameObject
go
=
Object
.
Instantiate
(
yusongPrefab
)
as
GameObject
;
go
.
transform
.
parent
=
rootUI
;
go
.
transform
.
localPosition
=
Vector3
.
zero
;
go
.
transform
.
localScale
=
Vector3
.
one
;
UISprite
sprite
=
go
.
GetComponent
(
"UISprite"
)
as
UISprite
;
sprite
.
depth
=
Random
.
Range
(
0
,
SpriteCount
)
;
spriteList
.
Add
(
sprite
)
;
go
=
Object
.
Instantiate
(
ruoruoPrefab
)
as
GameObject
;
go
.
transform
.
parent
=
rootUI
;
go
.
transform
.
localPosition
=
Vector3
.
zero
;
go
.
transform
.
localScale
=
Vector3
.
one
;
sprite
=
go
.
GetComponent
(
"UISprite"
)
as
UISprite
;
sprite
.
depth
=
Random
.
Range
(
0
,
SpriteCount
)
;
spriteList
.
Add
(
sprite
)
;
go
=
Object
.
Instantiate
(
yusongPrefab1
)
as
GameObject
;
go
.
transform
.
parent
=
rootUI
;
go
.
transform
.
localPosition
=
Vector3
.
zero
;
go
.
transform
.
localScale
=
Vector3
.
one
;
sprite
=
go
.
GetComponent
(
"UISprite"
)
as
UISprite
;
sprite
.
depth
=
Random
.
Range
(
0
,
SpriteCount
)
;
spriteList
.
Add
(
sprite
)
;
go
=
Object
.
Instantiate
(
ruoruoPrefab1
)
as
GameObject
;
go
.
transform
.
parent
=
rootUI
;
go
.
transform
.
localPosition
=
Vector3
.
zero
;
go
.
transform
.
localScale
=
Vector3
.
one
;
sprite
=
go
.
GetComponent
(
"UISprite"
)
as
UISprite
;
sprite
.
depth
=
Random
.
Range
(
0
,
SpriteCount
)
;
spriteList
.
Add
(
sprite
)
;
}
}
static
public
void
Move
(
)
{
for
(
int
i
=
1
;
i
<
spriteList
.
Count
;
i
++
)
{
UISprite
sprite
=
spriteList
[
i
]
;
Vector3
next
=
new
Vector3
(
Random
.
Range
(
-
400
,
400
)
,
Random
.
Range
(
-
260
,
260
)
,
0
)
;
TweenPosition
position
=
TweenPosition
.
Begin
(
sprite
.
gameObject
,
1
,
next
)
;
}
Vector3
firstNext
=
new
Vector3
(
Random
.
Range
(
-
400
,
400
)
,
Random
.
Range
(
-
260
,
260
)
,
0
)
;
TweenPosition
firstPosition
=
TweenPosition
.
Begin
(
spriteList
[
0
]
.
gameObject
,
1
,
firstNext
)
;
UIEventCommon
.
EventMove
(
firstPosition
)
;
}
}
|
uLua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
luanet
.
load_assembly
(
'UnityEngine'
)
GameObject
=
luanet
.
import_type
(
'UnityEngine.GameObject'
)
Transform
=
luanet
.
import_type
(
'UnityEngine.Transform'
)
Resources
=
luanet
.
import_type
(
'UnityEngine.Resources'
)
Vector3
=
luanet
.
import_type
(
'UnityEngine.Vector3'
)
Random
=
luanet
.
import_type
(
'UnityEngine.Random'
)
UISprite
=
luanet
.
import_type
(
'UISprite'
)
TweenPosition
=
luanet
.
import_type
(
'TweenPosition'
)
UIEventCommon
=
luanet
.
import_type
(
'UIEventCommon'
)
local
SpriteCount
=
400
local
myData
=
{
}
function
Start
(
name
)
local
go
=
GameObject
.
Find
(
name
)
local
yusongPrefab
=
Resources
.
Load
(
"yusong"
)
local
ruoruoPrefab
=
Resources
.
Load
(
"ruoruo"
)
;
local
yusongPrefab1
=
Resources
.
Load
(
"yusong1"
)
;
local
ruoruoPrefab1
=
Resources
.
Load
(
"ruoruo1"
)
;
for
a
=
0
,
SpriteCount
,
4
do
local
go
=
GameObject
.
Instantiate
(
yusongPrefab
)
;
go
.
transform
.
parent
=
rootUI
;
go
.
transform
.
localPosition
=
Vector3
.
zero
;
go
.
transform
.
localScale
=
Vector3
.
one
;
local
sprite
=
go
:
GetComponent
(
'UISprite'
)
;
sprite
.
depth
=
Random
.
Range
(
0
,
SpriteCount
)
;
myData
[
a
]
=
sprite
;
local
go
=
GameObject
.
Instantiate
(
ruoruoPrefab
)
;
go
.
transform
.
parent
=
rootUI
;
go
.
transform
.
localPosition
=
Vector3
.
zero
;
go
.
transform
.
localScale
=
Vector3
.
one
;
local
sprite
=
go
:
GetComponent
(
'UISprite'
)
;
sprite
.
depth
=
Random
.
Range
(
0
,
SpriteCount
)
;
myData
[
a
+
1
]
=
sprite
;
local
go
=
GameObject
.
Instantiate
(
yusongPrefab1
)
;
go
.
transform
.
parent
=
rootUI
;
go
.
transform
.
localPosition
=
Vector3
.
zero
;
go
.
transform
.
localScale
=
Vector3
.
one
;
local
sprite
=
go
:
GetComponent
(
'UISprite'
)
;
sprite
.
depth
=
Random
.
Range
(
0
,
SpriteCount
)
;
myData
[
a
+
2
]
=
sprite
;
local
go
=
GameObject
.
Instantiate
(
ruoruoPrefab1
)
;
go
.
transform
.
parent
=
rootUI
;
go
.
transform
.
localPosition
=
Vector3
.
zero
;
go
.
transform
.
localScale
=
Vector3
.
one
;
local
sprite
=
go
:
GetComponent
(
'UISprite'
)
;
sprite
.
depth
=
Random
.
Range
(
0
,
SpriteCount
)
;
myData
[
a
+
3
]
=
sprite
;
end
end
function
Move
(
)
for
key
,
value
in
pairs
(
myData
)
do
local
sprite
=
value
local
next
=
Vector3
(
Random
.
Range
(
-
400
,
400
)
,
Random
.
Range
(
-
260
,
260
)
,
0
)
;
TweenPosition
.
Begin
(
sprite
.
gameObject
,
1
,
next
)
;
end
local
firstNext
=
Vector3
(
Random
.
Range
(
-
400
,
400
)
,
Random
.
Range
(
-
260
,
260
)
,
0
)
;
local
firstPosition
=
TweenPosition
.
Begin
(
myData
[
0
]
.
gameObject
,
1
,
firstNext
)
;
UIEventCommon
.
EventMove
(
firstPosition
)
;
end
|
UICommon.cs 测试入口脚本,为了公平我分别把这个脚本挂在了三个场景中。每次切场景Unity会自动施放内存,我会根据场景名来动态初始化脚本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
using
UnityEngine
;
using
System
.
Collections
;
using
System
.
Collections
.
Generic
;
using
System
;
using
LuaInterface
;
public
class
UICommon
:
MonoBehaviour
{
static
public
LuaState
luaState
;
private
float
InitTime
;
void
Start
(
)
{
float
time
=
Time
.
realtimeSinceStartup
;
if
(
Application
.
loadedLevel
==
0
)
{
//C# DLL方式加载
CUIMain
.
Start
(
name
)
;
CUIMain
.
Move
(
)
;
}
else
if
(
Application
.
loadedLevel
==
1
)
{
//CSLight方式加载
ScriptMgr
.
Instance
.
LoadProject
(
new
string
[
]
{
"UIMain"
}
)
;
ScriptMgr
.
Instance
.
Execute
(
"UIMain.Start(\""
+
name
+
"\");"
)
;
ScriptMgr
.
Instance
.
Execute
(
"UIMain.Move();"
)
;
}
else
{
//uLua方式加载
TextAsset
scriptFile
=
Resources
.
Load
<
TextAsset
>
(
"UIMain.lua"
)
;
luaState
=
new
LuaState
(
)
;
luaState
.
DoString
(
scriptFile
.
text
)
;
LuaFunction
f
=
luaState
.
GetFunction
(
"Start"
)
;
f
.
Call
(
name
)
;
f
=
luaState
.
GetFunction
(
"Move"
)
;
f
.
Call
(
)
;
}
InitTime
=
Time
.
realtimeSinceStartup
-
time
;
}
void
OnGUI
(
)
{
GUI
.
color
=
Color
.
red
;
if
(
GUILayout
.
Button
(
"CS加载"
,
GUILayout
.
Width
(
100
)
,
GUILayout
.
Height
(
100
)
)
)
{
Application
.
LoadLevel
(
0
)
;
}
if
(
GUILayout
.
Button
(
"CSLight加载"
,
GUILayout
.
Width
(
100
)
,
GUILayout
.
Height
(
100
)
)
)
{
Application
.
LoadLevel
(
1
)
;
}
if
(
GUILayout
.
Button
(
"uLua加载"
,
GUILayout
.
Width
(
100
)
,
GUILayout
.
Height
(
100
)
)
)
{
Application
.
LoadLevel
(
2
)
;
}
GUILayout
.
Label
(
"加载时间 :"
+
InitTime
)
;
}
}
|
UIEventCommon.cs 用来测试脚本与C#之间的回调,这里每一秒会回调一次。
扫描二维码关注公众号,回复:
1743675 查看本文章
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
using
UnityEngine
;
using
System
.
Collections
;
using
LuaInterface
;
public
class
UIEventCommon
{
static
public
void
EventMove
(
TweenPosition
tweenPostion
)
{
EventDelegate
.
Add
(
tweenPostion
.
onFinished
,
delegate
(
)
{
if
(
Application
.
loadedLevel
==
0
)
CUIMain
.
Move
(
)
;
else
if
(
Application
.
loadedLevel
==
1
)
ScriptMgr
.
Instance
.
Execute
(
"UIMain.Move();"
)
;
else
{
LuaFunction
f
=
UICommon
.
luaState
.
GetFunction
(
"Move"
)
;
f
.
Call
(
)
;
}
}
)
;
}
}
|
最后是下载地址,欢迎大家在下面给我留言,也欢迎大家一起讨论Unity的热更新。谢谢。
http://pan.baidu.com/s/1o6NWyX8
工程下载完以后,大家可以直接打包装在Android手机上或者IOS上 。iOS我没上真机看,没找到iPhone4,如果你有机器的话帮我测试一下嘿嘿。
我在iPhone5s上看了一下 全程无压力,有iPhone4的朋友帮我看看哦。。
- 本文固定链接: http://www.xuanyusong.com/archives/3123
- 转载请注明: 雨松MOMO 2014年08月18日 于 雨松MOMO程序研究院 发表