EaselJS和多层画布系统:性能调整,游戏开发,事件处理

问题描述 投票:2回答:2

我是一名工程师,我们目前正在将Red5 + Flash游戏移植到Node.js + Easeljs html5应用程序中。

[基本上:这是一个棋盘游戏,不是一个RPG。图层系统意味着我们基于功能具有多个画布。例如,有一个带有图像的静态背景舞台。有一层仅用于计时器。

默认情况下,所有画布大小均为1920x1080,如果需要,我们会缩小以适应分辨率。

第一种方法使用了dynamic.js,但是当游戏变得复杂时,性能下降了。然后我们切换到画架,因为它的抽象级别较低,因此我们可以决定如何实现更多功能,而不仅仅是使用提供的强大功能。

我很乐观,但是现在又开始显示缓慢,这就是为什么我想深入了解内部并进行出色的性能调整。 (当然,在Chrome中一切正常,Firefox是问题所在,但游戏必须在所有现代浏览器上都能流畅运行)。

主层(舞台)是地图,包含约30个容器,每个容器中都有一个复杂的自定义形状,约10张图像。容器正在侦听鼠标事件,例如鼠标悬停,退出,单击。当前,例如在鼠标悬停时,我用渐变填充形状。

以某种方式,当我使用缓存时,就像在测试中那样,性能会变得更差,所以我认为我正在弄乱某些东西。

我收集了一些高级问题:

  1. 在上述情况下,什么时候可以使用缓存,如何使用?我已经尝试过在init上缓存,在用其他颜色或渐变填充后再进行cacheUpdate,然后按stage.update()。没有影响。

  2. 如果我有一个静态的,永不更改的阶段缓存,则在该层上没有意义,对吧?

  3. stage.update()到底是做什么的?触发全层重绘?该文档提到了某种智能型,如果更改后会重绘效果。

  4. 如果我想用新的颜色或渐变填充自定义形状,我必须完全重绘其图形,而不仅仅是使用setFill方法,对吧?]]

  5. 例如,在画架中不可能仅重绘一个容器,所以我怎么能不更新整个阶段,而只更新一个容器?我以为我可以通过缓存来实现这一点,缓存所有容器,只需更新已更改的容器,但是这种方式对我来说根本不起作用。

  6. 缓存位图图像有意义吗?如果容器中有自定义形状和图像,哪个更好?缓存容器或仅将形状存储在容器中。

  7. 我发现了一个奇怪的错误,或者至少是一个有趣的线索。我的画布层完全重叠。在下层,鼠标悬停侦听效果很好,但是单击不在同一容器/对象上。

  8. 如何将点击事件传播到具有点击侦听器的重叠图层?我已经使用简单的DOM,jquery进行了尝试,但是事件对象与画布侦听器想要获取的对象相去甚远。

  9. 总而言之,在尝试调音时,我已经玩得很成功:cache()updateCache()update()mouseEnabledsnapToPixelclear()autoClear,[C0 ],enableMouseOveruseRAF

任何答案,建议,起点都值得赞赏。

UPDATE:

此免费棋盘游戏是一种策略游戏,因此您正在面对约30个领土的世界地图。自定义形状是区域,容器包含区域形状和应在区域上方的图标。此容器的重叠是最小的。

示例鼠标事件是悬停效果。玩家在区域形状上导航,然后形状被重新着色,调整大小等,并出现一个气泡,显示有关该位置的详细信息。

基本上,最大数量为1-3的容器可以一次更改(初始化阶段除外->此时全部更改)。不仅FF中的动画和重新着色慢,而且侦听器延迟也很高。

我写了一个更改处理程序,所以我只setFPS()勾选修改的阶段和动画运行的阶段(tweenjs)。

[在我的第一种方法中,我将游戏期间可能需要至少将每个图像放置到容器中,所以我只在图像上设置了可见标志(不是矢量)。

我是一名工程师,我们目前正在将Red5 + Flash游戏移植到Node.js + Easeljs html5应用程序中。基本上:这是一个棋盘游戏,而不是RPG。图层系统意味着我们有多个...

performance caching canvas dom-events easeljs
2个回答
0
投票

关于缓存:有一些奇怪的缓存问题,但是随着某些大小的缓存矩形的出现,性能可能会下降:stage.update()


0
投票

2:如果您的图层或舞台没有变化,请不要为该图层调用stage.update()(这样它就不会被渲染,这会给我更低的CPU!)例如,保留全局的“ stagechanged”变量,并在发生某些更改时将其设置为true:

© www.soinside.com 2019 - 2024. All rights reserved.