GameMaker:Studio中的纹理组
Autukill 发表于 2016-02-16 10:55:42 1655

本帖最后由 Autukill 于 2016-2-17 09:55 编辑

[font=Tahoma]以前的文章,已经提及了相关的概念,还没有更具体的深入说清[/font][list]
[*][font=Tahoma]为什么不建议外部加载精灵(纹理)[/font]
[*]为什么纹理组不提供音频组(Audio Groups)那样的函数,动态加载/卸载音频资源
[*][font=Tahoma]如何合理分配[/font][font=Tahoma]纹理组[/font]
[*][font=Tahoma]纹理组([/font][font=Tahoma]Texture Groups[/font])[font=Tahoma]是如何影响性能的[/font]
[*][font=Tahoma]什么是纹理交[/font]换([backcolor=rgb(252, 252, 252)]texture swaps)[/backcolor],长什么样子
[/list]
GMS存在一些比较特别的特性,比如禁止访问外部文件的沙盒系统,当然这对于一个游戏引擎不会有任何坏的影响,我们仍然可以从服务器下载资源包。还有,GMS所采用的预编译纹理,也是其他引擎不具备的,编译的时候,GMS对纹理进行了压缩。GMS采用的这种静态机制,缺乏可操作性。

为了能动态加载/卸载纹理页(可从“运行时内存”中卸载纹理组),社区有人想到了方法 Custom external sprite handling ,通过算法动态拼接外部图片到纹理页(surface),并转换成一张张大的 background 资源,以此来替代系统的纹理组。首先,这个方法是对的,并且短时间内得到社区认可,可之后大伙意识到严重问题,虽然可以随意控制纹理,CPU占用在YYC的作用下得到解决,但是载入的图片反而占用了巨大的"运行时内存",因为载入“运行时内存”的图片的数据格式是32bit PNG,而我们不能控制数据格式(其他专业引擎是可以控制的)。比如一张1024*1024的纹理图,RGBA每个8bit,共32bit 每个像素点,将占用4MB的内存,(1024*1024*32bit= 33554432bit = 4MB)。

目前的纹理组系统适用于静态的,对于动态面临的问题和 Custom external sprite handling 是一样的,对于的外部载入图片的压缩也有人在想办法解决。其实,抛开动态性,GMS内置的纹理组系统在性能方面是最优的方案,游戏全部资源在启动时全部载入,同时全部图片资源在运行时内存中是被无损压缩的,我们应该充分利用这个特性,而不是抱怨。

对于我们来说,在大部分情况下,往往是draw事件占用了CPU时间,GMS提供了相关的DEBUG工具帮助解决性能问题。通过 debug overlay ,我们能看到前一帧的纹理页交换的次数(texture swaps )和提交到GPU的顶点组数量(vertex batches)

为了充分利用纹理组系统,我们绘制的时候,应该把同时绘制的图片都分配到一个纹理组下。因为纹理分配算法的问题,子图不能被分配在一块,需要我们指定好每一个图片Assets的纹理组。比如背包界面,我们可以把道具icon和相关的Ui图分配到一张纹理页上,并同时绘制他们。(在这里,我建议大家少使用surface,因为一个 surface 相当于一张纹理,增加资源占用,而 surface 的一些特性可以采用shader来替代。当然啦,该使用的时候还是使用。)

[attach]1973[/attach]
比如情景:大地图上摆放了100个关卡入口按钮,按钮分为可点击(红,蓝,绿)和不可点击(灰色)两种状态,可点击按钮上有关卡序号,关卡成就,最大可玩关卡上面绘制关卡箭头(人头),最大可玩关卡下面播放光环效果。如果因为某种原因,关卡序号的字体与按钮不在一张纹理页上,其他元素都在一张纹理页上,那么我们可以这样:
//按钮 visible = false ,通过另外一个obj的draw事件执行:
with(最大可点击按钮) draw_effect()
with(按钮) draw_self()
with(可点击按钮) draw_achievement()
with(最大可点击按钮) draw_head()
//触发纹理页交换
with(可点击按钮) draw_index_text()
如果,绘制事件由每个按钮来控制,那么每绘制一个可点击按钮,就需要切换一次纹理,性能就被拉下去了。

除了纹理页的交换次数,还有纹理大小(Texture Pages Size)。纹理大小越小越好,减轻纹理页交换时的性能消耗。对此,需要我们权衡纹理大小,和纹理交换次数,请根据自己项目情况配置。比如,目前的主流移动端设备,纹理页设为1024较为适中。

最后呢,优化性能的事,放到项目最后来弄。编译最好使用YYC,你也看到了,我提了很多次CPU。


最新回复 (5)
  • serbow 发表于 2016-02-20 12:46:40
    0 2
    :):):):):)已拜读。
  • hantouch 发表于 2016-02-21 10:18:10
    0 3
    我下载了天天泡泡TA,很好玩哦!!
  • zxc64925 发表于 2016-05-09 10:17:32
    0 4
    这家伙很懒,啥都没留,= =
  • BloveStorm 发表于 2017-02-22 08:09:31
    0 5
    凹凸这篇好文章被我漏掉了。
    一年后前来顶你!