套方案是解决问题的错误思路

[TOC] 思考问题要从问题的原点出发,套用某个方案是解决问题的错误思路。我写这个主题,是因为大多数人(包括我也是),在解决问题时,常常不经过具体的分析/验证,就贸然使用那些被“吹得牛B哄哄”的解决方案,如程序滥用插件和第三方库,策划抄需求。 按《金字塔原理 》书中的理论,解决目标问题Root,其实是自上而下解决N个子问题(树的深度)的决策树,其特点是重权越大的子问题越在高位,即被优先考虑/解决。 对比套用方案的思路,无疑是一个逆过程,即自下而上,重要的子问题没被优先考虑。最终可能导致目标Root妥协,迎合不是最优的解决方案,令目标Root偏离最初的原意。 不做分析的原因可能有以下几种: 项目进度紧张,没时间做。 对复杂问题。可能是知识/技能不足以分析/解决子问题(...
Click to read more ...

为什么不要吐槽别人代码

[TOC] 吐槽别人代码乱,在程序里多见不怪。细心就会发现这些吐槽行为并不是单向,被吐槽者往往也能收集到足够的“证据”/“建议”吐槽别人的代码很烂。 吐槽经常是发生在接手(离职/休假)代码时,这不是(离职/休假)时情绪亢奋写的代码龙飞凤舞。我认为烂代码是演变而来的,非一蹴而就(后面说明)。如果问题是普遍存在的,那么问题就不是个意外或特例。至于不将烂代码说出来无非是”有技术涵养”和“彼此理解”。而说出来则是可能因为经历太少人少轻狂、或是甩锅或是恶意攻击…. 问题规模小,可能需要少量或不根本不需要程序设计,大家一看代码就轻松明白,这种代码很难被定义为烂代码。然而需求的增加和叠加各种非技术问题,好代码就会大概率演变为烂代码。 常说“下层解决上层建筑“”。烂框架就会生出烂代码。好的...
Click to read more ...

玩塞尔达荒野之息的特殊感觉

[TOC] 2019年10月开始玩塞尔达荒野之息,觉得游戏里面有种感觉非常有意思。我不知道该用什么专业的词语来概括它。但我很容易在游戏里感觉它。 在荒野之息游戏里这么大的地图空间,并且又没有指引的情况下,为什么我在游戏过程并不觉得自己在胡乱的瞎逛呢?自己行走路线都很有规则,比如为了看清周围地域(找神庙),我总会朝着高处走。看到异样的建筑/地形/植物/怪物(如平原里有座小山),总感觉那些地方会有事情发生,而吸引着我过去,常常会有克洛洛和宝箱在那。又比如看到矿石会忍不住过去敲。 玩荒野之息玩到不知天时(连续几个小时),回头想来好像就是这个感觉,一直在让我乐此不疲地从一个地方到另一地方(进行游戏内容) 直到最近,听一些游戏介绍视频,无意地知道原来这感觉叫作【引力】。何物?吸引玩家...
Click to read more ...

记一次C#数据包GC优化

[TOC] 几个月前接手了项目客户端网络层模块,要求分析数据包GC大小并优化。基于不可抗拒的原因,这个项目没有使用流行的通信协议,如google protobuffer和风云大大的sproto等,而是自研的key-value协议。经过一系列优化,最终将代码的GC减少了约50%,并且优化以来运行良好。由于不能将项目的具体代码逻辑贴出来,同时为了更好地理解本文主旨,下文使用伪代码来表达主体逻辑,请放心这不会影响你对要点的理解。 也许阅读的过程你会嘲笑和惊讶部分代码为何“如些地烂”。遗憾的是已无法对这些“上古的遗迹”细细地追溯过去,只能战战兢兢地修改下去罢了~~!! 修改前的代码 主要有两个对象NetPackage和NetWork NetPackage 数据包实例。负责储存着字段列...
Click to read more ...

使用swig导出c# wraper并调用native dll

[TOC] Building a C# module是swig导出C# wraper并调用native dll的官方样例。本文没有使用样子里的gcc和mono-csc,而是用了window自家的编译指令cl和csc 我将所有执行命令放到build.bat脚本中。因为使用了cl和csc,你需要在Visual Studio Command Prompt下运行build.bat,并且传入swig安装路径,如: build.bat d:\swigwin-3.0.12\swig.exe 原文: https://lizijie.github.io/2020/01/03/%E4%BD%BF%E7%94%A8swig%E5%AF%BC%E5%87%BAc-wraper%E5%B9%B6%...
Click to read more ...

思索了几个C&C++实习生面试题

[TOC] 近期公司招C/C++实习生,看了一下公司面试题。觉得题目考点太偏向概念、语法题。缺少一些基本原理和实践题。 特意思索了5题。前3题关于指针/内容空间。后2题关于实践。 如有雷同,纯属巧合 题一 在C/C++中,以下代码的执行结果 char*  str = "abcd"; str[0] = '1'; 答:题中str的声明类型是char,但字符串常量指向的内存空间不可写。严格来说char是个指针并不是内置字符串类型(c#/java的string )。在C++中内置字符串类型是std::string 题二 小端字节序下,printf的打印结果是 int main() {     short v = 0x1234;     char* p = (char*)&...
Click to read more ...

记一次修改unity3d富文本插件的设计缺陷

[TOC] 小弟最近开发客户端的聊天系统。策划案子要求支持图片和文字混排。我在github上找到了功能较为丰富,start数比较多的插件TextInlineSprite 它支持: 文本超链接显示 文本下划线效果 支持同时多个表情集 插件提供了详细的样例代码,让你非常容易入手。在此感觉作者coding2233的贡献 然而,当我滑动无限复用列表时,表情位置显示不正确(如上图)!!特别是在UI项超出边界,被回收复用时,偏移尤为明显。我参考插件样例ChatTest相关代码(如下),当ScrollRect的位置变化时,同时也调整SpriteGraphic的位置,目的是抵消表情位置偏差。不过问题依然没有改善。 namespace EmojiText.Taurus { ...
Click to read more ...