战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

#

受尽svn各种折磨的小伙伴都听说过git. 但是网上一搜索, 本来打算跟svn一样. 下一个服务器, 装下就可以开始用了.

没想到啊, 没想到. 居然需要Linux天赋点…

好吧, 拜鸟哥门下把Linux上手了吧, 刚开始搭git, 靠. 又需要公钥和各种辅助软件.

伤不起啊

很多小伙伴们, 自此继续沉默的继续使用svn

我们没有放弃, 我们找到了简(shan)易(zhai)搭建法

 

先看疗效:

1. 无需公钥

2. 只需要几个最常用的Linux命令就可以搭建

 

看步骤

1. 准备Linux服务器, 安装好git(一般都是默认装好的)

2. 命令行操作

useradd git   #创建一个git账号

passwd git    #设置git账号的密码

su – git    #切换到git账号

cd ~  #转到用户目录

mkdir 项目名称.git   #建立项目git文件夹

cd 项目名称.git

git –-bare –share init   #初始化git库

 

3. 马上拿起你的git客户端( 乌龟, SourceTree均可)输入这样格式的地址git@ip:/path/to/project.git

例如: git@192.168.1.2:/home/git/YourProject.git

git pull时, 需要输入密码, 就输入上面创建好的git账号的密码就可以

开始使用吧!

 

Tips

这种方法搭建的git服务器仅限于小团队和对贡献代码不敏感的项目而生

git本身的公钥是为了防止别人伪造用户名进行虚假提交. 但这个方法绕开了这点

想开新的git库时, 切记使用git账号去重复以上步骤, 若使用root级别账号创建的文件夹使用客户端时会遇到权限不足的提示

posted @ 2015-06-10 14:53 战魂小筑 阅读(2671) | 评论 (0)编辑 收藏

满打满算, 从好友推荐Golang至发文时, 使用Golang已经有1年多了. 这种时间对于C/C++ Java这些老者来说, 简直是菜鸟级别的经验

但作为新生代语言的特点就是实战. Golang这一年里, 已经为项目提供了稳定的服务器和强大的扩展能力, 与客户端的Unity3D里的C#一样, 都是强大, 极致开发效率代表的优秀开发语言.

用途篇

Golang到底拿来做啥? 我需要么?

高效(性能,开发)的服务器语言. 包括Web, 游戏, App

编写桌面级UI暂不是很适合

我需要把现在的C++, Python, Erlang等服务器改成Golang么?

性能有瓶颈, 开发效率低, 有钱有时间的话, 完全可以

 

评价篇

听过太多的人对Golang的评价, 大概分为这么几类:

C/C++性能党

此类党员对任何事物都追求极致的 性能. 还好Golang是直接生成native code, 否则会被批的体无完肤. 但是由于Golang底层为并发和开发效率而做出的一些系统, 类似于GC, 调度器和分配器等, 会在语言层上损失很多性能. 因此C/C++党还是有理由批Golang性能低下

Erlang并发党

作为电信级元老, Erlang的模型和架构当之无愧, OTP扩展性超级强. 完美的Actor模型也让逻辑编写比OO更加直观

CSP与Actor区别仅仅只是在channel的归属范围而已, 但这点细微差别却对两种语言的开发变的迥然不同

Golang在并发模型上选择了CSP, 就是考虑把架构的设计留给使用者. 像C#一样建立一个类库的世界, 而不是MFC一样的框架世界. 让开发更自由

Erlang的Actor也没错. 让开发更直观, 让崩溃提前来到, 尽快处理

Rust党

Rust在发文时已经发布了1.0. 这让R粉兴奋的穿梭于各大技术论坛和讨论群

但Rust的理念在我看来有点偏执了, 一定要把各种错误在编译期暴露出来, 所以造出了很多不需要的类型和概念, 连语言都比C语言更符号话

大白话说来, 有点编程经验的人看到JavaScript完全看得懂, 但看Rust却像天书

对比同时期的TypeScript, Dart, Swift. Rust就是有点那么独辟蹊径

该党党员经常性的用各种特性对比Golang, 追求单特性的优秀.

但其实, Golang本身是一门完整哲学. 很多语言特性互相之间有关联. 有设计不当的地方, 当然更多的是完整体系. 不求和其他语言比

只追求解决问题的速度

自定义党

云风看过Golang后, 因为该语言本身就是强化版的C, 因此颇受云风喜欢. 但在一堆评价后, 云风还是果断选择了C+lua的组合写出的Skynet

