游戏前端工作流程总结

序言

不断总结完善方法论可以在类似的事物中提供指导和依据,下面是我作为前端游戏程序员对工作流程的经验总结。考虑比较复杂的情况,据实际情况酌情简化或者增加细节。本文多是经验所得,主观性较强,欢迎讨论交流和批评!

流程

大概流程如图所示,部分细节在下面说明
image

需求宣讲

一般比较复杂的需求会要求策划对需求进行宣讲,需重点听下需求涉及哪些领域,主要功能、流程,并初步判断可行性、复杂度、成本等并提出相关建议

需求分析

先根据需求手册和视觉稿流程、功能、细节、实现方式捋一遍,有必要的话(据经验需求手册并不把每个细节都讲清楚)拽上策划同学把有疑问的地方对一遍。

预研

在遇到不熟悉的领域或者一些复杂的技术,要提前验证是否能够实现和实现成本甚至做一个demo。另外,有些问题可能有多个解决方案调研选择更合适的。

建模

可以在抽象的层面上大致的提供完成需求的理论模型,方便开发者伙伴之间沟通合作,并为开发编码提供蓝本。模型是编程语言之上对业务的抽象,理想情况下编码前要“胸有成竹”。建模方法有很多,由于公司没有要求特定方法,我一般采用类似DDD的方法,领域包含核心功能,支撑,和给外面用通用部分,必要时辅以流程和状态图。追求实用。

依赖确认

在开发前,先确认下配置表、协议、美术资源、依赖的接口的实现情况,理想情况是都准备好了,但是实际情况可能在开发中陆续交付,根据情况做好打算。另外,也有些别的模块,可能要依赖此模块,也要同其他开发者交代大概的时间。

反向宣讲

此时需求基本确认完毕,准备开始开发了。做最后的确认,以要求中途不会变更需求和其他依赖交付的延期。并给出大概的开发周期,以方便其他伙伴准备工作日程。

开发

我大多从总体框架开始,即尽量从最上层的抽象入手。然后是确认边界,包含各个抽象的职责范围,职责的极端情况等。随即就是对抽象具象化,我的习惯是从数据层开始,包含数据的增改删查,以及各州数据变更必要的通知。然后是逻辑层,最后是表现层,这是个人经验总结下来最高效的顺序,我想大概是因为绝大多是情况下是数据驱动表现。开发完成(某个阶段),需要进行阶段性的测试,对于前端来说,我一般会模拟下后台发的数据,以尽量确定联调出现的问题不是前端的问题。最后就是联调和需求完整的自测。

验收

开发和自测完成,要通知伙伴进行验收,通常会有PM,策划,美术(多是确认美术效果)及其他依赖此需求的小伙伴。处理验收反馈和bug,然后转测,通常还会处理一波反馈和bug。

归档

归档的目的一个是在于方便其他人了解需求和功能,这部分用的最多的就是通用部分的接口查询。另外一个是方便自己review,以减少日后review的成本。出于此目的,我的文档通常依顺序包含如下几部分:

  • 需求文档&视觉稿,以方便了解需求
  • 参与者,以方便日后找解决问题的人
  • 公共接口,方便外面查询和使用
  • 工程制图,大部分是建模的制图,方便日后自己和他人review
  • 备注,常用的包含一些TODO,以及其他的说明
本文转载于网络 如有侵权请联系删除

