## 調試
游戲的編程階段,無論是使用代碼還是拖放模塊,都非常容易犯錯誤 - 使用錯誤的變量,傳遞錯誤的參數或使用錯誤的函數是我們所犯的一些最常見的錯誤 - 腳本/動作編輯器附帶的語法檢查器并不能沒有遺漏地檢測到這些錯誤。這意味著,這些錯誤只有在您實際運行或編譯游戲時才會變得明顯,即使這樣,有時也難以準確地知道出現的問題是什么。因此,及時了解您的游戲在所選設備上的表現,以及房間中的實例,所創建的全局變量以及其他詳細信息,是至關重要的。
現在,您可以通過在游戲中添加所謂的“調試代碼”,來在屏幕上顯示所需的信息,或者您可以使它在出現錯誤時顯示消息,這樣可以自己檢查這些信息。但是這通常會帶來大量的工作,如果您不確定問題在哪里,那么您可能在嘗試和錯誤的追蹤錯誤上耗費大量時間。對此,GameMaker Studio 2 提供了一個被稱為調試模式的特殊測試模式,它將啟動調試模塊以及一個全面的錯誤報告系統,可在運行時顯示信息,以幫助您跟蹤游戲中出現的問題。 以下內容為你可使用的調試游戲的不同方式:
### 錯誤報告
當在編譯和執行項目時發生錯誤,會在“編譯錯誤輸出”窗口中顯示一條消息,如下所示:

大多數編譯器錯誤消息遵循相同的模式,其中包含一條消息,指示對象發生錯誤,然后是事件與行號,最后簡要描述錯誤本身。 錯誤報告提供的信息非常重要,因為它會檢測并報告導致游戲崩潰的語法和語言相關的錯誤,但不會報告更多的細微錯誤,也不會給出修復反饋。 對于此類型情況你應該使用調試模式(下一點即為該模式的詳細解釋)。除了這些編譯錯誤,您還可以獲得語法錯誤。 當您添加 DnD? 操作或代碼時,將會檢測到這些操作,并顯示在“語法錯誤輸出”窗口中,與下圖所示相似:
與編譯器錯誤一樣,語法錯誤窗口將引導您找到對象,事件和出現問題的特定行,并且通常也會簡要說明錯誤是什么。
### 調試模式
如果您需要更詳細地檢查,可以通過單擊調試運行按鈕在調試模式下運行游戲。 當您這樣操做時,調試模塊將隨您的游戲一起打開。 該模塊允許您監視游戲中從全局性能到各個變量值的一切工作。 您可以從以下頁面中找到有關調試模塊的更多信息以及如何使用它們:
* 調試模塊
請注意,當您使用調試模塊時,您還可以添加斷點到您的代碼或 DnD?。 斷點是游戲循環中您希望調試模塊暫停,并讓您手動遍歷實際游戲代碼的一個點。 您可以使用快捷鍵 F9 添加斷點,它們將顯示在“輸出”窗口中,您可以根據需要啟用/禁用它們。
### 檢測性能
當運行游戲進行調試時,您還可以通過使用調試模塊中的輪廓選項來了解游戲的運行情況,并了解所有部件是否運行一致。 它將提供有關游戲運行情況以及執行特定功能調用或事件所需要時間的非常詳細的信息(有關詳細信息,請參閱“調試模塊”一節)。 但是,這要求調試模塊正在運行,這可能不是您所希望的,尤其是如果您希望測試設備上的最終可執行文件... 在這些情況下,作為分析器的補充,您可以在游戲中顯示調試狀態條,這將顯示游戲正在使用的內存量,CPU功率和GPU功率。

此調試條在實際的游戲窗口中顯示了 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
- 翻譯名詞對照表