虽然不知道原因, 但我猜的话, 毕竟是对语言本身的可控性还不那么看好

同时, 我们发现Skynet使用的是Actor模型, 也发现大神级的程序员就是有先见.

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

感触篇

设计

踏入Golang, 就不要尝试设计模式

传统的OO在这里是非法的, 尝试模拟只是一种搞笑

把OO在Golang里换成复合+接口

对实现者来说, 把各种结构都复合起来, 对外暴露出一个或多个接口, 接口就好像使用者在实现模型上打出的很多洞

别怕全局函数, 包(Package)可以控制全局函数使用范围.

没必要什么都用interface对外封装, struct也是一种良好的封装方法

Golang无继承, 因此无需类派生图. 没有派生这种点对点的依赖, 因此不会在大量类关系到来时, 形成繁杂不可变化的树形结构

 

容器

用了很长时间map, 才发现Golang把map内建为语言特性时, 已经去掉了外置型map的api特性. 一切的访问和获取都是按照语言特性来做的, 原子化

数组可以理解为底层对象, 你平时用的都是切片, 不是数组, 切片就是指针, 指向数组. 切片是轻量的, 即便值拷贝也是低损耗的

 

内存

Golang在实际运行中, 你会发现内存可能会疯涨. 但跑上一段时间后, 就保持稳定. 这和Golang的内存分配, 垃圾回收有一定的关系

现代的编程语言的内存管理不会很粗暴的直接从OS那边分配很多内存. 而是按需的不断分配成块的内存.

对于非海量级应用, Golang本身的内存模型完全可以撑得下来. 无需像C++一样, 每个工程必做内存池和线程池

Channel

Channel和锁谁轻量? 一句话告诉你: Channel本身用锁实现的. 因此在迫不得已时, 还是尽量减少使用Channel, 但Channel属于语言层支持, 适度使用, 可以改善代码可读写

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

错误

觉得Golang不停的处理err? 那是因为平时在其他语言根本没处理过错误, 要不然就是根部一次性try过所有的异常, 这是一种危险的行为

panic可以被捕获, 因此编写服务器时, 可以做到不挂

 

危险的interface{}

这东西就跟C/C++里的void*一样的危险, nil被interface{}包裹后不会等于nil相等, 但print出来确实是nil

模板估计可以解决容器内带interface{}的问题. 但新东西引入, 估计又会让现在的哲学一些凌乱

 

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

 

初学Tips

语言学习按照官网的教学走, 跑完基本就会了

下载一个LiteIDE, 配合Golang的Runtime,基本开环境就有了

Golang的类库设计方式和C#/C++都不同, 如果有Python经验的会感觉毫无违和感

有一万个理由造轮子都请住手, 类库里有你要的东西

写大工程请搜索: Golang项目目录结构组织

Golang语言本身本人没有发现bug, 即便有也早就被大神们捉住了. 唯一的一个感觉貌似bug的, 经常是结构体成员首字母小写, 但是json又无法序列化出来…

慎用cgo. 官方已经声明未来对cgo不提供完整兼容性. 任何一门语言在早期都需要对C做出支持, 但后期完善后的不兼容都是常态

 

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

 

 

posted @ 2015-06-04 17:19 战魂小筑 阅读(21263) | 评论 (1)编辑 收藏

一直对各类编程语言中的字符串底层实现的差异感兴趣. 最近在知乎上提了一个问题
总结起来, 在脚本里常用的一种字符串处理方法称之为 字符串驻留技术(String interning).
此技术主要为了节约内存, 提高访问, 操作效率. 这里拿lua来说, lua中低于40个字节的字符串驻留在全局hash表中, 大于40个字符的字符串单独有一个表. 这么处理可以提高cache命中几率. 但核心的关键是, 字符串的入库都要进行hash化处理, 这个比较耗时. 但入库后, 字符串之间的变量赋值只限于字符串引用, 还是唯一的一个引用, 字符串比较也是基于整数级别, 效率很高

一些链接
蒋金楠(Artech)博客园中C#的例子
http://www.cnblogs.com/artech/archive/2007/03/04/663728.html

C#微软官方的例子
https://msdn.microsoft.com/en-us/library/system.string.intern(v=vs.110).aspx

posted @ 2015-05-06 11:33 战魂小筑 阅读(593) | 评论 (2)编辑 收藏

本文介绍游戏服务器的性能分析, web服务器性能分析不在本文分析范畴之内