相关文章

  • 字符串池化,减少了三分之一的内存占用

    字符串池化,减少重复实例,内存降低,一切就是这样的轻松愉快。开篇摘要本文通过一个简单的业务场景,来描述如何通过字符串池化来减少内存中的重复字符串实例,从而减少内存的占用。在业务中,我们假设如下:有一百万个商品,每个商品都有一个ProductId和Color列保存在数据库中需要将所有的数据加载到内存中,作为缓存使用每个产品都有ColorColor的范围是一个有限的范围,我们假设大约为八十个左右学习dotMemory度量内存既然需要度量内存优化的可靠性,那么一个简单有效的度量工具自然必不可少。本篇,我们介绍Rider+dotMemory的组合,如何进行简单的内存度量。读者也可以根据自己的实际,选择自己青睐的工具。首先,我们创建一个单元测试项目,并且编写一个简单的内存字典构建过程:publicconstintProductCount=1_000_000; publicstaticreadonlyList<string>Colors=new[] { "amber",//此处实际上有80个左右的字符串,省略篇幅 }.OrderBy(x=>x).ToList

  • Chrome:垄断,真的可以为所欲为

    在Chrome最近一次更新中(2021-08-03),有一条改动: 移除跨域iframe中的alert、confirm、prompt调用Chrome对此的解释是:网页内嵌的第三方页面弹窗可能让用户误以为这是当前页面弹出的弹窗,从而带来隐私风险。如果从开发者的角度看待这条改动,显然是个breakingchange。全球不计其数的网站使用alertAPI弹出弹窗,这其中有相当一部分会作为iframe内嵌于其他网站中。这条改动使得这部分数量庞大的网站的提示功能在Chrome浏览器下完全失效。是什么样的勇气让Chrome敢做出这样的决定?67.14%市场占有率的Chrome轻蔑一笑,说:垄断,真的可以为所欲为本文我们来聊聊Google如何利用产品与技术使其保持垄断地位,赚取超额收益的。用户隐私背后的秘密不知道你在用什么浏览器?如果多试几款浏览器,就会发现:不同浏览器对「保护用户隐私」的态度是有细微区别的。「保护用户隐私」意味着减少浏览器对用户行为的追踪,其触动的是庞大的基于用户行为分析推送个性化广告的市场。Safari作为最早全面实行「禁用第三方cookie」的浏览器,一方面是「苹果」对用户隐

  • Spring/Spring-Boot中@Component的作用

    今天在写程序的时候看见一个以前没有见过的注解(@Component),在网上查找过后,经过实践,决定把它记录下来。1、@controller控制器(注入服务)用于标注控制层,相当于struts中的action层2、@service服务(注入dao)用于标注服务层,主要用来进行业务的逻辑处理3、@repository(实现dao访问)用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.4、@component(把普通pojo实例化到spring容器中,相当于配置文件中的<beanid=""class=""/>)泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。案例:<context:component-scanbase-package=”com.*”> 上面的这个例子是引入Component组件的例子,其中base-package表示为需要扫描的所有子包。共同点:被@component、@controll

  • AndResGuard编译速度优化

    背景各位大佬好久不见了,最近忙于搞这个黑科技的开发工作,没有时间写博客,见谅见谅。当前项目内用了腾讯的AndResGuard对资源文件的大小进行了一次深度优化。AndResGuard负责将文件名,arsc文件和R文件也进行了一次混淆,能把整体的资源文件大小压缩。但是奈何也不是一个尽善尽美的方案,所以我们打算在其基础上进行一次二次开发。AndResGuard原理我先简单的介绍下AndResGuard(后面简称ARG)是原理。首先我们需要先编译我们的app项目,等到所有编译流程走完之后生成apk文件,然后ARG会去将apk文件解压并拷贝一份副本,之后从副本中把arsc以及其他的资源文件进行混淆重命名文件等操作,最后再把这个副本重新打包成apk,然后对apk进行重签名等操作。只有了解了完整的ARG的流程之后,我们才可以对其进行二次开发和二次优化。首先当然先是设立目标了,我们要做什么,然后可以怎么做?TODO我们打算做些什么?是不是能将混淆的流程放到apk编译流程中,充分的利用编译时多线程的能力呢? 是不是可以对混淆的规则进行二次调整,从而达到压缩比例的提升。 有没有办法节省一下编译速度的问题

  • 面向对象学习

    本章内容:面向对象编程介绍为什么要用面向对象进行开发?面向对象的特性:封装、继承、多态类、方法引子你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人,一个是狗,且人和狗都有不同的技能,比如人拿棍打狗,狗可以咬人,怎么描述这种不同的角色和他们的功能呢?你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色defperson(name,age,sex,job): data={ 'name':name, 'age':age, 'sex':sex, 'job':job } returndata defdog(name,dog_type): data={ 'name':name, 'type':dog_type } returndata复制上面两个方法相当于造了两个模子,游戏开始,你得生成一个人和狗的实际对象吧,怎么生成呢?d1=dog("李磊","京巴

  • dotNET Core 中怎样操作 AD?

    做企业应用开发难免会跟AD打交道,在之前的dotNETFrameWork时代,通常使用System.DirectoryServices的相关类来操作AD,在dotNETCore中没有这个命名空间,在张善友大佬的推荐下,知道了Novell.Directory.Ldap。 操作AD,通常有两种常见的场景:将第三方数据源数据(人事系统)同步到AD中将AD数据同步到自己的数据库中本文将介绍在dotNETCore中使用Novell.Directory.Ldap将AD数据同步到数据库的操作。环境dotNETCore:2.1Novell.Directory.Ldap.NETStandard2_0:3.1.0安装Novell.Directory.Ldap包在VS2019中添加NuGet包引用,如下图:安装完成后,在类中添加usingNovell.Directory.Ldap;引用便可使用相关的API方法了。同步思路1、连接AD 2、遍历所有需要同步的根OU 3、递归的方式进行部门和人员的同步操作基本操作同步方法publicboolSync() { ADConnect(); if(_connection

  • WebLogic CVE-2019-2647~2650 XXE漏洞分析

    作者:Longofo@知道创宇404实验室 时间:2019年4月26日Oracle发布了4月份的补丁,详情见链接(https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html#AppendixFMW)@xxlegend在《weblogicCVE-2019-2647等相关XXE漏洞分析》分析了其中的一个XXE漏洞点,并给出了PoC。刚入手java不久,本着学习的目的,自己尝试分析了其他几个点的XXE并构造了PoC。下面的分析我尽量描述自己思考以及PoC构造过程,新手真的会踩很多莫名其妙的坑。感谢在复现与分析过程中为我提供帮助的小伙伴@Badcode,没有他的帮助我可能环境搭起来都会花费一大半时间。补丁分析,找到漏洞点根据JAVA常见XXE写法与防御方式(参考https://blog.spoock.com/2018/10/23/java-xxe/),通过对比补丁,发现新补丁以下四处进行了setFeature操作:应该就是对应的四个CVE了,其中ForeignRecoveryContext@xxleg

  • 适配器和外观模式.

    一、适配器模式1、概念定义:将一个类的接口,转换成客户期望的另一个类的接口,适配器让原本接口不兼容的类可以合作无间。 安卓转Type-C头,就是一个典型的适配器模式。在安卓头和Type-C之间引入适配器,安卓头是被适配者。解析:   1、客户(Client)通过目标接口(TargetInterface)调用适配器(Adapter)的方法对适配器发出请求。   2、适配器使用被适配器接口(AdapteeInterface)把请求转换成被适配者的一个或多个调用接口。   3、客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。 结构:适配器有两种,分别是类适配器和对象适配器。类适配器采用多重继承实现,在Java中不适用;对象适配器采用继承和组合实现。以下是两种结构的类图:2、Demo实现 在JDK1.0时我们用的集合还是Vector(后来推荐使用ArrayList),我们用的迭代器还是Enumeration(后来推荐使用Iterator)。现在我们想写一个适配器,让Vector也能使用Iterator迭代器,即在Enumeration和Iterator之间做适配。/** *1、It

  • 如何使用AngularJS和PHP为任何位置生成短而独特的数字地址

    介绍邮政地址通常很长,有时很难记住。在许多情况下,需要较短的地址。例如,能够发送仅由几个字符组成的短地址可以确保更快地提供紧急救护车服务。PieterGeelen和HaroldGoddijn于2001年开发了Mapcode系统,以便为世界上任何物理地址创建简短地址。在本教程中,您将开发一个Web应用程序,该应用程序使用GoogleMapsAPI为您选择的任何地址生成一个简短的数字地址。您将通过从GitHub克隆此应用程序的基本代码,然后向其中添加使其完全正常运行的代码来实现此目的。此应用程序还可以从给定的地图代码中检索原始物理地址。先决条件要完成本教程,您需要具备以下条件:访问Ubuntu18.04服务器。此服务器应具有具有权限且配置了防火墙的具有sudo权限的非root用户。要进行此设置,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。机器上安装了LAMP堆栈。这是必要的,因为您将在本教程中开发的应用程序使用AngularJS和PHP,并且应用程序生成的数字地址将存储在MySQL数据库中。在您的服务器上安装Git。您可以

  • 使用Go构建一个Data Thrashing CLI工具

    因为我需要一个工具来做一些测试。所以用Go的一些库快速地开发了一个这样的工具。以下所撰就是这个快速上手的项目。最后,我将在容器中搭建服务,并将其放入Kubernetes(k8s)集群中,不过下面操作都是在CLI环境下进行的。在使用Cobra之前,需要安装Go的依赖管理工具dep,使用下面的命令来安装或者升级。brewinstalldep brewupgradedep复制如果你用的不是MacOS或者brew命令,你也可以通过goget的方式来安装,执行goget-ugithub.com/golang/dep/cmd/dep。对你的项目的根目录的初始化命令是depInit接下来会详细说明。首先,我使用CobraCLI为我自己的CLI生成初始代码。若要安装Cobra,也需要使用goget,命令为goget-ugithub.com/spf13/cobra/cobra。执行cobrainitgithub.com/adron/thrasher来生成CLI的初始框架。/src/github.com/adron/blueland-cli/是我按照标准在Go目录下生成的。我现在进入到该目录并获取一些命令

  • 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus

    最新的Mono4.4已经支持运行asp.netmvc5项目,有的同学听了这句话就兴高采烈的拿起VisualStudio2015创建了一个mvc5的项目,然后部署到Mono上,浏览下发现一堆错误出现,心中一万只草泥马奔腾而来,这也叫支持吗,这个问题是VisualStudio造成的,不相信的话可以使用Xamarin.Studio创建的asp.net项目,部署过程非常顺利,没有遇到什么问题;本文就是为你解开这个结,如何VisualStudio2015搞定ASP.NETMVC5项目的跨平台开发。vs2015新建一个asp.net的项目(目标框架是.net4.5),选择mvc,并且更改身份验证为不适用身份验证。编译,并发布到jexus,访问之。报出的错误信息如下图。Couldnotfindfile"/var/www/mvcdemo/bin\roslyn\csc.exe".这一行告诉了我们找不到roslyn的c#编译器,当前版本的Mono的编译器还是Mono的mcs编译器,并没有完成到roslyn这个编译器的升级工作,这个工作正在进行过程中,在不远的将来就可以统一使用rosly

  • 基因家族分析

    一、基因家族定义基因家族:genefamily,是指来源于同一个祖先,经过基因重复和突变而产生的一组具有序列结构与功能相似性的基因,它们编码相似的蛋白质产物。对于一个基因家族中的基因,能够编码蛋白都有同一个结构域。维基百科:https://en.wikipedia.org/wiki/Gene_family同源基因:来自共同祖先DNA序列的基因,包括了物种间的同源“ortholog”、物种内的因基因复制导致的同源"paralog"。直系/垂直同源基因:同一祖先但后来形成了不同物种,它们之间的基因集。一般从进化上来讲,有相同的功能,但这个并不绝对,可能在新测序的物种中又会发现新的基因功能。旁系/平行同源基因:某个特定基因组中由于基因复制产生的同源基因,直系基因在进化中一般会保持相同的功能,但是旁系基因会发生进化,可能已经有了新的功能,或者成为了假基因。直系同源(同颜色)与旁系同源(不同颜色)一个基因家族,一般存在于多个物种(不同物种中的叫亚家族基因),并且很多基因家族都是转录因子,可以对家族内基因启动子区域进行分析;还能找几个物种,分析同源基因的基因结构、motif分析

  • SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表实践

    一、序言 在实际业务中,单表数据增长较快,很容易达到数据瓶颈,比如单表百万级别数据量。当数据量继续增长时,数据的查询性能即使有索引的帮助下也不尽如意,这时可以引入数据分库分表技术。 本文将基于SpringBoot+MybatisPlus+Sharding-JDBC+Mysql实现企业级分库分表。 1、组件及版本选择 SpringBoot2.6.x MybatisPlus3.5.0 Sharding-JDBC4.1.1 Mysql5.7.35 2、预期目标 使用上述组件实现分库分表,简化起见只讨论分表技术 完成分表后的逻辑表与物理表间的增删查改 引入逻辑删除和使用MybatisPlus内置分页技术 完整项目源码访问地址。 二、代码实现 为了简化分表复杂性,专注于分表整体实现,简化分表逻辑:按照UserId的奇偶属性分别进行分表。以订单表这一典型场景为例,一般来说有关订单表,通常具有如下共性行为: 创建订单记录 查询XX用户的订单列表 查询XX用户的订单列表(分页) 查询XX订单详情 修改订单状态 删除订单(逻辑删除) 接下来通过代码实现上述目标。 (一

  • 事后诸葛亮分析(小小大佬带飞队)

    总结   这次项目最初讨论了好几种文字识别方案,在最终测试中发现由于原理理解不够深入导致无法对细致参数进行调整,效果并不是很理想,在这个过程中也意识到理论的重要性,最后发现还是先搭建比较简单的神经网络比较现实,虽然识别效果不是很理想但还是有一定进步,我相信即使软工项目结束了但在接下来的完善中一定可以把这个项目做的更好。 团队成员在Alpha阶段的角色和具体贡献: 名字 角色 团队贡献分 可验证的贡献 杨浩政  设计开发 10  设计yolo算法,撰写博客 谢创敏  开发测试 25 实现神经网络算法 钟伟 开发测试 19 设计算法并进行测试 李奕柱 图片识别开发 22 向量机实现图片识别 李晓阳 图片识别开发 15  整理测试图片识别代码 肖洁銮 前端开发 9 实现简单界面

  • python globals()[]将字符串转化类,并通过反射执行方法

    背景: 通过关键字设计ui自动化框架,将测试用例及其步骤存放到excel文件;其中步骤中包含了封装好的关键字方法,如打开浏览器、输入页面操作等,关键字保存的内容:具体类实例.方法   通过excel获取到关键字,关键字的类型是str,希望将关键字里面的类,转化为对应的类,再实例化这个类,配合反射getattr(类实例,具体方法),实现调起传入的关键字方法 如: Fun=getattr(obj,open_browser) Fun() #执行,有参数可传入参数Fun(*args)   要解决问题:将字符串,转化为类/class 使用:Globals()[字符串]:字符串即要转化的类的名称   使用方法: 以下操作都在文件A下操作 1、先使用globals(),在文件A中打印,可以查看到文件A中有引用的类 2、当前文件下有模块,转化为类成功, 转化为类之后,可以使用类调用其下的方法 3、文件A下没有导入模块datetime,转化为类失败 4、eval()和globals()一样可以转化类,前提是当前文件有引入这个模块   在当前文件

  • docker安装部署项目

    docker安装redis dockerpullredis dockerimages dockerrun-ti--namedocker-redis-p6379:6379-idtredis:latest dockerlogs-fdocker-redis dockerps dockerexec-itdocker-redis /bin/bash dockerrm  dockerrm-i   docker安装zookeeper dockerpull wurstmeister/zookeeper dockerimages dockerrun-ti--namedocker-zookeeper-p2181:2181-idtwurstmeister/zookeeper:latest   docker安装kafaka dockerpull wurstmeister/kafka dockerimages dockerrun--namedocker-kafka-eHOST_IP=localhost-eKAFKA_ADVERTISED_PORT=90

  • 使用JMX工具远程监控tomcat配置

    使用JMX工具远程监控tomcat,在tomcat启动时添加配置参数: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port={your_port_number} -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname={your_server's_public_ip}复制   作者:jessezeng 出处:http://www.cnblogs.com/jessezeng/ 版权声明:转载请注明作者及原文链接。

  • 2022.2.23学习日志

    今天学习了spark的RDD的操作。

  • DEDECMS教程:织梦栏目更新HTML出现“模板文件不存在,无法解析文档”的解决方法(转)

  • 参照目前微信屏蔽网站,大家谈一谈互联网去中心化。

    讨论中请不要出现与政治相关的直接的敏感词汇。 由于目前谷歌、腾讯、阿里等一家独大,与互联网发展的自由、开放原则相违背,其实也算是互联网被商业化的一种结果,但是,商业化只是一个过程,而互联网则是一直向前发展的,目前已经感觉到去中心化的脚步正在抬起,包括bitorrent出的分步式无中心聊天工具BLEEP,无中心BT服务器的比特精灵、比特币等。 希望能家能大各自说一下自己的看法,然后一起讨论一下,如果能有一个很不错的方案,完成可以请博客园牵头做一个开源项目,也算是对这个时代的一个交代。

  • php获取数据库中数据,转成json数据

    <?php //需要执行的SQL语句 //单条 $sql="select*fromxinwen"; //多条数据 //$sql="selectid,namefromtbl_user"; //调用conn.php文件进行数据库操作 @require("conn.php"); //提示操作成功信息,注意:$result存在于conn.php文件中,被调用出来 if($result) { //$array=mysql_fetch_array($result,MYSQL_ASSOC); //数据集 $users=array(); $i=0; while($row=mysql_fetch_array($result,MYSQL_ASSOC)){ $row['Code'].'-----------'.$row['Tupian'].'</br>'; $users[$i]=$row; $i++; } echojson_encode(array($users)); /*单条数据*/ /*$row=mysql_fetch_row($result,MYSQL_AS

相关推荐

推荐阅读