0%

为什么选择游戏行业

在刚准备转行做游戏的时候,面试的时候总会遇到这样的问题,时间一晃而过,已是八年光景。还记得当时我给出的回答是:想做一款好玩的游戏,能给人们带来快乐。

当然,游戏行业薪资高 这个原由我是无论如何也说不出口的。

初入职场的那几年,自己真的就像白纸一样,对待什么都是好奇而敬畏。就像误入荷叶上的蚂蚁,遇到露珠便以为这是汪洋。很快,荷叶上的露珠都探索了遍,跌跌撞撞掉进了更加“广袤”的池塘。

阅读全文 »

$$
{\mathcal L}{cyc}(G,F)={\mathbb E}{x \sim p_{data}(x)}[{|F(G(x))-x|}{1}]+{\mathbb E}{y \sim p_{data}(y)}[{|G(F(y))-y|}_{1}]
$$

$$
a = b + c
$$

基础概念

PBR(Physically Based Rendering) 定义

使用基于物理原理和微平面理论建模的着色、光照模型,以及使用从现实中测量的表面参数来准确表示真实世界材质的理念。

微平面(Microfacet)理论

任何物体表面,微观层面上都是由许多随机凹凸不平的微面元(光学光滑)构成,物体表面的粗糙度越高,微面元的排列就越混乱。

阅读全文 »

纹理概述

在计算机图形学中,纹理(Texture) 是我们经常会提及的一个名词。

直观的第一印象,很容易会将纹理理解成一张图片,实际上在计算机图形学中,我们也确实会经常通过一张张格式诸如png、jpg之类的图片来获得纹理数据。

但在图形学中,纹理更多地是被认作 一块数据,它也不再局限在2D空间,也会有一维纹理、三维纹理、立方体映射纹理、数组纹理等。

纹理是由 纹素(texel) 构成的,每个纹素记录着相应的颜色信息,它类似于屏幕的 像素(pixel) 但又与像素不保证是一一对应的。

那么纹理为什么会被广泛使用呢?

阅读全文 »

评价一款游戏的性能好坏,我们通常会用到帧率(每秒钟的渲染帧数)作为主要参考指标。当然,手游这块功耗也是一个重要因素,但主要还是看帧率。像MOBA、FPS类的游戏,帧率肯定是越高越好,出于功耗与显示设备的限制,一般跑满也就在60fps左右。而像其他的棋牌、放置类游戏,帧率只要有30fps就足够了。

性能优化要谨遵二八原则20%的代码影响80%的性能瓶颈。因此要合理地找出性能瓶颈所在,避免负优化。下面就三个比较常见的方面:bandwidthdrawcalloverdraw(fillrate)来分别阐述渲染阶段是如何造成性能瓶颈以及对应的解决办法。

阅读全文 »

ECS近年来已然成为游戏开发中比较热门的一种架构模式,最近被大家所熟识并热烈讨论,还是源于GDC2017,《守望先锋》针对它们的ECS架构进行的一次技术分享。针对FPS,MOBA这类的竞技游戏,ECS架构有着得天独厚的优势。下面我们先简单地介绍一下什么是ECS。

  • E – Entity 实体,本质上是存放组件的容器
  • C – Component 组件,游戏所需的所有数据结构
  • S – System 系统,根据组件数据处理逻辑状态的管理器
阅读全文 »

PhysX物理引擎

PhysX是一套由AGEIA公司开发的物理运算引擎(后被NVIDIA收购),简而言之,就是令虚拟世界中的物体运动符合真实世界的物理定律,以使游戏更加富有真实感。PhysX可以由CPU计算,但其程序本身在设计上还可以调用独立的浮点处理器(例如GPU和PPU)来计算,也正因为如此,它可以轻松完成像流体力学模拟那样的大计算量的物理模拟计算。

目前最火热的两款商业游戏引擎Unreal和Unity都采用PhysX作为它们的物理引擎来模拟物理计算,并且PhysX已经于2014年宣布开源,现在在Github上就能免费下载全部源码。不过需要注册NVIDIA的开发者账号,并注册加入其在Github上的组织才能下载源码。

具体方法请参考这里

阅读全文 »

购买vps

伴随着十*大的胜利召开,很多ss服务提供商都相继中招倒戈了,其中也包括我用了两年多的【一支红杏】。最后痛定思痛,决定还是自己折腾一下vps靠谱些,虽然价格上会稍微贵一点,但肯定会更稳定,而且用来搭建新的博客系统也是一个不错的选择。

