Voltar ao Blog

Unreal Engine World Partition Convert Fix: Como Resolver Infinite Loading e Travamentos no Editor

Publicado em 7 de junho de 2026
Unreal Engine World Partition Convert Fix: Como Resolver Infinite Loading e Travamentos no Editor

Em resumo

Este artigo aborda como resolver travamentos e problemas de carregamento infinito ao converter mapas legados no Unreal Engine para o sistema World Partition. A solução consiste em evitar a interface gráfica do editor e executar a conversão via linha de comando usando o `WorldPartitionConvertCommandlet`, além de rodar um script de validação em Python para detectar conflitos de coordenadas e componentes. Também são apresentadas práticas recomendadas para mitigar gargalos de I/O de disco causados pelo sistema One File Per Actor (OFPA) e integrações de controle de versão. Por fim, o guia discute a escalabilidade desses mundos massivos usando soluções de backend multiplayer dedicadas como o horizOn.

Você clica em "Convert" no menu do World Partition e o seu editor do Unreal Engine trava instantaneamente. A barra de progresso congela em 0%, o uso de CPU dispara para 100% em um único core e sua única opção é forçar o encerramento do processo pelo Gerenciador de Tarefas ou pelo terminal. Esse loop de infinite loading durante a conversão do mapa é um obstáculo conhecido para equipes que estão migrando mapas legados ou protótipos de grande escala para a moderna arquitetura de streaming espacial do Unreal Engine. Embora a UI do editor faça com que a conversão pareça tão simples quanto um clique de menu, executá-la em um nível não trivial dispara uma cascata de gravações síncronas de assets, alocações de grid espacial e loops de serialização de pacotes que a thread do editor não consegue dar conta.

Se a sua equipe está com dificuldades para implementar o unreal engine world partition convert fix, a solução está em contornar a UI do editor completamente e auditar programaticamente os seus assets de mapa. Abaixo, vamos detalhar os motivos técnicos por trás dessas falhas de conversão, como executar o processo de conversão com segurança usando o framework de commandlets do Unreal e como automatizar verificações de validação pre-flight para economizar horas de debugging.

Por Trás dos Panos: Por que a Conversão de World Partition Trava o Seu Editor

Para corrigir o travamento da conversão, primeiro você precisa entender o que o Unreal Engine está tentando fazer quando você inicia a conversão. Em um level legado (.umap), todos os actors, propriedades e componentes são serializados em um único pacote monolítico massivo. O World Partition substitui isso dividindo o level em um grid espacial e armazenando cada actor em seu próprio arquivo separado usando o sistema One File Per Actor (OFPA).

Durante a conversão, a engine realiza três operações altamente intensivas que falham com frequência:

1. Alocação de Spatial Hash Grid e o Loop de Coordenadas Infinito

O Unreal Engine mapeia a bounding box de cada actor para uma célula do grid. Por padrão, o World Partition usa um tamanho de grid espacial de 25.600 unidades (256 metros) por célula. Se você tiver um actor — como um particle system perdido, um actor auxiliar de UI ou um volume de colisão desconfigurado — posicionado em coordenadas extremas (por exemplo, X=2.000.000, Y=-5.000.000), a engine tentará gerar metadados de célula para cada célula entre a origem e esse actor. Isso dispara um loop infinito de alocação de memória, travando o editor enquanto ele tenta particionar milhões de células vazias.

2. Disk Throttling e Bloqueios de Diretório (OFPA)

Converter um mapa com 15.000 actors significa que a engine precisa criar 15.000 arquivos .uasset individuais dentro do diretório ExternalActors. No editor, esse processo é executado de forma síncrona na main thread. Se você tiver uma integração ativa de controle de versão (como Perforce ou Git) ou um antivírus com varredura em tempo real ativo nos diretórios do seu projeto, cada gravação de arquivo será interceptada. O sistema operacional bloqueia os handles dos arquivos, forçando a thread do editor a esperar, o que se manifesta como um travamento infinito.

3. Esgotamento de Memória e Falhas de Serialização de Pacotes

