索引
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.uvrightUv:默认为空,用于批量指定右面uv参数,优先级低于图元Data具体参数值rigth.uv和all.uvfrontUv:默认为空,用于批量指定前面uv参数,优先级低于图元Data具体参数值front.uv和all.uvbackUv:默认为空,用于批量指定后面uv参数,优先级低于图元Data具体参数值back.uv和all.uvtopUv:默认为空,用于批量指定顶面uv参数,优先级低于图元Data具体参数值top.uv和all.uvbottomUv:默认为空,用于批量指定底面uv参数,优先级低于图元Data具体参数值bottom.uv和all.uvuvScale参数:
leftUvScale:默认为空,用于批量指定左面uvScale参数,优先级低于图元Data具体参数值left.uv.scale和all.uv.scalerightUvScale:默认为空,用于批量指定右面uvScale参数,优先级低于图元Data具体参数值rigth.uv.scale和all.uv.scalefrontUvScale:默认为空,用于批量指定前面uvScale参数,优先级低于图元Data具体参数值front.uv.scale和all.uv.scalebackUvScale:默认为空,用于批量指定后面uvScale参数,优先级低于图元Data具体参数值back.uv.scale和all.uv.scaletopUvScale:默认为空,用于批量指定顶面uvScale参数,优先级低于图元Data具体参数值top.uv.scale和all.uv.scalebottomUvScale:默认为空,用于批量指定底面uvScale参数,优先级低于图元Data具体参数值bottom.uv.scale和all.uv.scalecsgUvScale:默认为空,用于批量指定csg面uvScale参数,优先级低于图元Data具体参数值csg.uv.scale和all.uv.scaleuvOffset参数:
leftUvOffset:默认为空,用于批量指定左面uvOffset参数,优先级低于图元Data具体参数值left.uv.offset和all.uv.offsetrightUvOffset:默认为空,用于批量指定右面uvOffset参数,优先级低于图元Data具体参数值rigth.uv.offset和all.uv.offsetfrontUvOffset:默认为空,用于批量指定前面uvOffset参数,优先级低于图元Data具体参数值front.uv.offset和all.uv.offsetbackUvOffset:默认为空,用于批量指定后面uvOffset参数,优先级低于图元Data具体参数值back.uv.offset和all.uv.offsettopUvOffset:默认为空,用于批量指定顶面uvOffset参数,优先级低于图元Data具体参数值top.uv.offset和all.uv.offsetbottomUvOffset:默认为空,用于批量指定底面uvOffset参数,优先级低于图元Data具体参数值bottom.uv.offset和all.uv.offsetcsgUvOffset:默认为空,用于批量指定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~1transparent:默认值为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)关闭批量颜色,这样有助于提高性能,
并留下更多资源允许加载更多盏灯光效果。