首先,這裏是你的函數改寫寫在上面的註釋(幾乎)最佳性能的一個例子,renderloop顯然只是一個例子來說明哪裏做的呼叫:
var width = renderer.context.canvas.width;
var height = renderer.context.canvas.height;
// has to be called whenever the canvas-size changes
function onCanvasResize() {
width = renderer.context.canvas.width;
height = renderer.context.canvas.height;
});
var projMatrix = new THREE.Matrix4();
// renderloop-function, called per animation-frame
function render() {
// just needed once per frame (even better would be
// once per camera-movement)
projMatrix.multiplyMatrices(
camera.projectionMatrix,
projMatrix.getInverse(camera.matrixWorld)
);
hudObjects.forEach(function(obj) {
toScreenPosition(obj, projMatrix);
});
}
// wrapped in IIFE to store the local vector-variable (this pattern
// is used everywhere in three.js)
var toScreenPosition = (function() {
var vector = new THREE.Vector3();
return function __toScreenPosition(obj, projectionMatrix) {
// this could potentially be left away, but isn't too
// expensive as there are 'needsUpdate'-checks in place
obj.updateMatrixWorld();
vector.setFromMatrixPosition(obj.matrixWorld);
vector.applyMatrix4(projectionMatrix);
vector.x = (vector.x + 1) * width/2;
vector.y = (1 - vector.y) * height/2;
// might want to consider returning a Vector3-instance
// instead, depends on how the result is used
return {x: vector.x, y: vector.y};
}
})();
但,考慮到你想渲染一個HUD,最好獨立於主場景進行渲染,使所有上述計算過時,並且允許你選擇不同的座標系來確定HUD元素的大小和位置。
我在這裏有一個例子:https://codepen.io/usefulthink/pen/ZKPvPB。在那裏,我使用了一個正交相機和一個單獨的場景,在3D場景的頂部渲染HUD元素。不需要額外的計算。另外,我可以以像素單位方便地指定HUD元素的大小和位置(使用透視相機也是一樣,只需要更多三角函數即可)。
每次調用該函數時都不要實例化一個新的'THREE.Vector3';創建一個並重用它。函數返回時不要實例化新對象。每次調用時不要重新計算寬度/高度哈爾夫。並且不要調用'obj.updateMatrixWorld()'。渲染器爲你調用每一幀。 – WestLangley
@WestLangley你測試了你的解決方案嗎?我不認爲這可以解決我的問題,當它在場景中有超過100多個hud對象來計算2D屏幕中的位置時。因爲我現在沒有使用object3d,只需計算object3d的中心點,就像你剛纔說的Vector3一樣。 –
@WestLangley寫的幾乎是普遍真實的,並且會在一定程度上改善你的表現。雖然可能還不夠。另一個可能的優化是'.project()' - 調用。這在內部必須計算相機的matrixWorldInverse,這是相當昂貴的操作。你應該考慮以一種緩存整個幀中的變換矩陣的計算的方式重新實現它:https://github.com/mrdoob/three.js/blob/ae2cda96f52b763b27b9c0cf77f1a9ed498fd706/src/math/Vector3.js#L318 -L323 - 您將剩下幾個JS可以很好處理的計算 –