Durante a conversão, o editor carrega todos os blueprints, static meshes e texturas referenciados na memória para recalcular os limites (bounds) e gravar pacotes de actors limpos. Sem RAM suficiente, a engine fica sem memória física e trava (stalls), pois passa a depender fortemente da paginação de disco. Além disso, dependências circulares não resolvidas ou blueprints corrompidos podem levar a crashes graves no packaging, semelhantes ao Unreal Package HasValidBlueprint Ensure Crash, que interrompe o worker de serialização completamente.


Passo a Passo do Fix 1: Conversão Baseada em Commandlet (O Caminho Seguro)

Nunca converta mapas de médio a grande porte pela UI do Unreal Editor. Em vez disso, use o WorldPartitionConvertCommandlet. Executar a conversão via linha de comando isola o processo da UI thread do editor, permite que a engine faça o Garbage Collection de memória de forma mais eficiente e fornece a saída de logs em tempo real no seu terminal para que você possa ver exatamente qual actor está causando o travamento.

Crie um script bash (convert_map.sh) ou um script batch do Windows (convert_map.bat) dentro da pasta do seu projeto. Aqui está o script robusto e aprovado por desenvolvedores para Windows:

@echo off
SET "UNREAL_ENGINE_PATH=C:\Program Files\Epic Games\UE_5.5\Engine\Binaries\Win64\UnrealEditor-Cmd.exe"
SET "PROJECT_PATH=D:\Projects\MyGame\MyGame.uproject"
SET "MAP_NAME=/Game/Maps/Campaign_Main"

echo Starting World Partition Conversion for %MAP_NAME%...

"%UNREAL_ENGINE_PATH%" "%PROJECT_PATH%" ^
    -run=WorldPartitionConvertCommandlet ^
    "%MAP_NAME%" ^
    -AllowCommandletRendering ^
    -Force ^
    -Verbose ^
    -stdout ^
    -unattended ^
    -NoShaderCompile ^
    -LOG=WorldPartitionConversion.log

if %ERRORLEVEL% NEQ 0 (
    echo Conversion failed! Check Saved\Logs\WorldPartitionConversion.log
    exit /b %ERRORLEVEL%
)

echo Conversion completed successfully!

Explicação dos Parâmetros (Flags) Críticos do Commandlet:

  • UnrealEditor-Cmd.exe: Sempre use o executável de linha de comando em vez do UnrealEditor.exe padrão. Ele envia os logs diretamente para o stdout e fecha imediatamente ao concluir.
  • -AllowCommandletRendering: Força a engine a inicializar os recursos de renderização. Isso evita travamentos se o seu mapa contiver actors ou componentes que exijam cálculos de bounds de GPU ou compilação de materiais durante a serialização.
  • -Force: Instrui o conversor a sobrescrever quaisquer assets de external actors existentes. Isso é crítico se uma tentativa de conversão anterior travou pela metade e deixou assets corrompidos no diretório ExternalActors.
  • -unattended: Suprime todos os pop-ups modais e caixas de diálogo. Sem isso, a conversão pode parar silenciosamente em segundo plano, esperando que você clique em "OK" em algum alerta de referência de asset.
  • -NoShaderCompile: Evita que o compilador de shaders inicie novas threads, economizando um consumo significativo de CPU e memória durante a conversão.

Passo a Passo do Fix 2: Script Python de Validação Pre-Flight

Executar o script de conversão às cegas ainda pode falhar se o seu mapa contiver dados corrompidos ou incorretos. Para garantir o sucesso, use o script abaixo para auditar o pacote do seu mapa antes de executar o conversor. Esse script Python roda no Unreal Editor (certifique-se de que o Python Editor Script Plugin está ativado) e verifica coordenadas extremas, actors nulos e alta densidade de componentes que costumam travar o processo de serialização.

Salve este script como wp_preflight_check.py e execute-o pelo console Python ou arrastando-o para a janela do editor:

import unreal

