13.07.2015 Views

Capítulo X: Introducción

Capítulo X: Introducción

Capítulo X: Introducción

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Capítulo 4: Visualización Out-of-CoreCollapse. Es importante señalar que este algoritmo puede realizar lasoperaciones de collapse a que las hubiese lugar sin chequear sudisponibilidad en memoria principal, puesto que se mantiene lainvariante que las representaciones del volumen con menor detalle que Ssiempre estarán en la memoria principal. En cambio, al realizar unaoperación de split, se verifica que sus hijos se encuentran en memoriaprincipal, pues de lo contrario, la operación de split no puede efectuarse.Debido a que los hijos de un nodo se cargan mediante un GOB, y pormantener siempre el nodo que se refina en memoria principal, bastasaber que un hijo se encuentra en memoria principal para garantizar quetodos los hijos también lo están.El hilo cargador chequea si debe actualizar el error en los nodos, yreordenar sus conjuntos, si la bandera compartida “sincronizar” estáprendida. De lo contrario intenta realizar una operación de split, si haysuficientes páginas de memoria libres en ramFreeList. De lo contrario, esnecesario el collapse para habilitar un split. Las operaciones de split ycollapse no realizan ninguna operación de E/S. Únicamente actualizanlas estructuras de datos. Sólo la operación loadGOB carga los hijos delbrick más prioritario para refinar (S + [0]) en un búfer de a lo sumo 8bricks llamado gobBuffer. Debido al quick-sort parcial, en determinadoscasos los conjuntos S + .A y C + .A podrían quedar vacíos si la banderasincronizar no se activa durante varios frames. En estos casos, elproceso cargador debe ejecutar de nuevo el quick-sort parcial paracontinuar con su ejecución. Estos y otros detalles menores no sonmostrados en el algoritmo 4.1 para mantener su simplicidad y claridad.PRINCIPAL (Main)salir = false; sincronizar = false;Cargar(Raiz(octree), ramList);ramFreeList = todos(ramSize)-Raiz(octree);S = Raiz(octree); C = vacio();texList = Raiz(octree);texFreeList = todos(N)-Raiz(octree);CrearProceso(Loader);While (not salir)If (cambió ROI o IP o Ojo o F.T.)UpdateError(S,C);PartialSort(S, M);PartialSort(C, M);semasforo1.lock();sincronizar = true;semasforo1.unlock();semaforo2.lock();SplitCollapse(S,C,DL,ramList,texList,texFreeList);semaforo2.unlock();Render(S,DL,ramList);EndWhileCARGADOR (Loader)C + = vacio(); S + = Raiz(octree);While (not salir)If (sincronizar)Semaforo1.lock();sincronizar = false;semaforo1.unlock();UpdateError(S + , C + );PartialSort(S + , M + );PartialSort(C + , M + );else if (SplitOK(S + [0], ramFreeList))loadGOB(S + [0], gobBuffer);semaforo2.lock();Split(S + [0], S + , C + , gobBuffer, ramList,ramFreeList);semaforo2.unlock();elsesemaforo2.lock();if (C + [0] C and E(C + [0]) < E(S + [0])Collapse(C + [0], S + , C + ,ramList, ramFreeList);semaforo2.unlock();EndWhileAlgoritmo 4.1: algoritmo en alto nivel de los procesos principal y cargador.-73-

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!