毕业两年半,从科韵路run到腾讯(下)
有幸加入鹅厂
曾经在2020年4月份立下加入鹅厂的flag,那时候真的很焦虑,觉得工作上做的内容得不到提升,还占据了个人学习时间,但却一直有一颗希望在职业道路上能走很远的心。很幸运在一年后,2021年4月13日收回来这个flag,正式加入鹅厂,这也是错过了当年校招,从科韵路小厂社招入行的我在职业上的一个重要转折点。
腾讯面试流程真的很长,在我主动向面试官提出“无论结果怎么样,希望面试流程加快一下,目前还有其他Offer在催”后,整体流程还是走了一个月,本来应该是一件特别兴奋的事,然而实际我只在二面过了(代表技术上基本过了)的时候比较兴奋,其他时候实在是等得很无语,有一种“赶紧给个痛快吧”的心情,这就跟等高考成绩开奖似的,但与那伤心的回忆不一样的是,这次最后等到的是喜讯。
这篇文章就以一个小厂出身的游戏客户端开发的角度,讲一下进鹅厂的感受吧。
上班环境
班车
腾讯班车可以说是国内企业最大的班车系统了,班车基本覆盖深圳绝大部分路线,时间覆盖到早上7点到晚上11点,通勤就算再困难都有班车兜底,实实在在解决了很多同事的通勤问题,身边有不少同事都是固定坐班车通勤的,腾讯班车站点附近的房源也是 ...
毕业两年半,从科韵路run到腾讯(上)
初到科韵路
18年夏天,我毕业了,带着我那简陋的unity游戏demo以及我的游戏梦来到了广州科韵路,你问我什么是科韵路?
广州游戏圈的“科韵路精神”
科韵路互联网“工厂”
很遗憾,年幼的我还没有意识到问题的严重性,之所以选择科韵路,是因为我家就在广州附近,招聘APP上看起来广州的游戏公司很多,容易找工作。就这样,我简单收拾一下行李以及临时准备的一份Lua面试抱佛脚提纲,带着为什么这个行业学习用C#,工作写Lua,面试问Cpp的疑问,前往了广州。
求职之路
当然,我也不是什么也没准备就直接来了广州,在这之前我先是精心挑选了几家心仪的公司,逐个去跟对方HR打招呼,投简历,小心翼翼地,但回复基本上不是快捷回复不合适就是说我没有经验,既然找工作需要工作经验,获得经验又需要先工作,那行业新人何去何从?
显然,并不是我挑工作,而是工作挑我,我是那个被放在资本市场上,让资本纵横对比后选出其中一个性价比最高的商品,认清了现实的我,直接开启了海投模式,看上去稍微靠谱的jd,我基本都投上了,毕竟要获得工作得先获得面试机会。
深X游戏
这家公司第一轮面试就是HR面,HR小姐姐看上去很年轻,跟爷一样还 ...
把Hexo部署到云服务器
把Hexo部署到云服务器
前言
虽然我们可以把Hexo免费部署到Github Pages上,但是考虑到国内网络访问Github并不是那么友好,我决定把博客部署到自己的云服务器上。部署的前提是得有一个云服务器,本文以腾讯云为例简单说明一下,主要是记录自己踩过的坑,避免哪天重新搭建的时候重复踩坑。
服务器环境
我服务器装的是腾讯云提供有的宝塔面板镜像,CentOs 7.9 64位,集成软件:LNMP,LAMP,tomcat,Node.js。当然不装宝塔也可以,只是对于博主这种非Linux技术栈的人来说,宝塔面板方便很多。
部署步骤
友情提示
本文除非明确说明是在本地操作的,否则所有步骤都是在云服务器上操作。
Git安装
参考:Hexo博客部署到腾讯云服务器(使用宝塔面板)
其实上面镜像安装完毕后,自带已经有git,但是我跟着这篇文章(文章中Git安装及配置的1~3步)重新安装了一遍最新版,安装在/home/git/目录下,安装的版本是2.29.2。如果是用自带的git的话,应该也没什么问题。
创建git用户并部署环境
创建git用户
1adduser git
新增git用户(注意这个g ...
Hexo-Butterfly主题博客搭站记录
Hexo-Butterfly主题与Wordpress-Sakura主题对比
最近把博客从Wordpress迁移到Hexo,主题也从原本的Sakura换到Butterfly,原因主要有两点:
Butterfly主题版面可以说非常舒服,原本Sakura主题的文章排版,作为技术博客,看着有点累。
Hexo对Markdown语法支持度非常高,对于平时都是用Markdown写文的人来说很方便,且对于有把文章发布到多个平台的需求的人来说,这一点非常重要,Markdown可以很好地统一排版格式,图片链接等。而Wordpress发布Markdown一般都是需要再编辑的(即使用上了插件),不然部分内容的展示会有问题。
上面两点是本次迁移的主要原因,但其实Hexo搭建、配置和美化的过程还是比Wordpress要麻烦很多,毕竟Wordpress是小白都可以用的一键搭站框架,后续管理也有可视化后台,Hexo除了可以统一Markdown发布的优点外,后续的维护、更新发布都没那么方便,而且发布依赖特定环境去生成静态网页,但Hexo的这个Butterfly主题实在是太合适了,而且平时写文也是在电脑上写,并不需要 ...
UGUI性能优化总结
UGUI性能优化总结
UGUI基础
Canvas
Canvas是一个Native层实现的Unity组件,被Unity渲染系统用于渲染分层几何体(layered geometry)在游戏世界空间中。
Canvas负责把它们包含的Mesh合批,生成合适的渲染命令发送给Unity图形系统。以上行为都是在Native C++代码中完成,我们称之为Rebatch或者Batch Build,当一个Canvas中包含的几何体需要Rebacth时,这个Canvas就会被标记为Dirty状态。
Canvas Renderer
几何体数据是通过Canvas Renderer组件被提交到Canvas中。
子Canvas
Canvas组件可以嵌套在另一个Canvas组件下,我们称为子Canvas,子Canvas可以把它的子物体与父Canvas分离,使得当子Canvas被标记为Dirty时,并不会强制让父Canvas也强制Rebuild,反之亦然。但在某些特殊情况下,使用子Canvas进行分离的方法可能会失效,例如当对父Canvas的更改导致子Canvas的大小发生变化时。
Graphic
Graphic是UG ...
UWA 2020年Unity手游性能蓝皮书内容提炼(MMORPG)
UWA 2020年Unity手游性能蓝皮书内容提炼(MMORPG)
前言
数据完全来自:UWA发布|Unity手游性能蓝皮书
提取蓝皮书中的重点数据,原文中用柱状图更直观对比不同数据的差异大小,本文直接用表格形式更直观了解具体数值本身。
数据应该是UWA收集到的各产品实际数据(MMORPG类型),不构成性能指标指导。
CPU
CPU耗时均值
-\ ms
< 17
17-33
33-50
> 50
主体范围
10%
48%
25%
17%
Android设备的CPU均值主体范围为14.7~78.9 ms,且主要集中在17 ~ 33ms和33 ~ 50ms两档。
CPU耗时均值占用分布
模块
占用百分比
渲染
36%
代码
32%
UI
9%
动画
6%
粒子系统
4%
物理
3%
无论是高、中和低端的Android设备,渲染和逻辑代码都是需要研发团队重点关注的,它们的消耗总和占了总开销的近70%。逻辑代码的耗时占比依然很高,这主要与角色、怪物的数量越来越多相关。随着其不断增加,逻辑状态的更新开销、AI开销等都在大幅增 ...
数据结构与算法总结——图
基本概念
图(Graph):一组顶点和一组能够将两个顶点相连的边的集合
顶点(Vertex):图中的数据元素。线性表中我们把数据元素叫元素,树中将数据元素叫结点
边(Edge):两个顶点之间的连接
无向边:若一个顶点到另一个顶点之间的边没有方向,则称这条边为无向边
无向图:图中任意两个顶点之间的边都是无向边
有向边:若一个顶点到另一个顶点之间的边有方向,则称这条边为有向边,也称弧
有向图:图中任意两个顶点之间的边都是有向边
简单图:图中不存在顶点到其自身的边,且不存在重复边
无向完全图:无向图中,任意两个顶点之间都存在边
有向完全图:有向图中,任意两个顶点之间都存在方向互为相反的两条弧
权:与图的边或弧相关的数据
网:带权的图
度:在无向图中,与某一顶点直接相连的变的数目;在有向图中,某个顶点的度是入度和出度的和
入度:在有向图中,表示其他顶点直接指向某个顶点的边的数目
出度:在有向图中,表示从某个顶点出发指向其他顶点的边的数目
路径:路径是由边顺序连接的一系列顶点
简单路径:一条没有重复顶点的路径
路径长度:一条路径上的边的数量
环:一条至少含有一条边且起点和终点相同的路径
简单环 ...
数据结构与算法总结——树
关于树的一些概念
树叶:没有儿子的节点
兄弟:具有相同父亲的节点;类似还有祖父和孙子节点
深度:某节点的深度为树根到该节点的唯一路径的长度
层次:深度相同的节点在同一层中,深度值为层数
结点的度:结点拥有的子树的数目
树的度:树中结点的最大层次
树宽度:树的各层中节点数最多的一层的节点数为树的宽度
无序树:如果树中结点的各子树之间的次序是不重要的,可以交换位置
有序树:如果树中结点的各子树之间的次序是重要的, 不可以交换位置
森林:0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林
二叉树:一种特殊的树,每个双亲的孩子数不超过2个(0个,1个或2个),提供对元素的高效访问。有左孩子和右孩子
退化树:树中只有一个叶子结点,每个非叶子结点只有一个孩子。一颗退化树等价于一个链表
二叉树
二叉树是每个节点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。
性质
二叉树第i层上的结点数目最多为 2^i-1^ (i≥1)
深度为k的二叉树至多有2^k^-1个结点(k≥1)
包含n个结点的二叉树的高度至少为 ...
数据结构与算法总结——哈希表
数据结构与算法总结——哈希表
什么是哈希表
哈希表(HashTable,也叫散列表),是根据关键码值(Key-value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。
哈希表有什么应用
如C++的STL的unordered_map、Java中的HashMap、C#的Dictionary等都是基于哈希表实现。
一个贴切的例子
手机中的通讯录
在查找通讯录某一条目时,我们不需要从头看到尾找一遍,通讯录通常有按首字母分组的功能,例如我们需要找“张三”,我们只需要直接找到“z”索引即可,这就是哈希表查找为什么快的原理。
“张三”是怎么对应到“z”这个索引的,我们需要给出一个算法实现从这个键到索引的转换,我们称为哈希函数。
通讯录可能存在首字母相同的人,例如新增了一个“张飞”的人,他与“张三”一样对应着“z”索引,这种情况我们称为碰撞/冲突。
关于哈希表的基本结构、哈希函数的实现、冲突的解决方式是本文主要讨论内容。
哈希表的基本结构
哈希表的基本结构是一个数组,哈希表访问速度之所以 ...
数据结构与算法总结——线性表
数组和链表
数组
数组内存分配在连续的内存区域上。
数组需要预申请大小,可能造成内存浪费。
随机读取效率高,因为数组内存是连续的,知道每一个数据的地址,可以直接找到指定索引数据。
增删效率低,需要移动受影响的数据的位置。
由于内存区域连续,有CPU缓存命中高的优势,访问效率高。
链表
链表可分配在内存任意地方,不要求连续。
无需预指定大小,可自由调整数据量。
不支持随机读取,查询数据较慢,需要从头开始遍历查找。
增删速度快,只需要修改指针指向即可。
由于内存分散,往往前后节点数据不能同时处于缓存中,访问效率低。
时间复杂度
/
数组
链表
读取
O(1)
O(n)
插入
O(n)
O(1)
删除
O(n)
O(1)
动态数组
根据元素个数动态调整数组大小
实现
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566public class List<T&g ...