def validate_map_for_world_partition(map_path, max_boundary_cm=1000000.0):
    """
    Validates a monolithic map asset before converting it to World Partition.
    Scans for null references, extreme actor coordinates, and component counts.
    """
    # Initialize the asset registry to find the target level
    asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()
    map_asset = asset_registry.get_asset_by_object_path(unreal.SoftObjectPath(map_path))
    
    if not map_asset:
        unreal.log_error(f"[PREFLIGHT] Map asset not found at path: {map_path}")
        return False
        
    unreal.log(f"[PREFLIGHT] Loading map package to analyze: {map_path}")
    world = unreal.EditorLoadingAndSavingUtils.load_map(map_path)
    if not world:
        unreal.log_error("[PREFLIGHT] Failed to load the map package into the editor context.")
        return False
        
    # Query all actors currently present in the persistent level
    actors = unreal.GameplayStatics.get_all_actors_of_class(world, unreal.Actor)
    total_actors = len(actors)
    unreal.log(f"[PREFLIGHT] Analyzing {total_actors} actors for potential conversion hazards...")
    
    invalid_actors = 0
    out_of_bounds_actors = []
    heavy_components_actors = []
    
    for actor in actors:
        if not actor or not actor.is_valid():
            invalid_actors += 1
            continue
            
        actor_name = actor.get_actor_label()
        
        # 1. Coordinate Boundary Checks (Detects spatial grid loops)
        location = actor.get_actor_location()
        if (abs(location.x) > max_boundary_cm or 
            abs(location.y) > max_boundary_cm or 
            abs(location.z) > max_boundary_cm):
            out_of_bounds_actors.append((actor_name, location))
            
        # 2. Check for component bloat that leads to serialization hangs
        components = actor.get_all_child_actors(True)
        if len(components) > 150:
            heavy_components_actors.append((actor_name, len(components)))
            
    # Compile the pre-flight report
    unreal.log("------------------ PRE-FLIGHT REPORT ------------------")
    unreal.log(f"Total Actors Audited: {total_actors}")
    
    success = True
    
    if invalid_actors > 0:
        unreal.log_error(f"[FAIL] Found {invalid_actors} invalid/corrupted actors. Clean up your map hierarchy first.")
        success = False
    else:
        unreal.log("[PASS] No corrupted actors found.")
        
    if out_of_bounds_actors:
        unreal.log_warning(f"[WARN] Found {len(out_of_bounds_actors)} actors at extreme coordinates. These will cause infinite spatial grid loops:")
        for name, loc in out_of_bounds_actors:
            unreal.log_warning(f"  -> Actor: '{name}' is at X={loc.x:.1f}, Y={loc.y:.1f}, Z={loc.z:.1f}")
        success = False
    else:
        unreal.log("[PASS] All actors lie within reasonable spatial boundaries.")
        
    if heavy_components_actors:
        unreal.log_warning(f"[WARN] Found {len(heavy_components_actors)} actors with high child/component density:")
        for name, count in heavy_components_actors:
            unreal.log_warning(f"  -> Actor: '{name}' has {count} children (consider merging or nesting)")
            
    unreal.log("-------------------------------------------------------")
    return success

# Execute validation on your target map path
# Example: validate_map_for_world_partition("/Game/Maps/Campaign_Main")

Resolvendo Bloqueios de I/O de Disco e de Controle de Versão

Se a verificação em Python passar e o commandlet ainda travar, o problema é de ambiente. A conversão de World Partition cria milhares de arquivos de assets físicos dentro da estrutura de diretórios em poucos segundos.

Para resolver problemas de bloqueio de disco:

  1. Exclua os diretórios do projeto da Proteção em Tempo Real: Abra a Segurança do Windows (ou a sua suíte de antivírus corporativa) e adicione a pasta raiz do seu projeto à lista de exclusão. Scanners de antivírus em tempo real tentarão inspecionar cada arquivo .uasset individual à medida que ele é gravado no diretório ExternalActors, travando completamente a fila do disco e fazendo com que o gravador de assets do Unreal sofra timeout.
  2. Desative temporariamente os Plugins de Controle de Versão: Antes de rodar o script de conversão, renomeie temporariamente os arquivos .uplugin ou desative o Perforce/Git na configuração do seu editor. Assim que o mapa for convertido com sucesso, você poderá reativar o plugin de controle de versão, adicionar o novo diretório ExternalActors à sua changelist e fazer o commit.
  3. Execute com Privilégios de Administrador: Em alguns ambientes de desenvolvimento corporativo, restrições de gravação em diretórios impedem que os commandlets criem subdiretórios sob demanda, levando a falhas silenciosas de gravação e travamento de threads.

