- 博客(250)
- 资源 (23)
- 收藏
- 关注

原创 《游戏架构:核心技术与面试精粹》勘误
《游戏架构:核心技术与面试精粹》的勘误页,发现书中的错误可以在本页面下留言,我会定期将内容整理到正文中。P8:监视器(monito)-> monitorP120:GPU就是做这些准备工作的-> CPU就是做这些准备工作的P137点乘 ( Cross ) 又叫外积 -> 叉乘(Cross)又叫外积...
2018-07-19 00:00:28
2018
原创 Unity3d 制定游戏循环的策略
在使用Unity3d开发游戏的时,我们总会涉及Unity内置的生命周期函数。弄清这些函数的调用顺序和特性十分重要,因为这影响到逻辑的执行顺序,例如:初始化要在使用之前,注册回调要在响应之前等等。通常说来,在大型商业项目中,我们需要自制一套游戏循环,来满足多变的游戏玩法。哪些现有的生命周期函数可以使用?哪些需要被替换掉?这些取舍贯穿了整个游戏开发过程。生命周期Unity3d的函数调用有固...
2018-09-13 17:36:29
2393
原创 UGUI事件传递流程解析
很多Unity3D项目都使用了UGUI,但并不是所有人都研究过它的内部结构。针对事件的传递过程,会问住大多数未深入思考过的开发者。由于UGUI是开源的,我们可以通过查看源码来熟悉它的原理,它的地址在可以找到。事件体系首先要说明,事件体系的基础是设计模式中的观察者模式,因此按照标准的Subject和Observer来解读没有任何问题。但在这里,我更希望以功能为导向,将事件体系划分成更易于...
2018-08-27 13:21:49
3296
原创 OpenGL(二十) 投影 的shader实现
简单说来 投影 是将一个纹理贴到另一个模型或图片上的技术。在现实生活中,皮影戏就是根据这个原理产生的。原理参照皮影戏,我们需要一个投射器,一个采样图和一个成像模型。这样一想,跟OpenGL(十九)阴影 通过ShadowMap的shader实现中提到的投影模型是差不多的。不同之处在于,不需要采集深度图,当进行到第二步时,也不需要比较深度。而是直接取出采样图中texcoord对应的颜色进行混合。实现依...
2018-02-10 11:00:37
1593
原创 OpenGL(十九) 阴影 通过ShadowMap的shader实现
阴影 可以使角色与地面的关系更加明确。本文主要介绍如何通过 ShadowMap 在OpenGL中实现 阴影 。核心原理Shadow Map的基本思想:通过LightView画一张DepthMap,然后Camera View渲场景的时候,把Pixel坐标变换到Light Space,比较Depth即可(Pixel的Depth大于Shadow Map的Depth即在阴影区)。也可以直接是ScreenS...
2018-02-10 10:57:14
2628
原创 OpenGL(十八)Gamma校正 色域 与 HDR
通常来说,在不同设备上看到的颜色是不同的。其中最常提及的概念是高动态光照渲染(High-Dynamic Range,简称 HDR )。它可以使图像在亮度的表现上更丰富。这篇文章讨论设备颜色和校正的相关概念。眼前的黑不是黑人眼对亮度的敏感程度不是线性的,因此我们我们更容易看到亮的区域。上图中左侧是线性渐变的图,右侧是我们实际看到的。在显示器上,输入线性信号就会显示出右图的效果。为了解决这个问题,在显...
2018-02-10 10:52:41
7079
原创 OpenGL(十七)Photoshop blend算法 与 图层混合模式
使用混合模式可以制作丰富多彩的效果。而OpenGL中可以轻松开启这种模式,但更关键的是图形算法。本文参照 Photoshop blend算法 ,介绍如何通过shader,在OpenGL中实现混合效果。OpenGL中开启混合在OpenGL中可以开启混合模式:glEnable( GL_BLEND ); // 启用混合glDisable( GL_BLEND ); // 禁用关闭混合统一说法,参...
2018-02-10 10:47:58
5282
原创 OpenGL(十六)通过 卷积 实现: 边缘混合 、 Blur 和 高斯模糊
卷积卷积 (Convolution)是两个变量在某范围内相乘后求和的结果。卷积计算通常用来处理边缘的颜色或整体的混色。作为采样之后的处理,可以供很多功能使用。因此在图像效果处理时,它还是应用比较广泛的。区域缩暗通过最简单的像素采样,可以将图片中整体的锐利度降低,通过在一个3x3的区域取颜色,并取出区域中的最小色值,可以实现整体变暗,并且边界会像内缩一段距离。void main(){ ve
2018-02-05 19:59:33
9423
1
原创 OpenGL(十五)雾效 的 shader 实现
雾效 可以表现出一个线性的颜色变化,常用于烘托场景气氛。这种效果的实现原理并不复杂,本文着重讨论如何通过shader编写完成雾效的实现。核心原理雾效 的核心在于:计算视点与物体之间的距离,然后根据一个衰减公式进行颜色混合。常规的算法有线性衰减,指数衰减,指数幂衰减。线性雾效使用线性差值衰减,即可达到这种 雾效 。示意图如下:对应shader如下://vsvarying vec3 V_Normal
2018-01-29 18:05:00
4252
原创 OpenGL(十四)环境反射 环境折射 的shader实现
在上一节我们讲解了如何制作天空盒,本篇文章介绍它的一个衍生功能——在物体上叠加 环境反射 。核心原理核心很简单,在天空盒中,视线照射到天空盒上的区域即需要绘制的部分。在环境反射中,需要绘制的区域变成了视线在物体表面的反射光线,反射光线照射到天空盒的位置即要绘制的部分。环境反射按照上面的说法,将法线方向传入shader中,具体编写如下://vsattribute vec3 pos;attribu
2018-01-22 13:41:53
2178
原创 Unit3d开发 (二十一) 更改Apk的smali 排查Java层问题
有时候我们会被系统层诡异的Bug绊翻了车,不得已的情况下,需要更改Android代码。有些类我们能拿到源码,一切好说,但更多情况下,是引擎内或SDK中的jar文件,我们无法获得源码。面对这种情况,我的思路是......
2017-09-20 13:52:43
1158
原创 OpenGL(十三) 天空盒 的 shader 实现
天空盒 的使用可以使用户感觉所处一个封闭的世界环境,使得游戏更加真实。本文主要介绍如何通过OpenGL和GLSL来实现天空盒。天空盒 的核心原理其实并不复杂,它相当于在视线外套上一个盒子。盒子有6个面,分别使用6张可以拼接在一起的图片。从原理上讲,通过比较视线的xyz,可以找到方向...
2017-06-19 15:05:23
6575
原创 OpenGL(十二) 光源类型 平行光 、 点光源 、 聚光灯 的实现
常规的 光源类型 有三种。最简单的自然是平行光。稍复杂些的为点光源,最复杂的为聚光灯。总体说来,在可编程管线中原理是一样的。在OpenGL代码中传入必要的参数,在shader中进行相关的计算绘制出效果。本文分别介绍三种效果的shader实现。
2017-05-17 10:49:25
9739
原创 OpenGL(十一) 可编程管线 基础光照 的实现
在OpenGL中创建 基础光照 ,主要的工作将模型中的法线信息和法线空间运算矩阵传入到shader中。另一方面,LightDir,ViewDir通常是在shader中从引擎参数获取的,为了简化光照模型的实现,这里我们可以在shader中写死...
2017-05-02 15:01:00
3341
原创 OpenGL(十) 手机不可用特性 ComputeShader GeometryShader ...
由于当前市场上还存在大量低端Android机器,它们只支持到OpenGL ES2.0,因此 手机不可用特性 有很多。对于一些3.0 甚至4.0的特性,只能看看热闹了。当然基本了解还是需要的,万一哪天都升级到3.0了呢。由于我现在也使用Unity3d开发,文中也有Unity3d的相关指标一起参考...
2017-04-25 14:05:34
6602
1
原创 OpenGL(九)使用 FrameBufferObject
在OpenGL中所有的图形,都会绘制到 FrameBufferObject 上。如果想使用界面的做分屏渲染,或需要屏幕图像制成贴图以备后期处理,就需要用到 FrameBufferObject 技术,这种方式也被称为 RTT (Render to Texture)。
2017-04-19 15:27:55
7607
原创 Dota2 AI 开发 (二)定制AI阵容 配置英雄出装
在Dota2 AI 开发(一)环境配置 中介绍了如何搭建 Dota2 AI 的开发环境,但这是远远不够的,在这篇文章中,主要介绍Dota2中AI的常规控制方式,并介绍如何在人机比赛中配置一个裸跳刀的Sven。
2017-04-17 10:50:58
7020
原创 OpenGL(八)使用 subroutine 切换可编程管线
Subroutine 功能是在OpenGL 4.0 版本里才增加的,因此对于各种Android手机,这个功能基本跪了。如果你发现你的程序报错:ARB_shader_subroutine,那就说明当前显卡不支持。不过大体思路可以了解一下,因为思路类似的功能有其他的实现方式。
2017-04-14 13:57:42
3152
原创 OpenGL(七) GeometryInstancing 几何体实例化
几何体实例化( GeometryInstancing ),是一种用于大批量重复物件渲染的GPU技术,以降低客户端和显卡端数据传输量,所谓的“一次提交,多次渲染”。简单说来就是合并DrawCall。通过接口可以绘制多次几何体,这样就可以实现合并。
2017-04-10 15:34:33
2277
原创 OpenGL(六)使用 VAO 打包指令 优化代码结构
通常说来当创建好vbo的数据结构,还需要设置 glVertexAttribPointer 等一系列属性,在OpenGL中提供了 VAO (Vertex Array Object)它相当于同时记录了数据在哪里和数据是怎样分布。从实际应用的角度,它最重要的贡献就是简化了代码。
2017-03-29 12:16:48
1931
原创 OpenGL(五) 指令错误 检测的封装方法
OpenGL的指令,返回值均为void,因此没法通过返回值来判断 指令错误 。为了能够第一时间发现问题,需要加入一个封装来监测是否有指令调用失败。当OpenGL调用出现错误时,会将错误的ID储存到一个`GLenum`中。这个值可以通过glGetError()获取到。
2017-03-27 13:43:38
3274
原创 Unity3d开发(二十) OnMouse_产生GC 的问题修复
最近发现一个特别奇怪的现象,在游戏运行时,每帧 OnMouse_产生GC ,大小是0.6KB的整数倍,比如1.2KB,1.8KB。解决方法 :具体Profiler效果如下图所示:经过比照发现这个问题与摄像机相关。由于是代码创建的摄像机组件,因此并未挂载....
2017-03-21 16:30:37
2999
原创 OpenGL(四)Shader错误 检测
由于shader不需要预编译,因此在OpenGL动态加载时会碰到 shader错误 。因此需要区分错误属于C++代码还是shader代码。本文主要探讨如何封装检测 shader错误 的接口。在OpenGL中有方法能够获取到 shader错误 信息。
2017-03-20 12:53:29
7099
1
原创 OpenGL(三) 加载贴图
有了模型还需要贴图。 加载贴图 的流程大体分为两部分,首先是图片的解码,其次是使用UV坐标与模型对应。本文主要从底层原理和第三方库两个方面来介绍 加载贴图 。下面分别介绍硬编码实现和SOIL库两种方式。因为加载不同的类型图片偏移值不一样,加载图片之前要确定图片类型...
2017-03-15 12:12:08
4722
1
原创 OpenGL(二)加载模型
在OpenGL(一) OpenGL管线 与 可编程管线流程中,提到加载VBO、IBO的相关技术,本篇详细说一下。实际应用时,我们是不可能手写顶点和索引点。通常模型是使用3dMax或Maya制作,然后在OpenGL程序中 加载模型 。本文着重分析这些文件的格式以及 加载模型 的流程和方法。
2017-03-13 12:59:15
4090
2
原创 OpenGL(一) OpenGL管线 与 可编程管线流程
由于OpenGL是一个纯渲染核心,要写OpenGL程序,得先搭建一个外壳程序。不同平台下外壳程序的实现各有不同,这个系列的文章都在win32的平台上进行。具体实现,网上能找到很多,所以这不是本文的重点。本篇主要构建探讨 OpenGL管线 本身,具体说来,就是构建可编程管线。
2017-03-10 12:21:18
4878
原创 HelloWorld 游戏开发板块
刚刚创建了 游戏开发() 的极客头条主题,跟游戏开发相关的帖子可以发表到这个板块。希望大家能关注这个主题。Unity3d、UE、Cocos2d-x、Ogre各种技术都没问题,也可以不纠结于语言层面,性能优化啦,设计架构啦,资源组织之类的也都可以有~旨在互相学习交流,尽量做出不那么做辣鸡的游戏 ~>_<~...
2017-03-07 11:37:38
437
原创 99%游戏开发者都不知道的游戏运营词汇
作为游戏开发者,在实际工作过程中经常遇到一些 游戏运营词汇 。它们可以从各个层面来衡量游戏的健康状态,供我们进行分析,发现游戏存在的问题。那么究竟该留意哪些些数据呢?或者说该从何入手了解这些数据?本文提供一个简单的索引,帮助大家认清方向,同时也可以方便的查看相关的概念。
2017-03-06 15:19:19
9361
原创 Unity3d开发(十九)调整SortingOrder解决UGUI中粒子层级问题
为了做出更酷炫的的UI效果,通常要在UI中加入粒子效果。但与纯2D的UI动画或Spine不同,粒子在场景中制作,会存在与UI的穿插问题。本文探讨如何更改特效或UI的 SortingOrder 避免特效的穿插问题。
2017-03-03 15:06:14
18581
1
原创 如何写好简历
这段时间是跳槽的高峰季,公司自然也准备吸纳些人,所以最近看了不少简历,发现好多人根本不知道该怎么写,今天就谈谈如何写好简历。个人经验,仅供参考。行业不同,简历也千差万别。但从我这几年管理和招聘人才的经验来看,差简历有共通之处,只要能避免下面的忌讳,就是一份不错的简历。这些忌讳如下...
2017-03-01 11:39:45
2993
原创 Dota2 AI开发(一)环境配置
最近打Dota2,发现人机对战电脑AI,特别的傻。过了30分钟,友军又不带线,又不打野,来来回来闲逛;敌军5人抱团满图抓我。这种1V5经常以被控到死收场,真是伤感。忽然想起V社似乎开放了AI接口,身为游戏开发者,拯救万民于水火义不容辞啊。树枝吃喝买起来,就有了这个系列的文章。由于平时破事一堆,尽量保证不太监吧...
2017-02-27 00:45:00
9180
3
原创 Unity3d开发(十八) 监听编辑器状态改变,制定自定义回调
做编辑器插件时,我总是想要拿到监听编辑器的状态变化。比如在打开编辑器开始运行自己的服务。这时就需要用户打开编辑器的事件。另一方面,我希望用观察者模式,并且能自动化注册。因为我注意到,导入资源时的 AssetImporter 回调就是这样做的。用户只需要实现一个接口,就可以收到回调。极大的简化了扩展流程。编辑器代码又不必考虑效率问题,借助C#的反射,可以很容易的实现这种功能。这篇文章主要介绍如何实现这样的架构...
2016-11-24 11:52:08
10877
2
原创 C# 的常见误区整理
本文为《编写高质量的代码:改善C#程序的157个建议》中整理出来对我有用的知识,算是读书笔记吧。所以并不全,有兴趣了解详情的童鞋可以去买纸质书一探究竟。
2016-10-11 17:35:39
1643
1
原创 Unity3d开发(十七)UGUI 事件体系分析
很多Unity3D项目都使用了UGUI,但并不是所有人都研究过它的内部结构。由于准备定制自己的UI,不弄明白它内部的机制有点说不过去呢。这篇文章主要分析一下它的事件体系结构,以及点击事件的逻辑流程。
2016-10-10 16:26:40
4438
原创 Unity3d开发(十六) 重写UGUI组件
作为Unity3d新版本的UI系统,UGUI以其易用性,逐渐被多数团队所接纳。但随着应用的深入,团队中总有需要自定义一套UI系统的需求。所幸UGUI是一个开源项目,可以在Unity3d的官方的Bitbucket代码库中找到源码。有了源码当然我们可以采用一劳永逸的办法,重编DLL库,并替换掉对应的库实现重写。但我还是不太推荐这样,因为一旦如此做,就无法跟随Unity3d版本升级了。因此本文主要介绍如何通过子类实现重写.
2016-09-27 18:04:32
8172
2
原创 Unity3d开发(十四) AssetBundle中的资源提取
做过破解的人都知道,游戏中的美术资源没法完全加密,即便使用特别复杂的加密方式,也有办法将其中的资源提出来。这里不讨论的太深,只借助现成的工具,做些浅显的资源提取。
2016-06-22 16:17:01
36755
5
原创 Unity3d开发(十三)导出NavMesh可行走区域信息
有时我们会需要Unity3d的地图信息,比如A*之类的逻辑运算。当这些操作要放到服务器上进行时,就需要地图信息。通常项目中的行走区域是使用Navmesh制作的。这篇文章中,介绍如何将Navmesh的信息导出成bitmap
2016-06-17 12:15:11
17731
原创 Unity3d开发(十二)使用Menu.SetCheck更改菜单勾选状态
一些改变状态量的需求,例如:是否输出日志。通常的做法是在代码中更改,不过这需要重新编译,而且也对非程序人员不友好 。更灵活的做法是使用本地变量存储,不过这写起来比较麻烦。最近我发现Unity有个接口可以干净的解决这个问题,我使用的是Unity5.3版本。
2016-04-27 16:24:04
6432
Cocos2d-x 3.x 开发(十八)自动Batch和自动剔除
2014-05-25
Cocos2d-x 3.0开发(三)点击交互的四种处理beta2版代码
2014-01-30
Cocos2d-x 3.0 开发(十五)使用UILayout布局,制作对话界面
2013-12-17
Cocos2d-x 3.0 开发(十四)使用UIScrollView 实现大小不同物品拖动展示
2013-12-12
Cocos2d-x 3.0 开发(九)使用Physicals代替Box2D和chipmunk的3.0 alpha1新版本
2013-12-03
Cocos2d-x 3.0开发(十三)使用CocoStudio编辑帧事件并关联到程序
2013-11-27
Cocos2d-x 3.0 开发(十)使用CocoStudio场景编辑器关联组件
2013-11-08
Cocos2d-x 3.0 开发(九)使用Physicals代替Box2D和chipmunk
2013-11-04
Cocos2d-x 3.0 开发(八)骨骼动画的动态换肤
2013-10-25
Cocos2d-x 3.0 开发(七)在程序中处理cocoStudio导出动画Demo
2013-10-22
Cocos2d-x 3.0 关联程序逻辑与cocoStudio导出文件
2013-10-16
Cocos2d-x3.0 使用CocoStudio创建UI并加载到程序中
2013-10-15
Cocos2d-x3.0 四种点击交互处理Demo
2013-10-14
Excel 配置导出实例
2013-08-15
获取 ios 系统网络状况、电量
2013-05-14
TMX官方忍者游戏cocos2d-x实现(三)
2013-05-03
TMX官方忍者游戏cocos2d-x实现(一)
2013-04-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人