Golang编写的服务器可以方便的通过内建性能分析, 输出图表仔细查找原因, 非常的方便, 如下图

image

 

1. 获取一个性能分析的封装库

   go get github.com/davecheney/profile
   2. 在工程内import这个组件    

3. 在main中添加启动和停止入口

func main() {
    defer profile.Start(profile.CPUProfile).Stop()
 
    // ... your main code here ...
}

4. 重新编译工程, 运行

5. 注意观察启动后, 命令行里的字段, 类似于

2013/08/08 16:45:58 profile: cpu profiling enabled, /tmp/profile882806532/cpu.pprof
后面的路径就是pprof性能分析文件的位置, 启动机器人进行多次服务器测试用例, 停止机器人, Ctrl+C中断服务器
  6.将cpu.pprof拷贝到你的游戏exe所在位置
  7.下载并安装Graphviz, 这是将分析数据变成上图的图形化工具
  8.调用Graphviz制作文档
 go tool pprof --pdf gamesvc.exe cpu.pprof > report.pdf
如果dot没有找到, 可以在执行前添加路径
set path==%path%;"c:\Program Files (x86)\Graphviz2.38\bin"
posted @ 2015-04-11 14:36 战魂小筑 阅读(6470) | 评论 (0)编辑 收藏

golang的time.Format设计的和其他语言都不一样, 其他语言总是使用一些格式化字符进行标示, 而golang呢, 查了网上一些坑例子 自己查了下golang的源码, 发现以下代码

// String returns the time formatted using the format string
//  "2006-01-02 15:04:05.999999999 -0700 MST"
func (t Time) String() string {
    return t.Format("2006-01-02 15:04:05.999999999 -0700 MST")
}

尝试将2006-01-02 15:04:05写入到自己的例子中

func nowTime() string {
    return time.Now().Format("2006-01-02 15:04:05")
}

结果返回正确. 询问了下, 据说这个日期是golang诞生的日子… 咋那么自恋呢…

posted @ 2015-03-26 17:23 战魂小筑 阅读(5481) | 评论 (1)编辑 收藏

SVN的工作流是checkout->modify->update->merge->commit, 如果多人修改同一个文件, 需要进行合并. 但对于Excel等复合文件格式, svn无法处理合并. 虽然云风尝试处理过Excel合并的问题, 但其实对于我们日常开发来说, 并不太期望有些操作进行合并, 而是类似于VSS那种早期的代码管理工具的锁定行为. SVN依然有这个功能.

这里使用的是风靡世界的TortoriseSVN. 选中一个SVN管理下的文件, 点击右键, 打开属性

image

在New对话框中选中Needs-Lock

image

提交这个属性修改.

现在我们的工作流的某些步骤变化了:

image

getlock->modify->commit

如果有他人在修改, getlock会失败

getlock的原理与早期的VSS一致, 使用了文件只读的属性. 如果尝试不getlock就修改文件, 那么文件最终无法保存!

posted @ 2015-03-06 16:27 战魂小筑 阅读(4321) | 评论 (0)编辑 收藏

准备:

http://code.google.com/p/protobuf/下载protobuf-2.5版本

预备知识: 已经使用过protobuf, 熟练应用protobuf序列化在各语言间交互信息

目标: 获取proto内容而无需手动解析proto文件

为proto文件添加更多的meta信息, 并在运行期获取.

 

protoc编译器准备

通过protobuf-2.5的源码或者从官网下载, 可以获得protoc的protobuf编译器, 这个编译器由C++编写, 官方支持完整的protobuf特性. 编译器默认支持C++, python和java 三种语言的代码生成. 如需生成更多的语言, 可以通过官网的第三方页面获取.

 

protoc插件原理

但我们在日常使用中, 可能需要提取proto信息, 例如: 所有的枚举,消息等信息, 字段名称和导出号. 自己编写词法解析器来做是费力不讨好的. 官方推荐的方法是使用protoc外挂插件来实现.

protoc的插件设计比较独特, 不使用动态链接库或者java的jar包导入方式, 而是直接使用了命令行来交换数据.查看protobuf源码我们可以发现这样一个文件:

protobuf-2.5.0\src\google\protobuf\descriptor.proto

这个文件描述了一个proto文件的格式, 消息组成及枚举等完整信息. 这是一种自我描述的方法.

在找到这样一个文件

protobuf-2.5.0\src\google\protobuf\compiler\plugin.proto

这样一个文件描述: 插件如何与protoc进行交互的协议