Escalando para Mundos Massivos: A Dimensão do Backend

Converter o seu mapa para World Partition é o primeiro passo para lidar com coordenadas massivas e cenários altamente detalhados. No entanto, rodar um jogo de mundo grande traz um novo conjunto de desafios para a sua infraestrutura multiplayer.

Quando o seu mundo de jogo abrange vários quilômetros quadrados, uma única instância de Dedicated Server não consegue processar de forma eficiente replicação, colisão e física para todos os jogadores. Para manter a performance do servidor, os desenvolvedores devem remover assets desnecessários para o servidor, um processo detalhado no nosso guia sobre dedicated server asset stripping.

Mesmo com o asset stripping, um mundo massivo acaba exigindo zoneamento de servidor (server zoning) e transições contínuas (seamless) de jogadores. Construir um backend de servidor distribuído que gerencie alocação dinâmica de servidores, matchmaking entre zonas e sincronização de banco de dados em tempo real é uma tarefa gigantesca. Desenvolvedores costumam passar meses programando load balancers personalizados, session managers e pipelines de sincronização de banco de dados para suportar lobbies em grande escala.

É aqui que o horizOn entra, oferecendo um Backend-as-a-Service pronto e pré-arquitetado, projetado especificamente para desenvolvedores de jogos multiplayer. Ao gerenciar de forma automática a persistência de jogadores, o gerenciamento de sessões de baixa latência e a sincronização de estado no server-side, nossa plataforma permite que a sua equipe foque na criação de sistemas de gameplay e na otimização de performance do client, em vez de debugar infraestrutura.


Boas Práticas para Conversões de World Partition

Siga estas 4 diretrizes testadas em batalha para garantir conversões de mapas tranquilas e evitar regressões:

  1. Defina Limites de Level Claros Primeiro (Level Bounds): Sempre coloque um actor ALevelBounds no seu mapa antes da conversão. Isso fornece ao builder do World Partition uma bounding box precisa para o spatial hash, impedindo que o gerador processe assets perdidos posicionados em coordenadas infinitas.
  2. Limpe Dependências Circulares de Blueprint: Garanta que as suas level blueprints não contenham dependências diretas de casting com actors que estão sendo convertidos em arquivos externos. Dependências circulares forçam a ferramenta de packaging a recarregar pacotes no meio da serialização, frequentemente causando memory leaks e travamentos na conversão.
  3. Execute Conversões em um Estado Limpo da Engine: Sempre reinicie o seu sistema ou limpe o cache de shaders e o DerivedDataCache (DDC) antes de converter níveis massivos. Isso libera memória RAM do sistema e garante que o commandlet não trave com assets em cache desatualizados.
  4. Isole o Diretório ExternalActors no Git/Perforce: Certifique-se de que os seus arquivos .gitignore ou .p4ignore estejam configurados corretamente para ignorar arquivos de lock temporários, enquanto rastreiam os arquivos .uasset gerados no diretório ExternalActors.

Pronto para Escalar o seu Backend Multiplayer?

Executando suas conversões através de commandlets e verificando as posições dos actors programaticamente, você pode facilmente evitar travamentos do editor e seguir em frente com o desenvolvimento do seu jogo. Assim que seus levels massivos estiverem particionados e otimizados, o próximo passo é garantir que o seu backend aguente a carga.

Em vez de passar semanas configurando matchmaking personalizado, sistemas de lobby e replicação de estado de jogadores, deixe o horizOn fazer o trabalho pesado. Experimente gratuitamente hoje mesmo ou leia a documentação da API para ver como é simples conectar o seu projeto do Unreal Engine.


Fonte: Convert map to world partition not working unreal engine 5.7.4