索引
HT for Web
的树表格和拓扑图等2D
组件,无需特殊处理即可轻松承载万以上Data
元素,但对于Graph3dView
组件如需承载上千上万的数量级,
则需要进行特殊的批量处理。批量能提高性能的原理在于,当图元一个个独立绘制模型时性能较差,而但一批图元聚合成一个大模型进行一次性的绘制时,
则会极大提高WebGL
刷新性能。
批量的处理相当于吃饭,如果一小口一小口的吃速度慢得瓶颈在于交互过程过频繁,如果换个大一点的勺子大口吃就可以减少交互过程,
但WebGL
、JavaScript
和浏览器都是有内存等资源限制,HT
自动把所有数据聚合成一个大批量只进行一次绘制也是不现实的,
相当于我们人的口再大也不可能一口吃下一碗饭,因此需要用户根据项目的具体情况,将图元归纳出不同的批量方案以提高绘制性能。
目前HT
支持对图元的body
部分进行批量,还不支持label
、note
和icons
的附属部分的批量,因此本章节介绍的图元批量针对图元的主体模型部分。
node.setStyle('batch', 'firstBatch');
以上为最简单的批量设置方式,该方式下batch
名相同的图元都会自动聚合成批量一次性绘制。通过切换上例工具条的Enable Batch
开关可体验是否批量的性能差距。
ht.Default.setBatchInfo('firstBatch', {
color: 'red',
brightness: true,
blend: true,
alphaTest: 0.4,
});
批量还有诸多参考可控制,大部分情况下需要先通过ht.Default.setBatchInfo
函数全局注册批量,再对Data
设置对应的batch
批量名。
如果未通过ht.Default.setBatchInfo
进行注册就设置图元的batch
属性,则代表采用HT
的默认批量参数:
alphaTest
:默认为0.4
,当图形是不透明时(即没有设置 transparent 属性),贴图alpha
透明度低于这个值则直接不显示brightness
:默认为false
,则图元选中的select.brightness
效果不起作用,需要设置为true
打开高亮功能blend
:默认为false
,代表图元不进行染色,需要设置为true
打开染色功能color
:默认为undefined
,该属性优先级高于独立图元面颜色,因此如果设置了该颜色图元所有面都将显示为该颜色值Graph3dView
默认关闭了批量染色和批量亮度的功能,因此批量中如需启用blend
和brightness
,则需通过如下函数启用:
graph3dView.setBatchBlendDisabled(false)
graph3dView.setBatchBrightnessDisabled(false)
批量解决了性能问题,但也带来了功能减少或减弱的副作用,例如目前HT
一个批量仅支持一张贴图,该贴图信息由注册批量时的image
属性决定,
这样对于六面体需要不同面贴不同的图片时,则需要将多张图片融合成一张大图片,然后由六面体独立定义每个面对应的uv
相关参数实现。
for (var i = 0; i < row; i++) {
for (var j = 0; j < column; j++) {
createNode(startX + gap * j, startZ, size).s({
'batch': 'uvBatch',
'bottom.uv': [0.25, 0, 0.25, 0.25, 0.5, 0.25, 0.5, 0],
'left.uv': [0, 0.75, 0, 1, 0.25, 1, 0.25, 0.75],
'right.uv': [0.5, 0.75, 0.5, 1, 0.75, 1, 0.75, 0.75],
'all.blend': '#00FFFF',
'top.visible': i % 2 === 0
});
}
startZ -= gap;
}
ht.Default.setBatchInfo('uvBatch', {
brightness: brightness,
blend: blend,
image: 'die',
topUv: [0.25, 0.5, 0.25, 0.75, 0.5, 0.75, 0.5, 0.5],
backUv: [0.25, 0.75, 0.25, 1, 0.5, 1, 0.5, 0.75],
frontUv: [0.25, 0.25, 0.25, 0.5, 0.5, 0.5, 0.5, 0.25],
reverseColor: 'yellow',
reverseCull: reverseCull,
reverseFlip: reverseFlip
});
以上例子筛子的六个面的uv
信息部分面通过注册batchInfo
时全局设置,部分面通过图元的style
对应的*.uv
属性设置,
图元style
配置的uv
属性信息优先级高于注册批量参数,一般来说如果批量图元面的uv
信息一致的情况下,通过全局配置较为方便,
不必更新每个图元对应面属性,如果有特殊图元不同于全局则可独立再设置style
对应的uv
信息。
uv
参数:
leftUv
:默认为空,用于批量指定左面uv
参数,优先级低于图元Data
具体参数值left.uv
和all.uv
rightUv
:默认为空,用于批量指定右面uv
参数,优先级低于图元Data
具体参数值rigth.uv
和all.uv
frontUv
:默认为空,用于批量指定前面uv
参数,优先级低于图元Data
具体参数值front.uv
和all.uv
backUv
:默认为空,用于批量指定后面uv
参数,优先级低于图元Data
具体参数值back.uv
和all.uv
topUv
:默认为空,用于批量指定顶面uv
参数,优先级低于图元Data
具体参数值top.uv
和all.uv
bottomUv
:默认为空,用于批量指定底面uv
参数,优先级低于图元Data
具体参数值bottom.uv
和all.uv
uvScale
参数:
leftUvScale
:默认为空,用于批量指定左面uvScale
参数,优先级低于图元Data
具体参数值left.uv.scale
和all.uv.scale
rightUvScale
:默认为空,用于批量指定右面uvScale
参数,优先级低于图元Data
具体参数值rigth.uv.scale
和all.uv.scale
frontUvScale
:默认为空,用于批量指定前面uvScale
参数,优先级低于图元Data
具体参数值front.uv.scale
和all.uv.scale
backUvScale
:默认为空,用于批量指定后面uvScale
参数,优先级低于图元Data
具体参数值back.uv.scale
和all.uv.scale
topUvScale
:默认为空,用于批量指定顶面uvScale
参数,优先级低于图元Data
具体参数值top.uv.scale
和all.uv.scale
bottomUvScale
:默认为空,用于批量指定底面uvScale
参数,优先级低于图元Data
具体参数值bottom.uv.scale
和all.uv.scale
csgUvScale
:默认为空,用于批量指定csg
面uvScale
参数,优先级低于图元Data
具体参数值csg.uv.scale
和all.uv.scale
uvOffset
参数:
leftUvOffset
:默认为空,用于批量指定左面uvOffset
参数,优先级低于图元Data
具体参数值left.uv.offset
和all.uv.offset
rightUvOffset
:默认为空,用于批量指定右面uvOffset
参数,优先级低于图元Data
具体参数值rigth.uv.offset
和all.uv.offset
frontUvOffset
:默认为空,用于批量指定前面uvOffset
参数,优先级低于图元Data
具体参数值front.uv.offset
和all.uv.offset
backUvOffset
:默认为空,用于批量指定后面uvOffset
参数,优先级低于图元Data
具体参数值back.uv.offset
和all.uv.offset
topUvOffset
:默认为空,用于批量指定顶面uvOffset
参数,优先级低于图元Data
具体参数值top.uv.offset
和all.uv.offset
bottomUvOffset
:默认为空,用于批量指定底面uvOffset
参数,优先级低于图元Data
具体参数值bottom.uv.offset
和all.uv.offset
csgUvOffset
:默认为空,用于批量指定csg
面uvOffset
参数,优先级低于图元Data
具体参数值csg.uv.offset
和all.uv.offset
注意以上并没有
csgUv
参数,csg
挖空的面的uv
参数由具体CSGNode
挖空图元各个面的uv
参数决定, 但csgUvScale
和csgUvOffset
参数会影响所有csg
挖空面的最终呈现效果。
除了前面介绍的color
、brightness
和blend
的批量参数外,还有以下批量参考可设置,这些参数都只能在全局注册批量时指定,
具体图元上的相应属性被忽略。
image
:默认为空,指定则代表进行贴图显示,为空代表显示颜色 light
:默认为true
,代表显示光亮效果,可设置为false
关闭光效果 reverseCull
:默认为false
,决定反面是否裁剪,可设置为true
对反面进行裁剪不显示reverseFlip
:默认为false
,反面是否显示正面的内容,为false
则显示reverseColor
颜色reverseColor
:默认为#868686
,决定反面颜色transparentMask
:默认值为false
,该属性能使得图元不绘制显示在界面上,但依然可以点击选中uvOffset
:默认值为空,该属性会在所有面已决定的uv
参数上再增加偏移uvScale
:默认值为空,该属性会在所有面已决定的uv
参数上再乘以倍数discardSelectable
:默认值为true
,代表贴图透明度低到被剔除的部分也能点击选中,可设置为false
则被剔除部分不可选中最后还有几个透明相关批量参数,目前同一批量仅支持都为不透明物体,或者都为透明物体,不支持部分面透明部分面不透明的混合情况。
opacity
:默认值为undefined
,整体图形在3D
下的透明度,可值范围0~1
transparent
:默认值为false
,如果贴图有透明度,图形颜色有透明度,或者设置了opacity
有透明度情况下,需要设置该参数为true
autoSort
:默认值为true
,透明物体需要以由远往近方式绘制才能在WebGL系统
中正确呈现颜色叠加效果,HT
内部默认会对批量透明进行排序后绘制,在某些情况下为提高性能可设置为false
关闭自动排序功能批量除了有些功能限制的副作用外,对批量内的图元频繁更新也会导致性能不佳,一般建议将不常变化的图元归到同一批量中, 将常变化的图元归到同一批量中,如果需要对同批量中的大部分图元进行更新,建议可在更新前调用以下函数。 一般情况下注册到全局的批量参数较少需要修改,如果进行了修改也可以通过调用以下函数通知图形界面进行更新:
g3d.invalidateBatch(name)
:无效指定的批量名对应的所有批量图元Graph3dView
中可呈现两类线框效果:
Graph3dView
内部已自动对所有线框类型进行了批量,因此用户无需对线框设置批量。
基本属性中提到,Graph3dView
默认关闭了批量染色和批量亮度的功能,批量中如需启用blend
和brightness
,
需通过graph3dView.setBatchBlendDisabled(false)
和graph3dView.setBatchBrightnessDisabled(false)
启用。
Graph3dView
上还有个batchColorDisabled
的属性,该值默认为false
也就是启用批量颜色,当系统场景无需批量,
也未使用到线框效果时,可通过graph3dView.setBatchColorDisabled(true)
关闭批量颜色,这样有助于提高性能,
并留下更多资源允许加载更多盏灯光效果。