liurengfei liurengfei
关注数: 16 粉丝数: 46 发帖数: 264 关注贴吧数: 27
GameMaker2 纹理页的理解 为什么要把多张图片拼成一张纹理页? 《加载多个尺寸不一致的贴图时, 显存会出现碎片空间》 《贴图单元数量是有限的》 假设最坏情况只支持1个贴图单元,这时候你有一个2D角色的两个对象实例,分别处于不同的动作帧,如果没有合并贴图把同一角色所有帧都合到一张贴图里,那么要绘制这两个对象就会提交两次贴图,如果是合并贴图就只需要提交一次,然后通过在shader里面取不同的坐标来获得对应动作的贴图。API 能能绑定的贴图数量是有限的,比如一次只能填 128 个坑。想切换贴图必须把原先占坑的贴图换出来,换坑是很耗费时间的操作(你得让之前坑里的把事情做完吧,等啊等),因此游戏中希望尽可能减少这类操作。怎么办呢?就是把不同的贴图合起来……等于是一个坑里占了好几张图片(稍微挤挤还是挤得下的),就不需要那么频繁得换贴图了。推广到一个游戏场景,有各种特效和角色,尽可能合并贴图带来的好处就是执行效率的提升。比如显卡支持10个贴图单元,那么你可以尽量把当前场景用到的各种贴图提交上去,然后把对象的顶点信息一次性提交上去,最好情况是只要一次贴图提交和一次draw call。更极端点,你的场景对象没有变化的情况下,之后的所有帧,你都不用重新提交贴图了,只需要每帧提交对象的顶点信息就可以了。 《要求纹理尺寸必须是2的整次幂》 在openGL ES 1.0的时代,要求贴图的尺寸都必须是2的整次幂,所以即使是一个513x513的图片,也会创建一张1024x1024的贴图。如果游戏的图片比较多的话,这个浪费的内存还是相当可观的。于是出现了一种技术,就是把多个不同给的小图片整合到一张大的2的整次幂的图片中,这样有几个好处,一个是节省了很多内存,一个是免去了很多的文件操作次数。 《文件数量多管理成本高、读取速度慢、接口占用多》 站在游戏开发者的角度,资源贴图的数量跟着游戏规模几何上升。如果一张图一个文件的话,海量的文件会让你欲仙欲死。且不说读取大量小图片文件的速度远远比不上读取单个大图片文件,更不要说编辑起来也很麻烦了。从代码角度,在D3D11中,维护一张纹理图片,需要一个ID3D11ShaderResourceView接口。如果用多个文件,那么每个文件都需要一个接口来维护。对程序来讲也是个不小的负担。而且,图形引擎本身就支持裁切纹理操作,合理使用纹理坐标,就可以从一大张图上裁剪下任何一个矩形区域的小图。这样做的效率也是很高的。 对于某些2D游戏而言,人物动画帧如果分开的话,需要一幅幅载入,耗时且占内存,不方便管理和调用。如果把它们做成一副图片,帧与帧之间等距离的话,一次只需载入一次,而且播放到第几帧,就直接把显示区域往后挪第几块,方便快捷。 《UI都是预先合图》 可以将UI按场景分类然后提前合在一张纹理上。这样场景UI在同一纹理不管层次如何都可以一次提交到显存。减少Drawcall来优化性能。甚至有些UI设计师风格统一,一二三级窗口都是九宫格等,一张大纹理基本能摆下所有的UI。免去了多个小图片的I/O以及解码,在loading时期就加载完毕,大大解决游戏中打开窗口时因为图片加载解码产生的卡顿。重要的是所有UI一个批次就可绘制完成。 《小图片占用空间更大》 因为存储管理的最小单位是“簇”,小于一簇的数据也会占用一簇,所以细碎的图片在储存上也会比合在一起的整图大,不管存储是在硬盘中还是显存中。
GameMakerStudio2 羽毛系统 功能介绍 羽化设置基础选项 启用羽毛 Enable Feather 文件解析延迟(毫秒) Document Parse Delay (ms) 你更改script后,Feather等待检查的时间。 工具提示所显示的struct 字段的最大数量 The maximum number of struct fields that are displayed by tooltips. 把鼠标悬停在一个struct ,工具提示会显示该struct 内的变量,最多可显示此处输入的数量。 紧凑型工具提示 Compact Tooltips. Disables certain tooltip information, such as parameter descriptions. 启用此功能将删除某些在悬停在关键词上时出现的工具提示信息,如函数的参数描述,最终使你的工具提示更小。 当asset 在asset 浏览器中被重命名时,重构对Asset 名称的引用 Refactor references to asset name when asset is renamed in Asset Browser. 启用这个功能将确保当你在asset 浏览器中重命名一个Asset ,你的代码中提到的任何内容也会被编辑,所以这些引用不会中断。 从快速修复中创建时,首选多行JSDoc注释样式 Prefer multiline jsdoc comment style when creating from Quick Fix. 当你通过快速修复菜单为一个函数生成JSDoc注释时,生成的JSDoc将使用单行或多行注释,这取决于这个选项。 启用严格的类型模式 Enable Strict Type mode 当启用这个功能时,Feather会更严格地确保你在代码中使用正确的数据类型。 突出显示 错误颜色 Error Colour 警告颜色 Warning Colour 建议颜色 Suggestion Colour 消息严重性 概述Profile 在下拉框中,你可以在GM*规则的几个预设中进行选择。以下是可用的配置文件。 无None:此配置文件将不显示任何错误信息。 语法错误SyntaxErrors:如果你使用这个配置文件,将显示语法错误,以及无配置文件中显示的内容。 类型错误TypeErrors:除了语法错误SyntaxErrors 配置文件外,该配置文件还显示类型错误。 全部All:这个资料显示了Feather可以分析的所有东西。 多个GM*规则 你可以将一个规则设置为"错误Error"、"警告Warn"或"建议Suggestion",这将影响到违反规则的代码在代码编辑器和Feather信息窗口中向你报告的方式。 忽略lgnore:这将忽略该规则被违反的所有情况。 所有从"GM1000"开始的规则都会检查你的语法是否有致命的错误, 而那些从"GM2000"开始的规则是最佳实践规则,可以帮助你防止游戏中的错误。 命名规则 允许你为assets 、变量和GML 代码的其他各种部分设置命名规则。 必须启用 "消息严重程度 "下的GM2017规则,才能使命名规则生效。默认情况下,它是禁用的。 标识符阻断列表 这是一个以空格分隔的标识符列表,忽略已存在的命名规则。即不按规则执行的例外情况。 例如,假设你有一个规则,使用obj_作为objects 的前缀,但你希望你的objects manager network保持原样,不使用obj_前缀。 在这种情况下,你会把manager network写进 标识符阻断列表Indentifier Blocklist。Feather将忽略这些objects 和任何其他具有相同名称的标识符(变量、枚举、参数等)。 <标识符> 命名规则 你可以为列表中每种类型的标识符设置命名规则,如assets 、宏、枚举、函数参数、变量等。 每个命名规则下拉菜单有以下选项。 前缀Prefix 应该出现在标识符名称之前的文本,可以是obj_,用于objects ,_用于局部变量,等等,取决于你的偏好。 后缀Suffix 应该出现在标识符名称之后的文本。 命名方式Naming Style 选择标识符的命名方式。 不受限制Unconstrained:对这种类型的标识符不强制进行格式化。 大驼峰式命名法UpperCamelCase:MyHealth, ObjGrappleHook, MaxInventoryItemsAllowed,等等。 小驼峰式命名法lowerCamelCase:我的健康,objGrappleHook,允许的最大库存物品等。 全部大写ALL_UPPER:MY_HEALTH, OBJ_GRAPPLE_HOOK, MAX_INVENTORY_ITEMS_ALLOWED等。 全部小写All_lower:My_health, obj_grapple_hook, max_inventory_items_allowed, 等等。 Animation Curve Naming Rule 动画曲线命名规则 Constructor Function Naming Rule 结构函数命名规则 Function Naming Rule 函数命名规则 Sequence Naming Rule 序列命名规则 羽毛的特点 在偏好设置中,将Feather打开enabled,才启用。 鼠标悬停信息 函数 显示其手动描述,并列出所有参数。 sprite 显示其第一帧 Type 类型bitmap 位图 Resolution 分辨率 Image Number Collision TypeRectangle Bounding Box 碰撞盒边界框 Origin 原点Top Left 颜色值 CSS十六进制代码、RGB和HSV值 特殊值 资产重构(重命名) 可以在代码中重命名globalvar、static vars、assets、enum或enum成员、实例变量,资源浏览器中的资源名也会更新。 重命名代码中的脚本时,会更新脚本内部的函数名,不会更改资源管理器中的名称。 资源浏览器中 重命名资源浏览器中的脚本时,不会更新脚本内部和代码中的脚本名。 如果在 asset 浏览器中重命名一个Asset ,Feather不会自动更新你项目代码中所有提到它的地方。这可以在Feather设置中启用或禁用。 所以不要在资源浏览器中重命名。 代码中 光标放在asset上,然后按CTRL/CMD + SHIFT + R。弹出重命名对话框,输入一个新的名字并点击"应用"。asset 本身,以及你的项目中对它的所有引用,都将被重新命名。 快速修复 错误或警告 光标放在被报告的行上,然后按CTRL/CMD+Q键,就会出现快速修复菜单。或者,你也可以点击代码行号栏中的 Feather图标。这个菜单会向你显示一个快速修复方法,并允许你禁用该行的规则,或改变其严重程度。 创建函数(不用) 快速修复菜单允许你为该函数自动生成JSDoc注释。还是采用自定义的JSDoc注释。 将 /// @func 计算数组中,数组0元素的数量 /// @desc d数组0元素不能相同 /// @arg {计算} sz 描述 /// @arg {==} [sz] 描述 /// @return Array (数组0对应位置数据的数量) 变成 /** * 计算数组中,数组0元素的数量 d数组0元素不能相同 * @param {any*} sz 描述 * @param {any*} sz 描述 * @returns {array} Array (数组0对应位置数据的数量) */ 将 /// @func is_same_object(inst_id, object_id) /// @desc Check if the given instance belongs to the given object. /// @arg {Id.Instance} inst_id The unique instance ID value of the instance to check. /// @arg {Asset.GMObject} object_id The object index to be checked against. /// @return {Bool} 变成 /// @desc is_same_object(inst_id, object_id) Check if the given instance belongs to the given object. /// @param {id.instance} inst_id The unique instance ID value of the instance to check. /// @param {asset.gmobject} object_id The object index to be checked against. /// @returns {bool} Description 查找所有参考资料(变量所有的引用) 允许你在整个项目中找到对一个变量的所有引用。 光标放在一个变量上,然后点击F3。你会在工作区的顶部看到一个小的搜索栏。按相应的箭头导航到上一个或下一个参考(无效),或按Esc关闭它。 它不是简单地搜索一个文本字符串,而是从其声明的范围中寻找所选变量的引用。所以两个具有相同名称但分别存在于两个不同objects 的变量将不会匹配。但具体相同名称但分辨率存在于两个不同结构的变量却不能区分。 列出所有参考资料 光标放在一个变量上,然后点击SHIFT + F3。这将打开 "搜索结果 "窗口,并在一个列表中显示所选变量的所有引用。搜索完成(6结果),比实际结果少1个。 羽毛数据类型 Feather使用数据类型来提供编写代码时的智能语法检查,确保你不会为一个变量或函数参数使用错误的数据类型。为一个变量指定数据类型(没有例子来说明如何用) 用JSDoc注释,为脚本函数的参数和返回值指定数据类型,@param 注释参数(和用@arg效果一样)和 @return 注释返回值 JSDoc标签允许你指定以下任何一种类型。JSDoc类型不区分大小写。 数据类型要看悬停显示、代码补全、状态栏参数和错误检查的反馈。 不能自定义类型英文,悬停显示无法识别类型。 基本类型具体例子*描述 RealN/AA real number BoolN/AA boolean StringN/AA string ArrayDefault - Array...An array, may include specifiers Pointer指针Default - Pointer...A pointer, may include specifiers Function函数Default - Function...A function, may include specifiers Struct结构Default - Struct...A struct, may include specifiers Id .Instance - Instance ID .DsList - DS List ID .DsMap - DS Map ID .DsGrid - DS Grid ID .DsStack - DS Stack ID .DsPriority - DS Priority ID .DsQueue - DS Queue ID ...An ID,需要返回id的函数 Asset资源 .GMAnimCurve 动画曲线- Animation Curve Asset .GMObject - Object Asset .GMAudioGroup 音频组- Audio Group ID .GMFont - Font Asset .GMPath - Path Asset .GMScript - Script Asset .GMShader - Shader Asset .GMSound - Sound Asset .GMTimeline - Timeline Asset .GMRoom - Room Asset .GMSequence 序列- Sequence Asset .GMSprite - Sprite Asset .GMTileSet 瓦片- Tile Set Asset ...An asset, requires specifiers Constant常量 .Colour - Colour .HAlign 字符水平对齐- Horizontal Alignment Constant .VAlign 字符垂直对齐- Vertical Alignment Constant .Cursor 光标图标- Cursor Constant .EventType 事件类型- Event Type Constant .EventNumber 事件编号- Event Number Constant .PrimitiveType 绘制基元- Primitive Type Constant ...A constant, requires specifiers AnyN/A任何数据类型 具体例子*列出了一些指定器实例,但不是全部。例如,在Id、Asset和Constant组下可能有更多可能的类型,这里没有列出。 在使用Feather时,你可能会在IDE ,这表明标识符的类型(可能是一个变量、参数、返回值等)目前还不能被Feather分辨出来。当为该标识符添加更多的代码时,它可能会承担一个特定的类型。 具体人员(为变量添加一种数据类型标识) 在基本数据类型后添加一个指定符,使用点.来指定该组中数据的确切类型。 诸如Id.DsList、Asset.GMObject和Constant.Color等类型使用了指定器。 收藏类型(为变量添加多种数据类型标识) 像Array和Id.DsList这样的类型,是包含多个值的数据结构,能够为其所有内容指定一个数据类型集合。使用角括号<>附加到类型上。 例如,一个包含strings 的数组将是Array<String> ,而一个包含数组的DS List,包含Reals,将是Id.DsList<Array<Real>>。 类型验证 下表(略)如果你将某一类型的值(行)传入需要数据类型的参数(列)会发生什么。最好填入需要的类型,不要弄错。 JSDoc 脚本注释 如果自定义的脚本要有脚本名补全、显示参数、注释等,在脚本编辑器中,需添加JSDoc格式的注释。 有函数的描述、函数名,然后列出函数采用的不同参数(参数),确保每一行以三个反斜杠“/”开头,这告诉GameMaker Studio 2将注释解析为JSDoc。注释本身需要有一个标识符(前面有“@”)和内容,可用的标识符如下: 每一行以三重反斜杠“///”开始,空格,“@” 标识符描述 @func完整的函数名称,包括参数 @desc描述 @arg{type} 参数 描述,用 [] 大括号包住一个参数名,表示它是可选的。然后,代码编辑器将期望在最小需要的参数和参数总数之间有任何数量的参数。 @return{type} 返回 描述 没有下面羽毛标识符使用的例子,教授如何使用。 猜想应和上面的标识符一样,用于脚本函数注释中 羽毛标识符描述 @pure将该函数标记为纯函数。纯函数 (Pure Function):返回结果只依赖于它的参数,依赖了常量也不行。并且在执行过程里面没有副作用(没有对外写数据)。 @ignore将函数从Feather的自动完成中隐藏起来 @deprecated将该函数标记为已废弃 @context/@self设置函数的上下文,Feather自动完成使用它来提供上下文信息。可以是一个object ,也可以是一个构造器。脚本上下文(内部作用域)就是调用者,不用标记。方法的内部作用域是创建者,才需要标记。方法可以被悬停识别吗? 例子 function is_same_object(_id, _obj) { if (_id.object_index == _obj) { return true; } else return false; } 这个脚本检查一个实例是否与给定对象具有相同的对象索引,并将被简单地调用为: if is_same_object(id, obj_Player) {//在if的检测中应用脚本 instance_destroy() } 但是,将其写入脚本编辑器不会显示参数,也不会在使用时为您提供任何帮助,因此我们需要将描述、函数名和参数添加为JSDoc注释,如下所示: /// @func is_same_object(inst_id, object_id) /// @desc Check if the given instance belongs to the given object. /// @arg {Id.Instance} inst_id The unique instance ID value of the instance to check. /// @arg {Asset.GMObject} object_id The object index to be checked against. /// @return {Bool} function is_same_object(_inst_id, _object_id){ return _inst_id.object_index == _object_id; } 现在,用代码调用这个脚本时,您将获得代码补全和参数的帮助 在上图中,顶部显示自动完成中的函数,底部状态栏显示参数。 用@func标识符时,在IDE中显示的脚本名称将与资源树中的脚本名称相同。因此,您可以在资源树中将脚本命名为一个对象,并用@func将其命名为另一个对象,IDE会将两者识别为同一脚本资源的别名,但只有@function one会自动完成。 @arg的类型“type”和描述“description”默认情况下不会显示在IDE代码中,要查看它们,要激活偏好设置》语言》GML Code,在状态栏中显示参数类型、在状态栏中显示参数描述 由于scripts ,其中可以有多个函数,你可以在其声明之前为每个函数添加JSDoc注释。 整理 /// @func 函数英文名 模块前缀_,不需要添加()和参数,在状态栏和代码提示窗口都有参数提示,这里再写显得函数名很长。有无()和参数只影响羽毛悬停显示的函数名有无()和参数。必须和函数名的标识符一样,状态栏才会有参数提示,如果这样,不要@func也行,把函数中文名写在描述前面。 在方法上面也可用JSDoc注释。增加羽毛悬停信息。必须有/// @func 方法标识符,才会出现状态栏参数提示。有/// @func 方法标识符虽然代码着色改变,但用is_method()判断,依然是方法。内部作用域也是创建者。 /// @desc 简短的调用条件、使用注意事项、R: 内容 (/// @return不显示中文、描述,需在此描述)。在羽毛中显示在函数中文名之后 /// @arg {类型} 中文名 描述(悬停显示底行),偏好设置》语言》GML Code》状态栏显示参数类型{type},不显示描述。在羽毛中显示{类型}、中文名、描述。[中文名]表示可选参数 /// @return {类型} 中文名(悬停不显示) 描述(悬停不显示),羽毛悬停显示的返回值在信息第一行->后的字符,不显示中文名和描述。如果类型不是GMS2的类型英文,会自动识别为一种类型。 /*详细说明 此处不能/**/这样,必须换行,否则悬停无法识别注释 */ 类型必须是GMS2的类型英文,虽然类型英文不区分大小写,但为了和悬停信息一致,开头字母也大写。 偏好设置》默认脚本内容 /// @desc 函数中文名 模块前缀_ 调用条件、使用注意、R:返回中文名 描述 /// @arg {类型英文} 中文名 描述 /// @return {类型英文} 中文名(不显示) 描述(不显示) /* */
GameMaker8坐标系统 根据左上角的原点(0,0)位置分为三类:房间、窗口、屏幕坐标系。 以屏幕坐标系为例:如图一、房间坐标系(0,0为房间左上角) 物体 x,y;xprevious,yprevious;xstart,ystart; 鼠标 只读:mouse_x,mouse_y; 返回鼠标在视野内的房间坐标:window_view_mouse_get_x(id)、window_view_mouse_get_y(id),id为0~7。鼠标在视野内时等于mouse_x,mouse_y;鼠标在视野外时等于该位置相对于该视野在房间内的坐标。 设置鼠标在视野内的房间坐标:window_view_mouse_set(id,x,y),id为0~7 视野 view_xview[],view_yview[] 视野尺寸view_wview[],view_hview[] 背景 background_x[],background_y[] 背景尺寸只读:background_width[],background_height[] 二、窗口坐标系(0,0为窗口内显示区域左上角) 鼠标 window_mouse_get_x(),window_mouse_get_y();当鼠标离开窗口时,以该点为原点来计算坐标。可以显示负值和超出窗口大小的数值。 设置鼠标在窗口内的坐标:window_mouse_set(x,y) 鼠标在某个视野内的坐标(以视野左上角为0,0点):需要鼠标窗口坐标window_mouse_get_x(),window_mouse_get_y()和视野窗口坐标view_xport[],view_yport[]一起计算。 视野 view_xport[],view_yport[] 视野尺寸view_wview[],view_hview[] 三、屏幕坐标系(0,0为屏幕左上角) 鼠标 display_mouse_get_x(),display_mouse_get_y();鼠标不能离开屏幕。 设置鼠标在屏幕内的坐标:display_mouse_set(x,y) 窗口 window_get_x(),window_get_y(); 窗口尺寸:window_get_width(),window_get_height() 设置窗口在屏幕内的坐标:window_set_position(x,y) 设置窗口的尺寸:window_set_size(w,h)
猎杀潜航4水兵能力对效率的影响 我很喜欢猎杀潜航4的水兵系统。有点像玩大海战2的味道。升级转职之后,还能有技能,更好了。看了网络上没有关于水兵能力对应的研究,所以本人对存档进行修改后,对水兵的几项能力进行了对比分析。本文的分析还停留在初级阶段,只对没有升级转职的五级白板水兵进行了分析,权当抛砖引玉。希望大家能写出更好的帖子。 分别修改了六个水兵,智力系数(隐藏数值)统一为0.500000。在智力系数为0.5的情况下,水兵的实际效率(每个水兵数值的左小角有关于效率的三个数值,从左到右分别为实际效率、自身效率上限、括号内的为增加效率)除以100等于总效率。智力系数影响所有数值的发挥。看电脑选的水兵该数值在0.7至0.3之间浮动。所以出现了一样能力的水兵对舱室影响的效率却不同。 智力系数统一后,六个水兵的数值分别为: 序号 组织 电气 机械 火控 了望 1 1 1 1 1 1 2 51 1 1 1 1 3 1 51 1 1 1 4 1 1 51 1 1 5 1 1 1 51 1 6 1 1 1 1 51 通过把他们五人放到不同的舱室,记录该舱室的效率。我们得出增加的50点能力值,每点能力对舱室效率的影响 每点数值提升的效率 舱室 轮机舱 下甲板 人员居住舱 无线电室 甲板值班 损管队 甲板炮 船尾防空炮 组织 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 电气 0.000343 0.000204 0.000200 0.000826 0.000240 0.000190 0.000412 0.000000 机械 0.000493 0.000392 0.000408 0.000000 0.000245 0.000194 0.000420 0.001918 火控 0.000000 0.000204 0.000000 0.000000 0.000240 0.000100 0.000168 0.002480 了望 0.000000 0.000000 0.000400 0.000826 0.001240 0.000000 0.000412 0.001500 观察上面的数据我们得出了不同舱室对水兵能力的要求: 所在岗位 需要 engine rooms轮机舱 电气、机械高 lower decks下甲板 电气、机械高、火控 crew quarters人员居住舱 电气、机械高、了望高 radio room无线电室 电气很高、了望很高 deck watch甲板值班 电气、机械、火控、了望非常高 damage team损管队 电气、机械、火控 gun deck甲板炮 电气高、机械高、火控、了望高 aft aa gun船尾防空炮 机械、火控、了望(效果显著垃圾兵都可以胜任) 至于组织能力应该是影响转职后的增加效率(猜测)
1 下一页