[用法解析]Application Surface 用法三例
Autukill 发表于 2014-06-06 07:18:45 1924

本帖最后由 Autukill 于 2014-6-6 19:37 编辑

作者:Autukill
论坛:http://www.gamemake.org/forum.php?mod=viewthread&tid=430
WIKI:http://wiki.gamemake.org/index.php?doc-view-11

[hr]

Application Surface在Game Maker:Studio 中取到什么用处?[align=left]可以说,所有OBJ中Draw及Draw_Begin,Draw_End事件所执行的绘制动作,都绘制在AS上。[/align]
[align=left][hr]
[/align][align=left]Game Maker:Studio 1.3或者Early Access 新增内置表面变量:Application Surface(AS),第一次接触AS是在官方技术博文的源码中看到的,它让我想起了DirectX中的主页面(页面也称表面),它与辅助页面(不仅仅一张)组成交换链。主页面显示,辅助页面在绘制,防止画面闪烁,随后指向两页面的指针交换地址,继续显示、绘制……(也叫做页面翻转)。[/align]

[align=left]可晓而知,Game Maker:Studio暴露了底层,并自动处理了这个交换链。当然,我们可以取消这个自动交换链,根据需求来处理和优化游戏的性能。[/align]

[align=left]下面是三个AS使用例子:[/align]
[font=黑体]游戏暂停画面[/font][align=left][attach]568[/attach]
[/align]
[align=left]文件下载:http://pan.baidu.com/s/1bnq1p6n[/align]
[align=left]思路来源:优化“绘制”效率的方法 中的源码[/align]
[align=left]优点:无需创建表面及后续操作[/align]
[align=left]用法前提:[/align][align=left]//声明一个状态变量,来控制一下函数的调用。[/align]
[align=left]//调用此函数,取消GMS自动处理交换链[/align][align=left]application_surface_draw_enable(false); [/align]
[align=left]//在Draw_Begin事件中清除AS内容,模拟交换链的清除功能[/align][align=left]draw_clear(c_black)[/align]
[align=left]//在Draw_GUI事件中绘制AS[/align][align=left]draw_surface_stretched(application_surface, 0, 0, ww, hh);[/align]
[align=left]//取消ROOM中Background选项卡中Draw_Background Color。这个动作会把我们的AS覆盖。[/align]
[align=left]//如果Room使用了View,也必须取消View选项卡中的:[/align][align=left]Clear Display Buffer With Window Colour.[/align][align=left]Clear Background with Window Colour [/align]
[font=宋体]画面震动[/font][font=宋体]
[/font]
[align=left]优点:同样无需多余的表面[/align]
[align=left]用法提示:[/align][align=left]因为所有绘制的结果都存储在AS中,再结合游戏暂停画面相关用法,取消自动交换链,在Step事件中结合随机数生成坐标变量,通过Draw_GUI展现画面震动。[/align][align=left][font=宋体]
[/font][/align][font=宋体]着色器全屏渲染[/font][font=宋体]
[/font]
[align=left]用法提示:[/align][align=left]取消自动交换链后,在Draw_GUI中,按照平常使用Shadern那样处理即可。[/align]
最新回复 (6)
  • 红色激情 发表于 2014-06-06 08:14:43
    0 2
    沙发,顶下高端知识贴!!!
  • lancecross 发表于 2014-06-10 10:18:18
    0 3
    非程序员看着压力好大
  • lancecross 发表于 2014-07-09 01:19:05
    0 4
    话说 这个暂停方法和把view绘制在surface上都有一样的问题 就是切换全屏和窗口的时候 surface会丢掉(AS虽然不会被Free,但是内容还是会丢失)
  • Autukill 发表于 2014-07-09 04:20:49
    0 5
    Quotelancecross 发表于 2014-7-9 13:19
    话说 这个暂停方法和把view绘制在surface上都有一样的问题 就是切换全屏和窗口的时候 surface会丢掉(AS虽 ...


    谢谢提醒。

    有个解决法子就是:触发全屏后,重绘一次就可以了

  • 佛经forever 发表于 2014-09-23 10:43:21
    0 6
    强烈支持楼主ing……