VPS中文网上发现墙裂推荐了几款vps服务商,最后选择了 搬瓦工 ,虽然性价比可能不是最高的,但是貌似针对中国线路做了很多优化,这样在速度上可能会更有优势吧。至于到底该选择哪家vps服务商,还是仁者见仁智者见智,主要还是得根据自己的切实需求来选择。

阅读全文 »

本文主要参考来自《Learn OpenGL CN 深度测试》这篇教程。

基本概念

在OpenGL中,__深度缓冲__的作用主要是为了防止3D场景中那些被遮挡的面渲染到前面(脱离了现实效果),它像颜色缓冲一样,存储着每个fragment的信息,通常和颜色缓冲区有相同的宽度和高度。深度缓冲区储存着的深度值可以表示为16、24或32位浮点数,多数情况下默认为24位。

下面说说__深度测试__,它发生在OpenGL管线中的fragment着色器运行之后的测试阶段,准确地说是在模板测试之后。深度测试默认是关闭着的,我们可以像这样来打开深度测试:

glEnable(GL_DEPTH_TEST);

开启深度测试就意味着OpenGL会去对深度缓冲中的深度值进行测试,而所谓的深度测试,实际上就是将fragment的实际z值与深度缓冲中存储着的对应z值通过__某种规则__进行比较。如果测试通过,会自动在深度缓冲区存储fragment的z值,测试失败则相应地丢弃该fragment。

【特别注意】在每次渲染之前,应使用glClear(GL_DEPTH_BUFFER_BIT)来清除深度缓冲区,否则仍会保留上一次进行深度测试时所写的深度值。

当然还存在这种情况,我们只想进行深度测试去丢弃那些未通过测试的fragment,但并不希望去更新深度缓冲区。此时,可以通过将其深度掩码设置为 GL_FALSE 来禁用深度缓冲区的写入操作。

glDepthMask(GL_FALSE);
阅读全文 »

元表与元方法

在Lua中并没有真正意义上的面向对象的概念,但通过其强大的数据结构table类型,我们可以模拟出面向对象的情境来。在这之前,需要先介绍一下Lua中的元表与元方法。

元表其实本质上仍是一个table,它为用户提供了自定义行为的途径。在元表中很很多以两个下划线为前缀的键名,我们称为“事件名”,而这个键对应的函数则叫做“元方法”。在元表的键中,除了用于运算操作符、连接操作符、取长操作符和比较操作符之外,还有三种比较常见的键:

__index : 取下标操作,用于访问表中的域
__newindex : 赋值操作,增改表中的域
__call : 函数调用

其中__index在面向对象的实现中十分重要,下面举个例子说明一下__index是如何工作的。当访问一个table中的某个属性时,Lua首先会查找该table中是否包含传入的键,如果找了对应的键,则将对应的值返回。但是如果没有找到键呢,那么Lua会接着去查找该表的元表(当然如果这个表没有元表的话,直接返回nil),如果元表中包含__index键,则会执行其对应的元方法,若__index对应的是table,则会__递归性__地对这个table的元表中的__index进行查找,代码如下:

1
2
3
4
5
6
7
local t = {}
t.a -- is nil
local tt = {}
setmetatable(tt, {
__index = { a = 3 }
})
tt.a -- is 3

上述代码中,tt表的定义并没有a属性,但是我们为它设置了一个元表,在元表中__index对应的table中定义了a的值等于3,因此当我们访问tt.a的时候就会取到3了。这个特性,也可以应用到面向对象的情境上。

阅读全文 »

模拟器下载

Genymotion是一款出色、高效的Android模拟器,其免费版就足以满足一名Android开发者的日常需求,使用之后令人爱不释手。然而,当下载不同版本的Android模拟器的时候,总会发生 Connection timeout occurred 之类的错误,虽然可以断点续传,但还是造成了诸多不便。

解决办法就是拼接出所需下载的url地址,然后通过迅雷等下载工具进行下载,亲测速度虽然仍不是很快,但其稳定性是要好于使用浏览器下载的。在Mac操作系统中,Genymotion的模拟器文件会下载到 ~/.Genymobile/Genymotion/ova 目录中,里面会有你要下载的模拟器文件的全称。然后根据如下规则拼接url:

http://dl.genymotion.com/dists/版本/ova/文件名

以下载7.0的模拟器为例,拼接后的url字就是:

http://dl.genymotion.com/dists/7.0.0/ova/genymotion_vbox86p_7.0_160912_085006.ova

在下载完成后,将ova文件替换至 ~/.Genymobile/Genymotion/ova 即可。

阅读全文 »