protoc编译器在给定指定proto文件及搜索路径后, 将各种信息填充为descriptor.proto描述的结构后通过CodeGeneratorRequest消息系列化为二进制流后输出到命令行. 插件只用捕获protoc命令行输出的二进制流, 序列化化回CodeGeneratorRequest即可获得解析后的proto文件内容

这里需要注意的是: 插件可执行文件很有讲究, 必须为protoc-gen-$NAME,  而且输出文件名参数必须为--${NAME}_out

看一个栗子:

protoc.exe foo.proto --plugin=protoc-gen-go=..\tools\protoc-gen-go.exe --go_out foo.go --proto_path "."

这个栗子里: $NAME=go

protoc将foo.proto文件(搜索路径为当前路径)的内容通过命令行输出给位于..\tools\的插件protoc-gen-go.exe,  输出文件名字为 foo.go

descriptor.proto信息挖掘

我们注意到在descriptor.proto文件中包含有这样的一个message: SourceCodeInfo, 这个消息体里有如下字段

optional string leading_comments = 3;
    optional string trailing_comments = 4;

这两个字段对于我们获取proto文件的meta信息尤为重要, 所谓的meta信息, 理解理解为C#语言中的attribute

这个attribute功能可以为一个字段, 一个消息扩充一些描述. 比如: 当一个字段通过反射显示在gui上时, gui需要获取这个字段的中文描述

那么只需要如下编写

optional int32 somevalue = 1 //@ desc=”中文描述”

位于字段尾部的描述, 会被填充到SourceCodeInfo的 trailing_comments中, 而位于字段上方的字段, 会被填充到leading_comments中

 

SourceCodeInfo 并没有直接挂载在message或者字段的附近, 而是通过其下的path字段来描述与字段的关系, 这是个极为麻烦的设计.

其原理如下:

假设我有如下一个message

message foo

{

     optional int32 v = 1;  // comments

}

要获取v后的注释, 对应的path为 4, 0, 2, 0

4 表示descriptor中message_type所在的序号,由于message_type对应的类型DescriptorProto是一个数组, 所以0表示foo是在FileDescriptorProto的message_type数组类型的索引为0;

如此类推: 2, 0 表示 v在DescriptorProto结构体的field成员序号为2的数组元素的索引为0

 

如果需要更多的参考, 可以获取https://github.com/golang/protobuf

github.com\golang\protobuf\protoc-gen-go工程内有详细代码解析

posted @ 2015-03-01 13:49 战魂小筑 阅读(10750) | 评论 (0)编辑 收藏

最近发现, golang写的游戏服务器, 在非调试状态下, 一切正常, 但是在挂接gdb调试时, 无法收到网络消息. 打了很多日志, 发现, 只要有goroutine的地方, 都没有切换进入.

回想了下, goroutine的调度规则: 1.4之前, 在碰到syscall时, goroutine会被调度并处理. 1.4后, 只要有函数调用时, 均会进行一次调度. 密度比以前增加了, 更加接近真线程的处理.

根据这个原理, 问题应该出现在服务器底层没有给系统提供调度机会的点上. 我们的服务器通过一个bool型的chan进行阻塞, 让服务器维持阻塞进行消息处理不退出. 但是最近为了在windows下提供命令行支持, 增加了一些代码, 如下

   1:  func WaitForExit() {
   2:   
   3:      if len(peerMap) == 0 {
   4:          log.Println("no peer running, exit!")
   5:          return
   6:      }
   7:   
   8:      // 命令行功能只在windows下启用
   9:      if runtime.GOOS == "windows" {
  10:          reader := bufio.NewReader(os.Stdin)
  11:   
  12:          var running bool = true
  13:   
  14:          go func() {
  15:              select {
  16:              case <-exitChan:
  17:                  running = false
  18:              }
  19:          }()
  20:   
  21:          for running {
  22:              data, _, _ := reader.ReadLine()
  23:              command := string(data)
  24:   
  25:              dispatchConsoleCommand(command)
  26:          }
  27:      } else {
  28:          // Linux环境
  29:          <-exitChan
  30:      }
  31:   
  32:  }

我暂时屏蔽了新加的这套功能, 维持<-exitChan, 问题马上解决

结合前面的猜测, 我估计在reader.ReadLine()函数内, 没有给底层提供调度的机会, 导致其他goroutine无法运行, 造成服务器卡死

技术讨论群:  309800774 欢迎golang爱好者加入, 纯技术研讨

