-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtodo.txt
456 lines (365 loc) · 12.8 KB
/
todo.txt
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
1.controller完成
2.保证协议工作正常
3.保证frame对象被正确产生
4.hand的绘制
5.Pointables的坐标正确性
6.Frame,Hand的t,s,r正确性
7.骨骼矩阵的正确性
低耦合,高内聚
想想如何写单元测试。如果单元测试很难写,说明耦合度不够低。
避免相似的代码重复出现
一旦觉得需要写注释,就说明需要写成新函数了。
.平台无关资源输出
.平台相关资源 纹理,shader 输出
windows平台
android&ios
.资源管理
.分离文件和WWW模式运行
.虚拟文件系统
.资源管理和加载机制
.加入粒子资源
.modelGroup机制
.角色查看器
.动态场景
.地形
.组件信息
transform
renderer
collider
Camera
Light
Sound
terrain
.尝试把区域作为场景,用多场景渲染Lightmap
.界面
.?逻辑数据直接客户端模块读取?
开发时以软链接的方式
发布时以unitypacket方式
美术工具与程序环境不在一个项目中。meta文件是不同的。
所以,不能直接交换原始美术资料。()
1.需要
2.四种数据内容的bundle,用来测试原始文件序列化到fb
3.四种fb格式的数据,用来测试还原到原始数据
ok.输出工具都指向 Home 目录
ok.Shader名与文件名的对照表
生成并打包
ok.Shader manager的ab装载
ok.LoaderFactory的配置:放在Resource中?
类型
File : Home
WWW : URL
Packet
ok.ResourceManager的Promise机制
允许加入多个resources
ThenAll必须知道原始数组
多个Promises就需要 Reject机制
ok ResourceManager的依赖装载机制
ok 修改 TaskManager
ok ResourceRef 的装载和解析 协程化
no 无法使用协程堆栈机制
ok 是等待者的堆栈,不是依赖项的堆栈。
单协程机制,
多协程机制
ok 测试
ok ResourceManager 文件方式读测试
ok ResourceManager WWW方式读测试
ok ResourceManager多协程控制(异步)
ok 优先级队列
如果两次资源传入优先级不同,强制为优先级高的。
如果两次资源传入同步异步参数不同,强制为同步资源。
一旦参数改变,重新排序
ok 异步、同步分成不同的处理器
异步协程数量需要指定
同步协程数量不受限制
no 资源同步装载和异步装载,是否应该属于资源管理器的功能, 资源管理器在两种状态之间切换。
ok 改名为 LimitedScheduler 和 UnlimitedScheduler
no 无法在两个 scheduler 之间切换
暂停功能,开始写测试用例。
ok 下载工厂
从 Resources 中读取,文件名要能设置。便于使用测试文件
单例模式,需要一个释放。便于测试不同情形下的初始化。
ok 反序列化类
ok 反序列化工厂
ok Nunit中使用协程的测试
ok File下载
Home中如果最后不是/则增加之!
ok WWW下载
ok File协议简单测测
ok Packet下载
如何测试StreamAssets目录下的包。
.目录或者文件名即可。
ok shader管理器
.应该能从外部指定shader包名
.错误改成枚举。
.shader字典中的项目必须在shader中都存在(增加自检)
.增加查询shader计数的接口 便于测试
.shader包不存在应该得到报错。下载错误
.shader包装载错误应该得到报错
.shader字典如果不存在应该得到报错
.Add/Del测试
.如何测试内部调用了协程的函数?
.用宏定义排除测试专用代码 runtime
资源ref
资源管理器
读文件和解析文件放入多线程
测试解析效率,如果没必要就不多线程了。
数据打包机制读文件
读取zip中的文件(原生库)
.zip操作库
读取assetstreaming目录中的zip包(安卓)
解压缩效率
ResourceManager WWW方式更新机制 Cache刷新问题
缓存中是当时的 hashcode
如果有一份新的 hashcode,有了差异就产生了不同的url.
如何让提交文件时自动产生hashcode
根据版本差异传送被改变过的hashcode列表
客户端保存所有文件的hashcode列表
全部扫描一遍生成所有文件的hashcode,并记录版本号(单独的工具)
如果有新版本请求比记录的版本号新,则更新svn,并更新hashcode记录和版本号记录
向请求端发送
客户端必须有所有文件当前的 hash128
1.如何生成文件的hash128
能否从svn中取得文件的hash128
2.研发版本仍需要一个维护机制,保证svn有更新时,获取新文件的hash128
客户端机制 要启动一个www更新界面
完全刷新机制 vs hash128 Cache 机制
读取当前svn版本
获取新的svn版本
有当前版本号和hash128文件,如果svn版本号有更新
获取更新文件的hash128文件,与旧的hash128文件合并
无当前版本号和hash128文件
获取完整的当前的hash文件
以这个hash128值作为下载文件还是读cache的标志。
服务器机制
1.提供生成当前版本完整hash128的机制
2.如果有客户端请求,则
读取以前的svn版本记录文件
获取当前的svn版本
比较更新列表
生成更新文件的hash128列表
与之前的hash128文件合并为完整列表
数据打包方式的更新机制
Updater 是单独的场景。这个场景中的数据直接打包在内。
FileModeUpdater
WWWModeUpdater
PacketModeUpdater
.unity命令行方式
.从美术数据生成执行数据,
生成模型数据
生成纹理数据
打包核心数据
核心数据中的shader,需要一个shader名与文件名的对照表.
.上载svn
.发布时可以用参数控制,是否打包数据。
.虚拟文件系统
WriteFile() new/updates
DeleteFile()
ReadFile()
1.android 下直接读取apk
2.libzip
动作
网格
骨骼
材质
纹理
普通纹理
Normap
Lightmap
Sprite(2D&UI)
Shader
unity 在运行时的单元测试
创建单元测试场景
专门的单元测试版本。
unsafe代码在il2cpp模式下
flatbuffers读取结构数组的效率:两种模式下,真实平台上,与直接调用unity3d的assetbundle运行效率统计
mono2x:
il2cpp:
ok.?文件的格式
ok 文件头的写法、读法
no 可升级的版本方案?
ok.先完善功能还是先写测试 先写测试
ok 逗逼引擎规则。
ok 材质名作为模型组中可更换的参数。MeshPart中,需要指明材质名。不包含在网格资源中。
通用的 主纹理和主颜色参数设置
更换主纹理 + 更换主颜色 + 更换材质(可动画)
ok 场景文件中保存足够的信息。Transform,Material,Collider
ok 资源文件只包含单一资源
ok 实例材质和模版材质
特殊的参数修改,就成为了特殊材质。(换颜色,换纹理)倾向于 1,3
更换shader 同上
ok 输出网格时,如果原资源中包含多网格,输出后文件名使用 网格名@资源名.db3d 形式
ok.资源输出的单元测试
ok.单元测试的资源怎么办?
ok 方案
以.开头的资源目录
以assetBundle方式工作。
打包工具,读取打包列表
no unity的打包是有比较的.
ok 输出和存盘分开 得益于单元测试,这样更好测试。
ok 骨骼输出测试用例
输出结果中没有重复的骨骼。
每个原骨骼都被输出了(按名称)
每个被输出的骨骼都存在原骨骼。
输出的骨骼都是不带renderer的。
每个被输出的骨骼的父节点都是正确的
每个骨骼的局部矩阵都是相应的。
ok 网格输出测试用例
顶点成分
每个顶点成分都被输出了
每个输出的顶点成分都存在着原成分
每个成分的数量都与顶点数相等
每个成分的数值都与原数据相等
三角面列表
submeshes:[SubMesh];
joints:[string];
bindposes:[Matrix16];
ok 材质输出测试用例
结果中的属性与源材质都相等。
源材质的属性都被输出了。
ok 动作输出测试用例
ok 递归收集骨骼独立出工具类.
ok 单元测试装载assetbundle功能单独出工具类
ok.资源读入功能
纹理加入 offset 和 scale
ok.资源读入的单元测试
预先写入文件,
读入文件作为源数据
生成的模型作为比较目标
ok.显示测试角色
ok.纹理,shader输出
ok 纹理打包工具
ok 从包中读取原始纹理数据
不需要完全写成正确格式,只需要记录足够信息即可.
ok 看运气,在Editor中运行其他平台时,rawData的正确性
如果无运气,1是解assetBundle包 2是自己做纹理转换工具.
ok 测试时还需要切换平台.
测试分为平台相关和平台无关两部分.分开进行.
平台相关测试只测试当前平台.要切换平台再进行测试.
ok.shader打包工具
streamingAssets目录本来就是不打包的.
打开文件
定位读
zip部分使用原生代码还是c#代码
.资源文件读写测试
ok 写入文件 读出文件 写入之前和读出之后做比较。
todo:读不到应该要报错
写入文件有可能失败?
.完善测试用例的数据,以覆盖所有的分支情况。
.文件预处理的规则
动画规范,wrapMode的配置.
纹理的命名规则
材质的shader对应规则,纹理的指定规则.
.所有与"Assets/ArtWork" ".root" 相关的路径都放到一个工具类.
1.资源输入预处理 要保证资源输入时被正确处理过.节省人工.
多材质如何处理?
一个renderer下的多材质
子节点的多材质
2.批量转换资源
模型组输出. 暂时先做一个不使用模型组配置的版本.
不带@的输出网格资源
带@的输出动作资源
材质资源与网格资源存在一起
ok 如何遍历material的所有属性
ok 遍历文件
如何输出/还原动画文件
如何还原texture的类型
这样做是和shader的算法相关。实际上为了shader算法,是已经改变了normalmap的内容。
it seems when you import a normal map to unity, it intenally has the setup of RGB = y normal, A = x normal.
loadedTexture = www.texture;
normalTexture = new Texture2D(loadedTexture.width,loadedTexture.height,TextureFormat.ARGB32,false);
Color theColour = new Color();
for (int x=0; x<loadedTexture.width; x++){
for (int y=0; y<loadedTexture.height; y++){
theColour.r = loadedTexture.GetPixel(x,y).g;
theColour.g = theColour.r;
theColour.b = theColour.r;
theColour.a = loadedTexture.GetPixel(x,y).r;
normalTexture.SetPixel(x,y, theColour);
}
}
normalTexture.Apply();
private Texture2D NormalMap(Texture2D source) {
Texture2D normalTexture = new Texture2D(source.width, source.height, TextureFormat.ARGB32, true);
Color theColour = new Color();
for (int x = 0; x < source.width; x++)
{
for (int y = 0; y < source.height; y++)
{
theColour.r = 0;
theColour.g = source.GetPixel(x, y).g;
theColour.b = 0;
theColour.a = source.GetPixel(x, y).r;
normalTexture.SetPixel(x, y, theColour);
}
}
normalTexture.Apply();
return normalTexture;
}
按照模型组配置输出
场景输出
纹理规范
法线贴图后缀 _NRM
高光贴图后缀 _SPC
max中材质名应该与shader相对应?
角色规范
动作命名@是为了不重复生成纹理.
动作 wrapMode 应该在 max 中指定.
Doubility3D_Tools
Doubility3D_Engine
Doubility3D_Client
如何在导入时直接把shader指定成想要的。
StreamingAssets 只保存一个zip包作为运行时数据。
先在.data中读取,如果没有则在
问题变成如何直读zip包。(最差情况,也只在第一次运行时需要一次拷贝)
如何产生相应平台
纹理。
可利用assetBundle打包
Texture2D.GetRawTextureData
Texture2D.LoadRawTextureData
Shader
这是唯一要做成assetBundle的部分。
在U3D和客户端逻辑之间传送消息 以flatbuffer为手段
U->N
所有逻辑物体的 Transform
动画播放完毕事件
非界面操作
界面操作
N->U
装载地图
创建指定参数的逻辑物体
向GameObject发出指令
刷新界面数据
服务器<->逻辑客户端<->图形层
传输效率值得担心!
逻辑客户端使用 golang.
go 1.5可以编译为桌面程序的动态链接库
go mobile 可以编译为 android ios 的库
编译ios库需要在 mac 机器上进行。
0.资源准备
角色网格+动作
角色特效
场景地形+植被、摆设
场景网格+动画+特效
1.美术工具
资源输出
场景
场景物体记录细化
因为场景非常大,原方式已经不适用。
网格 对材质和shader的引用
材质 对纹理的引用
纹理
动画
shader
界面
音效
音乐
2.图形层
资源管理器
角色显示
场景显示
自定义资源包
游戏视觉协议 flatbuffer C#
2D模拟图形层
3.逻辑客户端
与图形层协议 flatbuffer Go
编译golang模块