В прошлом я неоднократно замечал, что код C и C ++ использует следующий формат для этих структур:
class Vector3
{
float components[3];
//etc.
}
class Matrix4x4
{
float components[16];
//etc.
}
class Quaternion
{
float components[4];
//etc.
}
У меня вопрос, приведет ли это к более высокой производительности кеша, чем, скажем, следующее:
class Quaternion
{
float x;
float y;
float z;
//etc.
}
... Так как я все равно предполагаю, что члены класса и функции находятся в непрерывном пространстве памяти? В настоящее время я использую последнюю форму, потому что считаю ее более удобной (однако я также вижу практический смысл в форме массива, поскольку она позволяет рассматривать оси как произвольные в зависимости от выполняемой операции).
Послушав несколько советов респондентов, я проверил разницу, и на самом деле она медленнее с массивом - разница в частоте кадров составляет около 3%. Я реализовал operator [], чтобы обернуть доступ к массиву внутри Vector3.Не уверен, имеет ли это какое-либо отношение к этому, но я сомневаюсь в этом, так как это все равно должно быть встроено. Единственный фактор, который я мог видеть, заключался в том, что я больше не мог использовать список инициализаторов конструктора на Vector3 (x, y, z)
. Однако когда я взял исходную версию и изменил ее, чтобы больше не использовать списки инициализаторов конструктора, она работала незначительно медленнее, чем раньше (менее 0,05%). Понятия не имею, но, по крайней мере, теперь я знаю, что исходный подход был быстрее.