like I said, bones would be grouped in to multiple tables, so you could have 50+ bones per table and only check one of them (preferably center). Make a second camera with a FOV of ~100 (or more), and have that camera be checking if a group of bones is in view or not. The impact of this for me is negligible, and is significantly compensated with the performance gains.
example:
local BoneGroups = {
{bone1, bone2, etc.};
{bone1, bone2, etc.};
{bone1, bone2, etc.};
{bone1, bone2, etc.};
};
local AcceptedBoneGroups = {1, 2, 3, 4};
for i, V in pairs(AcceptedBoneGroups) do
for _, P in pairs(BoneGroups[V]) do
-- transform bones
end
end
you would refresh the AcceptedBoneGroups table before transforming the bones.