开发心得

开发心得

这里的每一点心得都是遇到的坑……

游戏设计

别限制玩家要怎么玩

解决方案技术栈

  • 美术资源管理svn/git-fls
    也可以建2个库,美术资源是Fork的库。这样。美术库只包含基本代码。代码库只包含基本允许场景。
  • 其他资源管理使用git
  • 文档使用 dokuwiki/ amwiki + git /Confluence或代替品
  • 项目管理 (禅道/Redmine) + QQ邮箱 + webqq(调研中)
  • 服务器使用docker Kitematic
    • mysql mongodb
    • Jenkins
  • 使用.vsTemplate规范代码,创建VSIX

Read More

面试准备

自我介绍:
你好,我是 孙通,吉林长春人。13年毕业于南京金陵科技学院。应聘U3D游戏开发。
我从事U3D开发5年多,有MMOARPG手游的完整项目经验。
14.10-15.10在上海玩心游戏科技公司参与开发了 迷城物语,于16年初上线。
16.2-17.6月,我在长春新曦雨做游戏开发,主要开发VR游戏的客户端。
17年10-19年6月,在日本一家游戏公司做MMO项目。
从unity4.0开始使用的unity,经理了4.6, 5.3,2017几个大的版本更替,对unity还是比较了解的。

Read More

异步编程分析

  • 异步编程两个核心关键字理解
    • await == UnsafeOnCompleted == 将下文代码包装成回调函数注册到Task中。
      记住 await 时才调用 UnsafeOnCompleted即可。
    • async == AsyncTaskMethodBuilder.Create().Task,并在方法末尾SetResult。
      async是隐藏的生成一个Task/ValueTask。


  • 返回值为Task的方法的Task,是何时构造的?如果第一个await没有同步完成,那么会创建新的task.
    • 返回值为Task的方法同步完成,不会new Task,内部使用的单例的已完成的Task,不会有额外开销。
      internal static readonly Task s_defaultResultTask = AsyncTaskCache.CreateCacheableTask(default(TResult));

Read More

设计失误

TeamSystem
没有Update
Myparty没有统一位置
manager过大或者不应该存在Manager

Arena,Battlefield
如果特殊必要,不要使用增量的方式发送数据,每个消息包一定要独立完整。低频消息不在乎这点数据量。增量发送会导致接收端数据准确性问题。

消息协议不要通过partial 扩展,通过适配器模式和继承接口扩展,因为消息协议类应该是一个单独的dll.

C# 文件模板

MessagePack-CSharp分析

序列化

内存分配部分:
一次拷贝(开销很小,几乎没有优化必要) 一次内存分配(可以避免)

public static byte[] Serialize<T>(T obj)
{
    序列过程中:使用线程不共享byte buffer pool,64K。
    序列完成使用Buffer.BlockCopy拷贝到新buffer ,新的bytebuffer 直接new的,所以有内存分配。
}

public static ArraySegment<byte> SerializeUnsafe<T>(T obj)
{
    序列过程中:使用线程不共享byte buffer pool,64K。
    序列完成使用ArraySegment<byte> ,没有额外的内存分配。
    但是因为使用的是线程不共享byte buffer pool,所以不能跨线程发送,而且必须立即使用,下一次序列化内容时将会覆盖数组。
    项目中基本都是异步发送,因此无法使用。
}
    

Read More

Unity可视化编程插件测评

优点 缺点 建议
bolt 反射本地代码(需要wrap) 支持蓝图; 支持子状态机; 不支持行为树; 连线反人类! 如果你会写代码,就不应该使用它
behaviour designer 不支持状态机; 学习曲线陡峭; 例子少; 适合专家
animator 原生动画支持 功能单一 结构清晰,轻量级推荐,与本地代码交互困难。不适合大项目。
NodeCanvas 体积小; 反射本地代码(无需wrap)。 自带节点良好。 文档详细。 没有蓝图; 效率一般(可接受); 我推荐它!