Używam BufferGeometry, aby narysować tysiące sześcianów, które stanowią teren, ale trudno jest dowiedzieć się, jak zaktualizować geometrię, jeśli potrzebuję zmienić pozycję jednej z kostek. Na przykład, mam ten kod, aby zainicjować mój geometrii (robię moje testy na zaktualizowanej wersji this example)Jak szybko zaktualizować dużą BufferGeometry?
// 12 triangles per cube (6 quads)
var triangles = 12 * 150000;
var geometry = new THREE.BufferGeometry();
geometry.attributes = {
position: {
itemSize: 3,
array: new Float32Array(triangles * 3 * 3),
numItems: triangles * 3 * 3
},
normal: {
itemSize: 3,
array: new Float32Array(triangles * 3 * 3),
numItems: triangles * 3 * 3
},
color: {
itemSize: 3,
array: new Float32Array(triangles * 3 * 3),
numItems: triangles * 3 * 3
}
}
positions = geometry.attributes.position.array;
normals = geometry.attributes.normal.array;
colors = geometry.attributes.color.array;
Jeśli przeniosę sześcian, to nie wydaje się być przemieszczane aż robię :
geometry.attributes.position.needsUpdate = true;
Powoduje to spadek FPS podczas aktualizacji. Czy istnieje inny sposób, w jaki mogę to zrobić? Wydaje się nieco niepotrzebne, gdy zmieniam tylko jedną kostkę (12 trójkątów/36 wierzchołków). Chociaż może to być - nie sprawdziłem, co faktycznie robi needsUpdate
. Zgadywanie wysyła ponownie tablicę do modułu cieniującego.
Myślałem, że mogę podzielić geometrię na oddzielne mniejsze wartości BufferGeometries, ale nie jestem pewien, czy to pomogłoby w ogólnej wydajności. Z tego co rozumiem, więcej geometrii = mniej FPS.
Jeśli ktoś ma jakieś pomysły, jak bym to zrobił, byłby to docenione! :) Oprócz problemu aktualizacji, BufferGeometry wydaje się dokładnie tym, czego potrzebuję. Dzięki!
Nie wiem, która wersja została zmieniona, ale od 'r81' ten został włączony do [' BufferAttribute'] (https: // github.com/mrdoob/three.js/blob/r81/src/core/BufferAttribute.js#L27). – Jay