暂时未有相关云产品技术能力~
一个混迹游戏行业十几年的测试开发,目前主要做手游的专项测试工作。主流的开发语言虽然都有所了解,但目前仍处于学习阶段。
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
效果和上面的比较相似,Photoshop CS图像黑白调整功能的计算公式为: gray= (max - mid) * ratio_max + (mid - min) * ratio_max_mid + min 公式中:gray为像素灰度值,max、mid和min分别为图像像素R、G、B分量颜色的最大值、中间值和最小值,ratio_max为max所代表的分量颜色(单色)比率,ratio_max_mid则为max与mid两种分量颜色所形成的复色比率。 默认的单色及复色比率为:
Gradient-Map(渐变映射)常用于Color Gradient颜色分级、颜色校正等。本篇主要用于将图像中的灰度范围映射到指定的渐变填充色中,通过渐变映射图来制作不同的效果。 通过修改不同的渐变映射纹理就可以获得不同的效果,好的的效果就需要根据场景制作特定的映射纹理进行调效果,Shader代码相对简单,在片段着色器中进行效果处理,
上两个图就是卷积核,左侧就是简单模糊的卷积核,右侧则是高斯模糊的卷积核。针对左侧的卷积核最终结果想要保持在1的范围内,就必须去平均值。而右侧是已经计算好确保和在1的范围内(超过1之后最终效果就会很亮)。在进行纹理采样时,中间的点为当前的(u,v)坐标,周围的格子坐标就是在当前的坐标上进行偏移“N个单位”。将采样的结果乘以格子中的对应值然后相加,即可得到结果(左侧形式需要除以5)。
前言 消融效果一般用于怪物的死亡表现,主要原理通过随时间修改消融的阈值,丢弃小于阈值的颜色实现消融(也可以通过alpha设为0)。 一、简单消融效果 图2 面版参数 简单的消融效果,Threshold的值是随时间从0-1进行变化。对扰动图采样取r值,通过比较Threshold与R值的大小来进行消融。Noise图可以控制消融的形状,代码如下。
具有深度的水,能够表现水面与岸边的过渡,对于清澈的小溪水面还可以看见水底的内容,本篇就介绍如何实现这种清澈的小溪水。 一、制作过程 在顶点着色器中需要获得当前平面的屏幕坐标,使用内置方法进行获取,具体代码如下:
水在各种游戏场景中还是比较常见的,图1展示的具有波光粼粼的水是不是有那么一回事呢?本篇就简单介绍这种动态水的制作步骤。 首先是自己弄了一个简单的地形场景,然后特地挖了这么一个坑,创建一个面片放在这个坑上面作为水面。需要用到的贴图有两张,一张水波动的法线贴图和一张实现水面波动的扰动图。具体面板上面的参数如下图所示:
前言 上一篇对同一纹理进行多次采样混合,本篇则是通过不同的纹理采样进行混合产生一些效果。 一、简单贴花 贴花简单来说就是在原贴图上面贴上细节贴图,就像墙面上的喷绘一样。下面这个只是最简单的例子,也就是只能在一张图(一个模型)上面贴其他细节。
前言 纹理采样属于在片段着色器中进行,通过提供的贴图和uv坐标使用tex2D进行采样。本篇主要介绍对同一纹理多次采样然后进行混合来获得不同的效果。 [声明:本笔记系列文章的图片资源都源自百度图片搜索,如有问题联系我] 一、简单重影 对同一纹理进行两次采样,采样时的UV两次坐标不一样,然后将采样的结果进行取平均得到最终的结果。
前言 本篇介绍在片段着色器中进行画图操作,主要使用极坐标的方式。具体极坐标方程就需要花时间去学习了,可以通过其中一两个公式进行详细的研究,这样大部分的曲线图就可以绘制出来了。 一、心形线的方程:r = 1 - asinθ
Unity3D Shader学习笔记系列,由于是个人理解后写的,因此可能会出现描述错误,理解不到位的地方。另外没有完全从基础的知识开始,对于刚开始学习的同学还需要看更基础的知识进行补充。 一、顶点动画 将顶点的坐标与三角函数进行算术运算,就可以得到一个在原始位置“左右上下”来回的动画效果。还可以通过定义一个_Direction方向向量来进行来回摆动方向。
游戏的AI行为,很多会使用行为树来代替状态机,而且通过行为树编辑器可以所见即所得,较清晰的逻辑分支执行,是配置AI行为的好工具,一般提供给策划自己进行配置AI行为即可,还是很省工作量的。我最近写了一个工具在业务的实现上想利用行为树来执行逻辑,将工具打包成可执行EXE文件,脚本只需要在行为树编辑器中编辑导出即可运行,因此尝试做了一个简单版本的行为树编辑器。
以黑盒测试来讲,简单概括为以下几个方面来进行保障: 1. 在产品的需求分析阶段,参与需求的评审,发现需求设计中的不合理性以及存在风险的设计等,从源头发现问题,这样可以花费最小的代价获得最高的收益。 2. 在开发设计编码阶段,如果有设计评审环节,需要参与设计讨论,这样就可以尽早的了解技术的实现逻辑,获取更多影响测试质量的因素,完善测试用例。可能在游戏行业很少会进行编码设计环节的评审,但作为测试人员最好可以在技术忙碌之余主动去了解设计实现,知道技术设计的逻辑流程,从而编写具有针对性的测试用例。
总体说来,Android App Bundle打包有3种方式,每种方式都有成功上架Google Play进行测试通过,因此实用程度还是挺高的。能够理解以下内容的前提是会打apk包,知道如何生成Asset Bundle文件,这块内容可以参考我的上一篇文章。
生成Bundle文件主要是如何对资源进行设置Bundle名及其分类的过程。目前有两种方式,第一种就是在编辑器里面设置每个资源的Bundle名称(如图1),这是最简单直观的操作方式;另一种方式就是通过编写代码并配合资源配置文件进行控制,先通过代码遍历项目工程的资源然后根据资源配置设置其Bundle名称,也可以暴力的按照资源类型进行分类,由于不同项目的控制方式不同,因此就不过多介绍。
Java可以使用Tomcat提供的WebSocket库接口实现WebSocket服务,代码编写也非常的简单。现在的H5联网游戏基本上都是使用WebSocket协议,基于长连接,服务器可以主动推送消息,而不是传统的网页采用客户端轮询的方式获取服务器的消息。下面给出简单使用Tomcat的WebSocket服务的基本代码结构。
Java使用NIO进行HTTPS协议访问的时候,离不开SSLContext和SSLEngine两个类。我们只需要在Connect操作、Connected操作、Read和Write操作中加入SSL相关的处理即可。
通过前面三篇文章已经初步实现了将Lua源代码文件读取解析成语法树,现在就可以通过得到的语法树进行指定规则的代码扫描检查。下图简单列举了一下单个Lua文件内部的语法关系情况(注意并非真正的类图,也没有列举完全部的节点类型)。
一、语法分析 通过将词法分析获取的Token流按照目标语言的语法进行解析的过程,例如解析函数声明、函数调用、变量声明、各种语句等。 二、Lua语法分析 在写语法分析程序前,先需要了解Lua的语句和语法,然后进行逐个解析。 下面简单列举一下Lua的语句:
词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。
静态代码分析是一种通过检查代码而不是执行程序来发现源代码中错误的手段。通常可以帮助我们发现常见的编码错误,例如: 语法错误 违反制定的标准编码 未定义的变量 安全性问题 静态代码分析可以通过评估编写的代码来提高代码质量;可以稳定的运行且可以轻松自动化;增加了在源代码中发现漏洞的可能性,从而提高应用安全;由于是针对源码扫描可以在离线的开发环境中完成。但是静态代码分析并不能完全保证编写的代码没有Bug,它也有一些缺点,
使用Python开发GUI界面工具,通常可用选择PyQt框架,非常易使用,而且网上也有很多相关的文档分享。我也是在写了多个GUI界面后,自己整理了一些常用的使用文档,在此分享给大家(PyQt4~PyQt5适用)。
使用Python开发GUI界面工具,通常可用选择PyQt框架,非常易使用,而且网上也有很多相关的文档分享。我也是在写了多个GUI界面后,自己整理了一些常用的使用文档,在此分享给大家(PyQt4~PyQt5适用)。
采用系统的内存分配策略,程序运行久了容易产生内存碎片,而且每次都从系统申请,然后释放归还给系统会消耗一定的性能。当然现在基本上都有现成的内存分配框架,例如tcmalloc。自己写除非是特殊应用场景,否则一般不会比系统默认的那套性能高效。本篇就介绍一个简单的内存池,属于玩具系列,不可在正式项目中使用。
游戏具有较悠久的历史,而多数的游戏题材也大多都是相似的。在制作游戏时为了获得更多投资人的支持,一般都是拿市面成功的类似游戏进行对比,而玩法上也多采用“借鉴”的方式。虽然玩法的分析可以采用体验游戏,但如果希望分析美术制作工艺,好的表现效果等就需要尝试其他方式了。
我在准备开发协议测试工具的时候,在网上搜索了很多资料,偶然发现了这个强大的库,简单方便的API使得一切都变得容易,今天就来简单介绍一下它。 步骤一、下载windivert的代码库,官方网站 百度搜WinDivert
有时候一个系统或活动玩法测试完成后,上线对外更新就会遇到各种问题,其中就有一些是因为人数多造成的。平时在对系统或活动玩法测试的时候由于时间、人力等问题,往往只注重了功能的验收,会遗漏一些功能之外的因素,而这些因素往往会造成比较严重的后果。接下来具体进行介绍,另外本文图片均来源于网络,如有问题请与我联系。
上上下下左右左右BA、whosyourdaddy、HOW DO YOU TURN THIS ON、show me the money ...... 这些都是曾经经典游戏中的作弊代码,可以说都留下了无数的美好回忆。但在网络游戏横飞的今天,作弊往往就代表着不公平的对抗,不平衡的资源市场,以及不友好的游戏体验等。目前的手游市场依然被这些作弊问题所困扰,今天就来介绍一些常见的作弊方式。
单例模式是比较简单的设计模式之一,其涉及单一的类,该类负责创建自己,并确保只有单个的对象被创建,给外部提供其唯一的对象访问方式,并且外部不需要显示的实例化该类。今天我们就来介绍Python中编写单例类的一些方法。
仔细看一下上面的时序图可以发现,步骤2进行了数量检查,在检查成功后发送确认框让玩家进行确认,玩家确认后,步骤5就直接执行了兑换。那么问题是这样的,如果服务器发送二次确认后,玩家发送确认前先将材料转移到其他地方例如仓库或邮寄给其他玩家,然后再告诉服务器确认兑换,那么步骤5直接执行兑换就有问题了。
最近有朋友问测试用例相关的内容,我就冒充一名测试人员写下这篇文章图片。文章写的应该会比较的粗,从比较浅的视角下介绍功能测试是如何进行功能测试点分析的,以及测试用例的编写需要包含的一些关键点。如果想了解测试方法的话可以去相应的论坛或者找书籍进行学习哦,本文就不会涉及到这些知识点啦。
现在市面上有各种各样的游戏,其服务器的架构也是千差万别,一个好的服务器框架往往离不开一个稳定可靠的网络通信模块。在做服务器性能测试的时候,特别需要针对服务器的网络通信模块做详细的压测,以确保其稳定可靠。压测过程中肯定会遇到各种问题,如果能够深入去理解这些问题的话,那么就可以掌握更多的知识。本篇就简单介绍一些与网络有关的问题。
首先来看一个简化版本的购买物品时序图,步骤不多但应该包含了核心内容。其中出问题在于步骤6、7上。服务器是先将玩家需要获得的物品加入到背包中,然后才去扣除对应的货币。这个时候就可能产生了一个“吃霸王餐”的漏洞,假如扣除货币失败了,由于先给玩家添加了物品,因此就变成了免费获得了所购买物品。而当一个玩家产生了这样的漏洞就会一传十,十传百,很快就会让整个游戏的经济循环出现问题,如果游戏厂商发现的晚的话,补救措施就更难了。
游戏中背包是很常见的系统,游戏的系统会投放各种各样的物品给玩家,存放在玩家的背包之中。背包可能会分几个类型,然后每个类型都可以存储一定数量的对应物品。一旦背包容量满了之后就无法再获得物品,例如无法领取任务奖励,无法拾取道具,无法购买道具等限制
一、前言 有时候写代码时需要对一个对象的内部数据进行遍历,而且希望可以for ... in ... 的操作来方便使用,那么就可以使用迭代器来解决。 二、使用函数来包装迭代 具体代码如下,例子使用list列表来简单介绍,在实际使用场景中可以复杂多变。虽然是一个while True的循环,但里面用yield实现迭代器功能,包含yield的函数不再是普通函数。通过raise StopIteration异常来完成迭代。
首先决定服务器性能的主要指标有:CPU、内存、网络,其实还有一个隐形的指标就是数据稳定,即不可产生数据丢失、数据异常。CPU主要消耗在逻辑运算上,几乎所有的业务都需要消耗CPU;内存主要指加载进内存后生成的对象所占用的内存,除了防止业务产生内存泄漏外,还需要避免整体内存占用过高;网络主要产生在服务器与客户端或其他网元节点数据交互上,占用较高网络带宽不仅产生流量费用,而且会引起游戏体验的卡顿。
使用图像识别技术进行客户端游戏自动化是一种比较通用快捷的做法,是一种不依赖游戏客户端的外部自动化操作。在结合方便的脚本编辑工具后,使得这种自动化测试方式和按键精灵一样门槛极低。 将游戏客户端屏幕内容进行截图。在windows平台需要调用系统获取屏幕内容API进行屏幕画面保存。在Android平台可以调用adb命名进行截图保存。
通过使用学习tornado、bottle的模板语言,我也效仿着实现可以独立使用的模板渲染的代码模块,模板语法来自tornado和bottle的语法。可以用来做一些简单的网页渲染,邮件内容生成等HTML显示方面。以下就是简单的语法使用介绍。
通过使用学习tornado、bottle的模板语言,我也效仿着实现可以独立使用的模板渲染的代码模块,模板语法来自tornado和bottle的语法。可以用来做一些简单的网页渲染,邮件内容生成等HTML显示方面。以下就是简单的语法使用介绍。
最近遇到一个很头疼的问题,用Java写的工具运行几天后,内存涨到8G以上,我用jvisualvm监控发现堆内存持续稳定未出现泄漏,然后就各种搜问题,最后经过1周多时间排查处理,最后终于修复了,因此记录一下。
熟悉Linux的都知道在Linux下有一个crontab的定时任务,可以很方便的进行各种定时、计划任务的执行。有时候写代码也需要用到定时器业务,因此我使用Python实现了一个类似的定时器模块,可以很方便的做定时业务,使用例子如下
熟悉Linux的都知道在Linux下有一个crontab的定时任务,可以很方便的进行各种定时、计划任务的执行。有时候写代码也需要用到定时器业务,因此我使用Python实现了一个类似的定时器模块,可以很方便的做定时业务,使用例子如下:
对网络游戏服务器进行性能压测时,压测工具一般是模拟大量客户端连接服务器进行协议接口请求并发来压测服务器,因此就需要具有高并发的网络模块支持。本篇主要介绍我所了解的网络相关的知识。 当调用一个IO函数例如下面的recv函数,程序会进入阻塞,等待数据准备好,如果数据没有准备好将一直阻塞在recv处,直到有数据从系统内核拷贝到用户空间(即同步IO),然后IO函数返回读取的数据。还有recvfrom、send、sendto、accept、connect也是同理。
网络游戏前后端通信的消息协议始终是基于制定的规则,即发送端使用什么样的方式进行序列化,接收端就需要使用对应的方式进行反序列化,只有这样才能保证发收双方能够正常“交流” 消息协议的组成离不开基础数据类型,这些数据类型包括单字符(char)、短整型(short)、整型(int)、长整型(long long)、浮点数(float,double)、字符串(char* / string)。这些数据类型具体占多少字节可以参考游戏协议测试一:协议测试介绍。
有时候使用Python写的工具需要给其他人使用,但不同的电脑上面环境各不相同,安装Python还需要装对应的库,比较麻烦,打包成可执行文件是一个很好的解决方案。刚开始打包执行文件时采用的是py2exe,后来由于打包时包含库的问题处理麻烦换了pyinstaller,总体来说后者还是稍微好用一点。
为什么有离线安装这种需求呢?在高度注重信息安全的今天,很多时候办公都是在独立的网络环境中称作内网,无法访问外部网络即外网。当内网开发需要某个库时,安装是一件痛苦的事情,下载了需要的库后还要下载一些列依赖库,而依赖库往往是在安装中才发现的,这样就形成了反反复复的外网找库传内网安装的操作。有没有更好的办法呢?当然有!
游戏客户端通常是与服务器直接进行通信,如何通过工具来进行协议的修改和创建呢?第一种就是直接在客户端代码里面增加一些类似GM指令的测试接口,来达到对每个接口的测试目的。第二种就是从外部对双方的通讯网络下手,通过第三方将协议截获修改后再发送给对方,从而达到协议测试的目的如图1,本篇文章就是针对第二种方式来做介绍。
做了一个简单的压测交互关系,对服务器压测需要大量的“真实”用户,每个用户都是独立与服务器进行协议通信。首先压测工具需要有网络模块的支持,目前大部分的游戏网络通信是基于TCP协议的,也有一些是基于UDP协议的。其次同时需要支持这么多用户运行,就需要考虑多线程模块。最后就是压测所需的并发控制与事务统计等功能。 1. 网络编程 压测的用户数会需要很多,少则三五千,多则上万。图1的用户与socket比例为1:1可以看出,创建socket的对象数量也会很大,而实际压测中很多情况下用户与socket比例可能会更高。