## 调试
游戏的编程阶段,无论是使用代码还是拖放模块,都非常容易犯错误 - 使用错误的变量,传递错误的参数或使用错误的函数是我们所犯的一些最常见的错误 - 脚本/动作编辑器附带的语法检查器并不能没有遗漏地检测到这些错误。这意味着,这些错误只有在您实际运行或编译游戏时才会变得明显,即使这样,有时也难以准确地知道出现的问题是什么。因此,及时了解您的游戏在所选设备上的表现,以及房间中的实例,所创建的全局变量以及其他详细信息,是至关重要的。
现在,您可以通过在游戏中添加所谓的“调试代码”,来在屏幕上显示所需的信息,或者您可以使它在出现错误时显示消息,这样可以自己检查这些信息。但是这通常会带来大量的工作,如果您不确定问题在哪里,那么您可能在尝试和错误的追踪错误上耗费大量时间。对此,GameMaker Studio 2 提供了一个被称为调试模式的特殊测试模式,它将启动调试模块以及一个全面的错误报告系统,可在运行时显示信息,以帮助您跟踪游戏中出现的问题。 以下内容为你可使用的调试游戏的不同方式:
### 错误报告
当在编译和执行项目时发生错误,会在“编译错误输出”窗口中显示一条消息,如下所示:
![](https://lh6.googleusercontent.com/fuj91L3CGreos6jNv_6f3CK2UJVFQoC-bQRNk7GOEC1tpk48WnDfOU_Fm9F1isR_-rwdX8PWiPrHb05LcAilHY7CWUY5RomM8Nons3iHls-80nMKiK2J4yCZMSlA3XSWdqgQBJZ6)
大多数编译器错误消息遵循相同的模式,其中包含一条消息,指示对象发生错误,然后是事件与行号,最后简要描述错误本身。 错误报告提供的信息非常重要,因为它会检测并报告导致游戏崩溃的语法和语言相关的错误,但不会报告更多的细微错误,也不会给出修复反馈。 对于此类型情况你应该使用调试模式(下一点即为该模式的详细解释)。除了这些编译错误,您还可以获得语法错误。 当您添加 DnD™ 操作或代码时,将会检测到这些操作,并显示在“语法错误输出”窗口中,与下图所示相似:
与编译器错误一样,语法错误窗口将引导您找到对象,事件和出现问题的特定行,并且通常也会简要说明错误是什么。![](https://lh4.googleusercontent.com/CF1tWSxdLJR_LtJj7D_dnoRcq_U-MrBMUKYMT7U2horCsHFDr2U7pUr11sBpPAbdgo4TrYDg1nUZJR2QNjuTL82pBOLVgpIHZbFMMz_RZlw-htMCRom1r-RGLYO3A_w7DCEd4nkH)
### 调试模式
如果您需要更详细地检查,可以通过单击调试运行按钮在调试模式下运行游戏。 当您这样操做时,调试模块将随您的游戏一起打开。 该模块允许您监视游戏中从全局性能到各个变量值的一切工作。 您可以从以下页面中找到有关调试模块的更多信息以及如何使用它们:
* 调试模块
请注意,当您使用调试模块时,您还可以添加断点到您的代码或 DnD™。 断点是游戏循环中您希望调试模块暂停,并让您手动遍历实际游戏代码的一个点。 您可以使用快捷键 F9 添加断点,它们将显示在“输出”窗口中,您可以根据需要启用/禁用它们。
### 检测性能
当运行游戏进行调试时,您还可以通过使用调试模块中的轮廓选项来了解游戏的运行情况,并了解所有部件是否运行一致。 它将提供有关游戏运行情况以及执行特定功能调用或事件所需要时间的非常详细的信息(有关详细信息,请参阅“调试模块”一节)。 但是,这要求调试模块正在运行,这可能不是您所希望的,尤其是如果您希望测试设备上的最终可执行文件... 在这些情况下,作为分析器的补充,您可以在游戏中显示调试状态条,这将显示游戏正在使用的内存量,CPU功率和GPU功率。
![](https://lh5.googleusercontent.com/M9_ro14AHnowq2KJ5Mhj8DrxJxOh2421hKMvZap9zUZ32Ey48w3escrUegcp0644NLeS1tjkEWqbFeVFkWeGwc2g9xJkCs-PVppD7zrrmtwtXpTaKmpKslLlwr-tPTYeW-kJsJNr)
此调试条在实际的游戏窗口中显示了 CPU / GPU 使用情况的帮助图示,并且可以使用函数 show_debug_overlay()在游戏中切换开关。这个显示栏被分成几个部分,每个部分代表 1/60 秒。从下面的图像可以看出,显示条由各种颜色组成,每一种颜色都代表游戏性能的一方面,显示条越长,则该方面需要的时间越多,其性能就越强大:
* 绿色 - 输入/输出处理(即:键盘,鼠标,游戏手柄,网络等)
* 红色 - 步骤事件的更新速度
* 黄色 - 绘制事件所需的时间
* 橙色 - 调试更新时间,在使用调试模块时通常只能看到该部分
* 白色 - GPU 剩余时间,这是 GPU 在下一个画面可以开始渲染之前完成当前画面渲染所花费的时间
* 青色 - 文字呈现时间
* 灰色 - 清除屏幕每个绘制步骤所需的时间
* 深红色 - GPU 刷新,即 GPU 从存储器中清除图像所需的时间
除了彩色的显示条,顶部还有几个值。这些值所表示内容如下:
* FPS - 这是你的游戏的“每秒帧数”,基本上代表了你的游戏的运行速度。这个值不能完全决定游戏的游戏速度,而是显示当你游玩时还有多少性能剩余。与您的游戏速度相比,该值越大,您的游戏将可以运行越流畅,并有更多性能剩余来让您添加更多东西。请注意,该值在会话期间可能有很大的变化,但是当您关闭游戏时,GameMaker Studio 2 中的编译器输出窗口将显示最小值和最大值以及平均值(请注意,最小值可以为负数!这不是一个错误,而是由于启动时间和游戏在初始化时被处理的方式所导致的)。
* 纹理交换 - 这个数字显示你的游戏每个游戏帧(该时间是 GameMaker Studio 2 运行所有事件的统一时间,每秒钟的游戏帧数由房间速度决定)交换纹理的次数。纹理(精灵和背景)存储在纹理页面上,如果您的游戏中有很多图像资源,那么GameMaker Studio 2 必须在纹理页面之间进行交换以将其全部绘制,因此如果该值很高(例如超过20),那么您真的需要研究如何优化它,因为该值过高会影响您的游戏性能,特别是在移动端。
* 顶点批次 - 这是每个游戏帧游戏将纹理批次发送到GPU的次数,以及(与纹理交换)一样,您会希望这个值尽可能低。纹理批次,基本上是一组数据,一次性发送到GPU进行渲染。当您更改字体,颜色,混合模式或影响全局绘制效果的任何其他绘图状态时,该批次将被“破坏”,因此您应该尝试将这些行为尽可能限制,否则批次数太大将对您的游戏性能产生不利影响。
注意:纹理交换和顶点批次永远不会为零,通常会显示2或3,因为即使空房间内没有对象,GameMaker Studio 2 仍然需要绘制和批处理。 使用这些工具,您可以看到游戏的表现如何,以及需要“调整”哪些方面才能提高游戏的性能。您可以在 YoYo Games 帮助中心 - 优化您的游戏中找到有关性能问题和优化游戏的方法的更多信息。 作为调试编译游戏的附加工具,当您在Window上运行最终游戏包时,可以使用某些命令行参数。有关工作原理的信息,请看这里。
- 介绍
- 新手须知
- 版本授权
- 安装
- 更新
- 发布日志
- 所需SDK
- 账号
- 首选项设置
- 拖拽编程
- 扩展编辑器设置
- 基本项设置
- 图片编辑器设置
- 语言设置
- 市场设置
- 对象编辑器设置
- 插件设置
- 资源树设置
- 场景编辑器设置
- 运行库设置
- 样条编辑器设置
- 精灵编辑器设置
- 文本编辑器设置
- 瓷片编辑器设置
- 时间轴设置
- 输入
- 快速上手
- 概览
- 启动页
- 工作区
- 资源树
- 工作流
- 创建精灵
- 创建瓷片集
- 创建音频
- 创建对象
- 创建场景
- 编译
- 调试
- 快捷键
- 菜单
- 文件菜单
- 编辑菜单
- 构建菜单
- 窗口菜单
- 工具菜单
- 市场菜单
- 帮助菜单
- 布局菜单
- 附加信息
- 位运算符和二进制
- 命令行
- 出错信息
- 文件系统
- 导入非位图精灵
- JSDoc使用
- 微型WEB服务端
- 过时函数
- 纹理页
- 使用缓冲区
- 编辑器
- 扩展编辑器
- 字体编辑器
- 图像编辑器
- 内含文件编辑器
- 备注编辑器
- 对象编辑器
- 路径编辑器
- 场景编辑器
- 脚本编辑器
- 着色器编辑器
- 音频编辑器
- 精灵编辑器
- 瓷片集编辑器
- 时间轴编辑器
- 对象可用事件
- 异步事件
- 绘制事件
- 手势事件
- 其它
- 调试管理器
- 设备管理器
- YoYo资源市场
- 输出停靠栏
- 项目图生成器
- 最近使用窗口
- 远程工作
- 混音器
- 版本控制
- 设置项
- 音频组
- 配置项
- 跨平台配置
- 纹理组
- 游戏配置选项
- AmazonFire 配置
- Android配置
- HTML5配置
- iOS配置
- Linux配置
- Mac配置
- Windows配置
- WindowsUWP配置
- 脚本编程
- 拖放编程概览
- 拖放编程功能索引
- GML概览
- 代码
- 数组
- array_create
- array_copy
- array_equals
- array_length_1d
- array_height_2d
- array_length_2d
- 赋值
- 表达式
- 数据存取
- 功能性语法
- 函数
- 脚本
- 注释
- 关键词
- 变量及作用域
- variable_global_exists
- variable_global_get
- variable_global_set
- variable_instance_exists
- variable_instance_get
- variable_instance_get_names
- variable_instance_set
- 寻址变量
- 评估顺序
- 数据类型
- is_array
- is_bool
- is_int32
- is_int64
- is_matrix
- is_ptr
- is_real
- is_string
- is_undefined
- is_vec3
- is_vec4
- 变元计数
- 指针
- 内置变量属性
- async_load
- health
- lives
- score
- GML函数索引
- asset_get_index
- asset_get_type
- Compatibility_Functions
- Asynchronous Functions
- Audio
- Buffers
- Cameras And Display (摄像机和显示)
- Cameras(摄像机)
- camera_apply
- camera_create
- camera_create_view
- camera_destroy
- camera_get_active
- camera_get_begin_script
- camera_get_default
- camera_get_end_script
- camera_get_proj_mat
- camera_get_update_script
- camera_get_view_angle
- camera_get_view_border_x
- camera_get_view_border_y
- camera_get_view_height
- camera_get_view_mat
- camera_get_view_speed_x
- camera_get_view_speed_y
- camera_get_view_target
- camera_get_view_width
- camera_get_view_x
- camera_get_view_y
- camera_set_begin_script
- camera_set_default
- camera_set_end_script
- camera_set_proj_mat
- camera_set_update_script
- camera_set_view_angle
- camera_set_view_border
- camera_set_view_mat
- camera_set_view_pos
- camera_set_view_size
- camera_set_view_speed
- camera_set_view_target
- view_camera
- view_current
- view_enabled
- view_get_camera
- view_get_hport
- view_get_surface_id
- view_get_visible
- view_get_wport
- view_get_xport
- view_get_yport
- view_hport
- view_set_camera
- view_set_hport
- view_set_surface_id
- view_set_visible
- view_set_wport
- view_set_xport
- view_set_yport
- view_surface_id
- view_visible
- view_wport
- view_xport
- view_yport
- The Screen Display
- Controls
- Data_Structures(数据结构)
- ds_exists
- ds_set_precision
- DS Grids
- DS Lists(列表)
- ds_list_create
- ds_list_destroy
- ds_list_clear
- ds_list_empty
- ds_list_size
- ds_list_add
- ds_list_set
- ds_list_delete
- ds_list_find_index
- ds_list_find_value
- ds_list_insert
- ds_list_replace
- ds_list_shuffle
- ds_list_sort
- ds_list_copy
- ds_list_read
- ds_list_write
- ds_list_mark_as_list
- ds_list_mark_as_map
- DS Maps(映射表)
- ds_map_exists
- ds_map_create
- ds_map_add
- ds_map_clear
- ds_map_copy
- ds_map_replace
- ds_map_delete
- ds_map_empty
- ds_map_size
- ds_map_find_first
- ds_map_find_last
- ds_map_find_next
- ds_map_find_previous
- ds_map_find_value
- ds_map_read
- ds_map_write
- ds_map_destroy
- ds_map_secure_save
- ds_map_secure_save_buffer
- ds_map_secure_load
- ds_map_secure_load_buffer
- ds_map_add_list
- ds_map_add_map
- ds_map_replace_list
- ds_map_replace_map
- DS Priority Queues
- DS Queues
- DS Stacks
- Debugging
- Drawing
- draw_enable_drawevent
- draw_flush
- Colour(颜色)
- colour_get_blue
- colour_get_green
- colour_get_hue
- colour_get_red
- colour_get_saturation
- colour_get_value
- draw_clear
- draw_clear_alpha
- draw_get_alpha
- draw_get_colour
- draw_getpixel
- draw_getpixel_ext
- draw_set_alpha
- draw_set_colour
- make_colour_hsv
- make_colour_rgb
- merge_colour
- Forms
- draw_arrow
- draw_button
- draw_circle
- draw_circle_colour
- draw_ellipse
- draw_ellipse_colour
- draw_healthbar
- draw_line
- draw_line_colour
- draw_line_width
- draw_line_width_colour
- draw_path
- draw_point
- draw_point_colour
- draw_rectangle
- draw_rectangle_colour
- draw_roundrect
- draw_roundrect_colour
- draw_roundrect_colour_ext
- draw_roundrect_ext
- draw_set_circle_precision
- draw_triangle
- draw_triangle_colour
- GPU
- gpu_get_alphatestenable
- gpu_get_alphatestref
- gpu_get_blendenable
- gpu_get_blendmode
- gpu_get_blendmode_dest
- gpu_get_blendmode_destalpha
- gpu_get_blendmode_ext
- gpu_get_blendmode_ext_sepalpha
- gpu_get_blendmode_src
- gpu_get_blendmode_srcalpha
- gpu_get_colorwriteenable
- gpu_get_cullmode
- gpu_get_fog
- gpu_get_state
- gpu_get_texfilter
- gpu_get_texfilter_ext
- gpu_get_texrepeat
- gpu_get_texrepeat_ext
- gpu_get_zfunc
- gpu_get_ztestenable
- gpu_get_zwriteenable
- gpu_pop_state
- gpu_push_state
- gpu_set_alphatestenable
- gpu_set_alphatestref
- gpu_set_blendenable
- gpu_set_blendmode
- gpu_set_blendmode_ext
- gpu_set_blendmode_ext_sepalpha
- gpu_set_colorwriteenable
- gpu_set_cullmode
- gpu_set_fog
- gpu_set_state
- gpu_set_texfilter
- gpu_set_texfilter_ext
- gpu_set_texrepeat
- gpu_set_texrepeat_ext
- gpu_set_zfunc
- gpu_set_ztestenable
- gpu_set_zwriteenable
- Lighting
- draw_get_lighting
- draw_light_define_ambient
- draw_light_define_direction
- draw_light_define_point
- draw_light_enable
- draw_light_get
- draw_light_get_ambient
- draw_set_lighting
- Mipmapping
- gpu_get_tex_max_aniso
- gpu_get_tex_max_aniso_ext
- gpu_get_tex_max_mip
- gpu_get_tex_max_mip_ext
- gpu_get_tex_min_mip
- gpu_get_tex_min_mip_ext
- gpu_get_tex_mip_bias
- gpu_get_tex_mip_bias_ext
- gpu_get_tex_mip_enable
- gpu_get_tex_mip_enable_ext
- gpu_get_tex_mip_filter
- gpu_get_tex_mip_filter_ext
- gpu_set_tex_max_aniso
- gpu_set_tex_max_aniso_ext
- gpu_set_tex_max_mip
- gpu_set_tex_max_mip_ext
- gpu_set_tex_min_mip
- gpu_set_tex_min_mip_ext
- gpu_set_tex_mip_bias
- gpu_set_tex_mip_bias_ext
- gpu_set_tex_mip_enable
- gpu_set_tex_mip_enable_ext
- gpu_set_tex_mip_filter
- gpu_set_tex_mip_filter_ext
- Particles
- Particle Emitters
- part_emitter_burst
- part_emitter_clear
- part_emitter_create
- part_emitter_destroy
- part_emitter_destroy_all
- part_emitter_exists
- part_emitter_region
- part_emitter_stream
- Particle Systems
- part_particles_clear
- part_particles_count
- part_particles_create
- part_particles_create_colour
- part_system_automatic_draw
- part_system_automatic_update
- part_system_clear
- part_system_create
- part_system_create_layer
- part_system_depth
- part_system_destroy
- part_system_draw_order
- part_system_drawit
- part_system_exists
- part_system_get_layer
- part_system_layer
- part_system_position
- part_system_update
- Particle Types
- part_type_alpha1
- part_type_alpha2
- part_type_alpha3
- part_type_blend
- part_type_clear
- part_type_colour_hsv
- part_type_colour_mix
- part_type_colour_rgb
- part_type_colour1
- part_type_colour2
- part_type_colour3
- part_type_create
- part_type_death
- part_type_destroy
- part_type_direction
- part_type_exists
- part_type_gravity
- part_type_life
- part_type_orientation
- part_type_scale
- part_type_shape
- part_type_size
- part_type_speed
- part_type_sprite
- part_type_step
- Simple Effects
- ef_cloud
- ef_ellipse
- ef_explosion
- ef_firework
- ef_flare
- ef_rain
- ef_ring
- ef_smoke
- ef_smokeup
- ef_snow
- ef_spark
- ef_star
- effect_clear
- effect_create_above
- effect_create_below
- Primitives(基本几何体)
- draw_primitve_begin
- draw_primitive_begin_texture
- draw_primitive_end
- draw_vertex
- draw_vertex_colour
- draw_vertex_texture
- draw_vertex_texture_colour
- Primitive Building
- vertex_argb
- vertex_begin
- vertex_colour
- vertex_create_buffer
- vertex_create_buffer_ext
- vertex_create_buffer_from_buffer
- vertex_create_buffer_from_buffer_ext
- vertex_delete_buffer
- vertex_end
- vertex_float1
- vertex_float2
- vertex_float3
- vertex_float4
- vertex_freeze
- vertex_get_buffer_size
- vertex_get_number
- vertex_normal
- vertex_position
- vertex_position_3d
- vertex_submit
- vertex_texcoord
- vertex_ubyte4
- Vertex Formats
- vertex_format_add_colour
- vertex_format_add_custom
- vertex_format_add_normal
- vertex_format_add_position
- vertex_format_add_position_3d
- vertex_format_add_textcoord
- vertex_format_begin
- vertex_format_delete
- vertex_format_end
- Sprites_and_Tiles
- draw_enable_swf_aa
- draw_get_swf_aa_level
- draw_self
- draw_set_swf_aa_level
- draw_skeleton
- draw_skeleton_collision
- draw_skeleton_instance
- draw_skeleton_time
- draw_sprite
- draw_sprite_ext
- draw_sprite_general
- draw_sprite_part
- draw_sprite_part_ext
- draw_sprite_pos
- draw_sprite_stretched
- draw_sprite_stretched_ext
- draw_sprite_tiled
- draw_sprite_tiled_ext
- draw_tile
- draw_tilemap
- Surfaces
- application_get_position
- application_surface
- application_surface_draw_enable
- application_surface_enable
- application_surface_is_enabled
- draw_surface
- draw_surface_ext
- draw_surface_general
- draw_surface_part
- draw_surface_part_ext
- draw_surface_stretched
- draw_surface_stretched_ext
- draw_surface_tiled
- draw_surface_tiled_ext
- surface_copy
- surface_copy_part
- surface_create
- surface_create_ext
- surface_exists
- surface_free
- surface_get_height
- surface_get_texture
- surface_get_width
- surface_getpixel
- surface_getpixel_ext
- surface_reset_target
- surface_resize
- surface_save
- surface_save_part
- surface_set_target
- surface_set_target_ext
- The Application Surface
- Text
- draw_highscore
- draw_set_font
- draw_set_halign
- draw_set_valign
- draw_text
- draw_text_colour
- draw_text_ext
- draw_text_ext_colour
- draw_text_ext_transformed
- draw_text_ext_transformed_colour
- draw_text_transformed
- draw_text_transformed_colour
- Textures
- draw_texture_flush
- texture_get_height
- texture_get_texel_height
- texture_get_texel_width
- texture_get_uvs
- texture_get_width
- texture_global_scale
- texture_set_stage
- File Handing
- Fonts
- Game
- In App Purchases
- Instances
- 数学运算(Maths)
- Date and Time
- 数字方法(Number Functions)
- Vector Functions
- Matrices
- Miscellaneous
- Movement and Collisions
- Networking
- Objects
- Paths
- Physics
- 场景(Rooms)
- 常规的场景函数及变量(General Room Functions And Varibales)
- 常规图层函数(General Layer Functions)
- 瓷片函数(TIlemap Tile Functions)
- 背景图层(Backgrounds)
- 精灵图层(Sprites)
- Scirpts
- Shaders
- Sprites
- Steam API
- Strings
- Timelines
- Web
- XBox_Live
- 翻译名词对照表