C#脚本实践(六): 脚本相对于C++的优势

2018-05-23 16:28:36 浏览数 (1)

  • 在实际使用脚本之前, 根本不知道为什么要用脚本, 直到我膝盖中了一箭
  • 在之前我也问过很多人, C 写逻辑什么的也行啊, 为什么要引入另一种语言呢? 听得最多的理由是:不用编译
  • 的确,  C 的编译速度很浪费时间, 但也不是不能接受. 不过, 用过其他语言之后, 再想想, 持这种观点的人都是习惯了慢罢了
  • 当然, 还有很多其它原因, 可以参见miloyip的两篇文章: 混合语言的游戏开发系统架构, C 强大背后
  • 在用了一段时间C#脚本之后, 暂时总结一下相对C 的优势吧. 其中一些可能C 也能做到, 但是是需要花费一定的代价的. C 无所不能, 但是总有它不擅长的部分
    • 反射
      • 属性反射
        • 这个是非常有用的一个特性. 在做编辑器时跟PropertyGrid结合后, 基本上一个面板搞定所有的参数设置, 可以参考Unity的Inspector面板. 程序可以专注于程序逻辑, 不用在UI上花太多的精力
        • 放到脚本里也一样, 逻辑属性的扩充就是加一个成员变量, 策划也不用去配什么表了, 直接所见即所得的编辑实体属性, 还不怕填错, 来回折腾
      • 通过方法名字进行调用
        • 这可以改变一下编程的思路, 比如发送一个消息到一个对象, 你有叫这个名字的处理函数就执行, 没有就算了, 我通知完我就不管了
      • 能过类名创建对象
        • 相当于内置了工厂模式, 比较状态机中, 状态的扩充就不用麻烦再去改原有的代码了
    • 序列化
      • C 在文件保存方面如果不做好设计, 就会面临各种版本兼容问题. C#的序列化是默认就支持的, 我们再也不用去操心数据是保存成ChunkData还是BinaryXML什么的, 直接一个Serialize搞定
      • 还有一个比较有用的地方, 就是Save/Load, 比如脚本改了, 先Save, 重新载入脚本, 再Load, 就完成了运行时的更新, 见下面的"热更新"
    • 异常处理
      • C 虽然有异常处理, 但是很少有人用, 因为它本身就不完善. 把主要的程序逻辑放入脚本后, 相当于运行在一个沙盒里, 做好异常处理可以保证程序不崩溃
    • 垃圾回收
      • C 写出的代码安全性与稳定性非常依赖程序员的素质, 而脚本可以让你不用关心内存越界, 内存泄露, 非法内存访问等这种隐藏很深的BUG, 节省大量精力去专注于游戏逻辑
    • 热更新
      • 脚本可以在游戏运行过程中修改, 再重新载入, 游戏会继续按照新的逻辑运行. 这相对于C 的结束->修改->编译->重新运行->还原到指定场合, 可以节省大量的时间
      • 另一方面就是方面调试, 因为可以实时更改运行逻辑, 那很多时间相关的逻辑代码就可以方便的屏蔽, 修改, 输出等
    • 协程(Coroutine)
      • C 里没有这东西, 要改变编程的思维方式需要一段时间的适应, 具体可以参考这篇文章: 用C#中的yield实现Coroutine框架
      • 虽然只是语言级别的特性, 实际上并没有改变什么, 但是在做AI/技能什么的写出来的代码能简化太多了!
    • 其它都是一些语法糖什么的, 比如delegate, event, lambda, linq等. 程序库很全, 但是一般都依赖引擎底层本身提供的功能
    • 人力成本, 想招个好的C 程序员难啊, 想招C#/JS/Lua的逻辑程序员, 就很多了.
    • 想到再补
  • 工作中接触到很多游戏程序员, 都是C 一路走到死的, 不知道这是C 的幸运, 还是它的悲哀呢?

C#脚本实践(五): 调试器

0 人点赞