pour 10 " étages de pyramide" donc 9 subdivision de l'espace, la recherche de la zone finale correspondante pour 1 million de point prend seulement 0.6 sec, et sans multiThread.. la resolution final etant de 512x512 bloc. soit 78mx78m..
je laisse le bout de code au cas ou :
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
public class Zone : MonoBehaviour {
// nombre etage pyramide Quadtree //
[Range(2,10)] public int deph = 0;
public int zoneCount;
private int Rayon = 20000;
private Rect[] R;
private Vector2 point;
private int ActiveZone;
void Start () {
CreateZone();
point = Random.insideUnitCircle*Rayon;
findZone(0);
}
void Update () {
// touche "c" du clavier
// actualise le quadtree si l'on change le "deph" de l''inspecteur
if( Input.GetKeyDown("c") ){
float TP = Time.realtimeSinceStartup;
CreateZone();
findZone(0);
print ( Time.realtimeSinceStartup - TP);
}
// debug de toute les zone, de tous les etage du quadtree
for ( int i = 0 ; i < R.Length/4 ; i++){
Vector3 A = new Vector3(R[i].xMin, 0, R[i].yMin);
Vector3 B = new Vector3(R[i].xMin, 0, R[i].yMax);
Vector3 C = new Vector3(R[i].xMax, 0, R[i].yMin);
Vector3 D = new Vector3(R[i].xMax, 0, R[i].yMax);
Debug.DrawLine(A,B, new Color(1.0f,1.0f,1.0f,0.2f));
Debug.DrawLine(B,D, new Color(1.0f,1.0f,1.0f,0.2f));
Debug.DrawLine(C,D, new Color(1.0f,1.0f,1.0f,0.2f));
Debug.DrawLine(A,C, new Color(1.0f,1.0f,1.0f,0.2f));
}
Debug.DrawRay( new Vector3( point.x , 0 , point.y), Vector3.up * 10000, Color.red);
// touche "r" clavier :
// lance la recherche de la zone pour 1M de points, choisis au hasard dans la map
if( Input.GetKeyDown("r") ){
float TP = Time.realtimeSinceStartup;
for ( int i = 0 ; i < 1000000 ; i++){
point = Random.insideUnitCircle*Rayon;
findZone(0);
}
print ( Time.realtimeSinceStartup - TP);
}
//affichae en rouge de la zone ou l'on se trouve//
Vector3 a = new Vector3(R[ActiveZone].xMin, 0, R[ActiveZone].yMin);
Vector3 b = new Vector3(R[ActiveZone].xMin, 0, R[ActiveZone].yMax);
Vector3 c = new Vector3(R[ActiveZone].xMax, 0, R[ActiveZone].yMin);
Vector3 d = new Vector3(R[ActiveZone].xMax, 0, R[ActiveZone].yMax);
Debug.DrawLine(a,b, new Color(1.0f,0.0f,0.0f,1.0f));
Debug.DrawLine(b,d, new Color(1.0f,0.0f,0.0f,1.0f));
Debug.DrawLine(c,d, new Color(1.0f,0.0f,0.0f,1.0f));
Debug.DrawLine(a,c, new Color(1.0f,0.0f,0.0f,1.0f));
}
void CreateZone(){
int count = 0;
for ( int i = 0 ; i < deph ; i++){
count += Mathf.RoundToInt(Mathf.Pow(4,i));
}
R = new Rect[count];
R[0] = new Rect(-Rayon , -Rayon , Rayon*2 ,Rayon*2);
for ( int i = 0 ; i < (R.Length/4) ; i++){
Rect r = R[i];
float size = r.width/2;
R[i*4+1] = new Rect(r.xMin, r.center.y , size , size);
R[i*4+2] = new Rect(r.xMin, r.yMin , size , size);
R[i*4+3] = new Rect(r.center.x, r.center.y , size , size);
R[i*4+4] = new Rect(r.center.x, r.yMin , size , size);
}
zoneCount = R.Length;
}
void findZone(int z){
ActiveZone = z*4+4;
if( R[z*4+1].Contains(point)){
ActiveZone = z*4+1;
}
else if( R[z*4+2].Contains(point)){
ActiveZone = z*4+2;
}
else if( R[z*4+3].Contains(point)){
ActiveZone = z*4+3;
}
if( (ActiveZone*4+4)< zoneCount){
findZone(ActiveZone);
}
}
}
reste a savoir comment m'en servir pour cette histoire de collider.