gm8图像渲染流程心得

默认分类·游戏开发笔记 · 2015-05-10 · 1563 人浏览

draw的工作流程很特殊,在gm中,有一幅内置的画布会保存即将发生的绘制工作,我们所有的绘制任务都在这块画布上进行

例如 draw_text(),draw_sprite()

这块画布不在屏幕上显示,只有在每结束前,draw事件进行时,才会被绘制到屏幕上。这也是我们实际看到的东西,就像surface一样,你可以在surface上进行绘制工作,但只有将surface绘制到屏幕上才能被看见

Gm中有两个关键函数

  • screen_redraw() 调用绘图事件重绘房间。
  • screen_refresh() 使用当前房间图像刷新显示(而不是使用绘图事件)。

F1帮助文档中的解释是:第一个 redraw 函数重绘了内置画布,然后刷新屏幕图像。第二个函数 refresh 只是刷新了一次屏幕图像

我们在其他的事件中进行绘制时并不会显示,是因为将东西都画到了内置的画布上,而我们在绘制到内置画布上后,并没有调用第一个函数刷新屏幕,等到每一的最后,也就是绘制事件发生时,游戏执行了第二个函数,将内置画布重绘

而gm在进行绘制时是按深度从大到小绘制贴图和精灵,绘制事件发生时,深度最大的是背景,所以首先会在内置画布上绘制出背景,覆盖你在上一步和这一步内所有绘制在内置画布上的东西,然后再执行其他的绘制任务,最后刷新屏幕,将内置画布上的东西绘制到屏幕。因此给人造成在其他事件中进行绘制操作时无效的假象

step和draw的区别

Step事件:

只执行动作

Draw事件:

  1. 重绘画布 (执行默认的绘制动作,绘制房间背景和视角以及实例精灵,由深度决定绘制顺序)
  2. 执行动作并刷新屏幕 (执行draw事件里的动作如绘制表面,精灵和粒子等,同时每进行一次绘制刷新一次屏幕)

所以普通的步事件比draw事件执行要快

如果要使用step进行绘制的话,必须使用set_automatic_draw(0)停止默认的绘制动作,否则在绘制事件发生时会清除全部内置画布的图像并且刷新屏幕,不仅会造成效率低下,还会发生闪屏

表面和draw事件发生冲突的原因也很简单,新建表面属于新建了一张新画布,因此你使用时必须重新设定绘图目标到表面,并只能将表面绘制到屏幕

Theme Jasmine by Kent Liao