posted @ 2015-01-30 16:25 战魂小筑 阅读(3641) | 评论 (1)编辑 收藏

编码习惯及设计基础

clipboard

程序员修炼之道

http://product.dangdang.com/9053091.html

这本书讲解的一些设计原理很实用, 对设计感兴趣的同学可以一看

推荐指数: 5星

图形渲染, 客户端

clipboard[1]

3D绘图程序设计

http://product.dangdang.com/20567144.html

推荐指数: 3星

clipboard[2]

Unity3D游戏开发

http://product.dangdang.com/22783514.html

雨松MOMO的早期Unity3D教学, 和他的网站一样耐看

推荐指数: 4星

clipboard[3]

3D数学基础:图形与游戏开发

http://product.dangdang.com/9008571.html

这种书不适于通读, 但必须备一本作为工具书
推荐指数: 3星

clipboard[4]

大型多人在线游戏开发

http://product.dangdang.com/9232417.html

这本书很坑, 根本就是torqure引擎的广告. 对没有游戏基础的, 看了没用, 对有经验的是鸡肋

推荐指数: -1星

clipboard[5]

精通Unreal引擎技术---关卡设计艺术

http://product.dangdang.com/20002907.html

坑, 虚幻一类的书籍, 基本都是美术看的, 程序若想了解虚幻的牛B技术, 切记不可买书

直接加群下源码是最好的实践

推荐指数: -2星

服务器

clipboard[6]

网络游戏核心技术与实战

http://product.dangdang.com/23450869.html

相当经典的服务器概念讲解书籍, 服务器很多知识点很碎, 虽然这书是日本人写的

但是依然适合国内服务器开发者一读

推荐指数: 5星

clipboard[7]

Linux多线程服务器端编程(使用muduoC++网络库)

http://product.dangdang.com/23162953.html

当年编写C++ boost.asio服务器时, 参考过陈硕大侠的muduo网络库, 设计的甚好

虽然他从事的是金融行业, 但是实战经验同样值得游戏行业参考

这本书就是讲解muduo网络库及其服务器设计理念

推荐指数: 4星

clipboard[8]

Unix环境高级编程

http://product.dangdang.com/9171119.html

Linux环境开发必看书籍

推荐指数: 5星

脚本篇

clipboard[9]

编译原理

http://product.dangdang.com/20427584.html

龙书! 解析, 编程语言接触必看的书籍, 可惜我不是计算机专业, 人家这都是专业教材

推荐指数: 3星

clipboard[10]

自制脚本语言

http://product.dangdang.com/23493730.html

日本人写的基于java的脚本自动解析机, 全书没有带光盘, 硬是一点点把代码转成C#运行起来

理念很不错, 可惜调试很痛苦, 还是不如yacc这些代码生成的脚本代码方便

但使用自动机完成BNF范式解析确实很漂亮, 同样也可参考vczh轮子哥的发明

推荐指数: 3星

clipboard[11]

游戏脚本高级编程

http://product.dangdang.com/9220425.html

我把这本书叫做脚本黑书, 很基础, 很简单, 全程没有一点编译原理的讲解, 全代码实战

龙书已经落灰, 但依然对编写自己的脚本感兴趣的同学, 可以一看

推荐指数: 5星

clipboard[12]

Lua程序设计

http://product.dangdang.com/20223814.html

这本是最经典的lua官方书籍, 没有之一, 学lua必看

推荐指数: 5星

通用游戏编程及设计

clipboard[13]

游戏编程精粹系列

http://product.dangdang.com/20050227.html

到7以后就没出了

早期这些书还是不错的, 但由于游戏技术发展太快了, 所以有些概念现在看来已经落伍了

只是启迪性游戏介绍, 很少有实例代码, 启发思路较好

推荐指数: 3星

clipboard[14]

游戏人工智能编程

http://product.dangdang.com/22872362.html

AI方面介绍比较专业的书籍, 读过不后悔系列

推荐指数: 4星

clipboard[15]

游戏编程全接触

http://product.dangdang.com/9092514.html#ddclick?act=click&pos=9092514_0_0_q&cat=&key=%D3%CE%CF%B7%B1%E0%B3%CC%C8%AB%BD%D3%B4%A5&qinfo=1_1_60&pinfo=&minfo=&ninfo=&custid=&permid=20141224141405640200098950074468429&ref=http%3A%2F%2Fwww.dangdang.com%2F&rcount=&type=&t=1419645619000&ver=A

技术方面比较细致的知识点, 读过不后悔

推荐指数: 4星

clipboard[16]

面向对象的游戏开发

http://product.dangdang.com/9006047.html#ddclick?act=click&pos=9006047_0_0_q&cat=&key=%C3%E6%CF%F2%B6%D4%CF%F3%B5%C4%D3%CE%CF%B7%BF%AA%B7%A2&qinfo=2_1_60&pinfo=&minfo=&ninfo=&custid=&permid=20141224141405640200098950074468429&ref=http%3A%2F%2Fsearch.dangdang.com%2F%3Fkey%3D%25D3%25CE%25CF%25B7%25B1%25E0%25B3%25CC%25C8%25AB%25BD%25D3%25B4%25A5&rcount=&type=&t=1419645704000&ver=A

讲解怎样用面向对象的方法设计游戏, 架构设计向

推荐指数: 4星

clipboard[17]

3D游戏开发大全(高级篇)

http://product.dangdang.com/20072416.html#ddclick?act=click&pos=20072416_0_2_q&cat=&key=3D%D3%CE%CF%B7%BF%AA%B7%A2%B4%F3%C8%AB&qinfo=30_1_60&pinfo=&minfo=&ninfo=&custid=&permid=20141224141405640200098950074468429&ref=http%3A%2F%2Fproduct.dangdang.com%2F9006047.html&rcount=&type=&t=1419645726000&ver=A

推荐指数: 2星

clipboard[18]

全方位3D游戏设计--游戏引擎与游戏开发实例剖析

http://product.dangdang.com/9350357.html#catalog

当时买这本书是为了看MAX插件的

基本的引擎介绍和流程,较为简单

推荐指数: 3星

clipboard[19]

游戏核心算法编程内幕

比较全面的游戏技术介绍

推荐指数: 2星

clipboard[20]

游戏架构与设计

http://product.dangdang.com/9032136.html#ddclick?act=click&pos=9032136_0_0_q&cat=&key=%D3%CE%CF%B7%BC%DC%B9%B9%D3%EB%C9%E8%BC%C6&qinfo=26_1_60&pinfo=&minfo=&ninfo=&custid=&permid=20141224141405640200098950074468429&ref=http%3A%2F%2Fsearch.dangdang.com%2F%3Fkey%3D%25D3%25CE%25CF%25B7%25D2%25FD%25C7%25E6%25D3%25EB%25D3%25CE%25CF%25B7%25BF%25AA%25B7%25A2%25CA%25B5%25C0%25FD%25C6%25CA%25CE%25F6&rcount=&type=&t=1419988281000&ver=A

国外游戏整体把控, 流程, 产品等

推荐指数: 2星

 

 

游戏开发技术发展的很快, PC还没看完, 移动游戏技术已经走完了PC的历程. 如果你有好的书籍, 可以在此推荐, 或者加入群讨论: 309800774

posted @ 2014-12-31 09:22 战魂小筑 阅读(12080) | 评论 (6)编辑 收藏

Unity3D默认的asset格式都是二进制的, 比如说.anim .mat .prefab .unity 还有一些是文本格式, 比如.meta. 因此在菜单Edit->Project Settings->Editor里的Asset serialization模式是混合.

为了让代码管理工具能识别Unity3D的asset格式, 做出一些少量的合并及识别修改. 我们需要对Unity3D进行一些配置以适应代码管理工具.以下是步骤:

Edit->Project Settings->Editor里按如下配置

image

在做出修改前, 请将之前的修改提交代码管理

将选项设为红框内的方式, 使用显式Meta Files, 以避免在资源管理器里被被忽略的meta文件以及Asset文件使用文本格式

设定好后, 所有的资源将重新序列化, 将修改提交代码管理工具

 

代码管理工具不是玩能的, 也一定能很好的合并这些复杂文本格式. 因此我们在多人协作开发中需要遵守一些原则

1. 先获取别人的更新, 运行无误后再提交( 最基本的 )

2. 对有合并的asset格式, 尽量查看其修改过程, 询问他人的修改与自己的修改差异(或者是git的3方合并)

3. 对合并错误的asset格式, 应及时修正, 手动合并, 切勿延误并提交, 影响他人

参考链接: http://stackoverflow.com/questions/21573405/how-to-prepare-a-unity-project-for-git

posted @ 2014-12-26 18:58 战魂小筑 阅读(3836) | 评论 (0)编辑 收藏

仅列出标题
共26页: 1 2 3 4 5 6 7 8 9 Last