6
votes

Y a-t-il une alternative plus rapide à utiliser des textures dans Xna?

J'écris un programme d'édition de carte pour un jeu 2D en utilisant XNA. Pour créer une texture2D pour toutes les tuiles qu'une carte nécessite une tâche trop longue.

Y a-t-il des alternatives à l'utilisation de textures pour dessiner avec XNA?

J'ai tenté de créer une seule texture par tuile définie au lieu d'une texture pour chaque carreau d'un ensemble de tuiles, mais il y a une limite à la taille des textures et je ne pouvais pas correspondre à tous les tuiles d'une tuile dans une texture. .

Actuellement, le programme contient toutes les textures de volonté de la mémoire en tant qu'objets bitmap. Existe-t-il un moyen de simplement dessiner un objet bitmap à l'écran de Xna? J'ai cherché mais je ne trouve aucune information à ce sujet. Cette approche éviterait de devoir avoir à créer des textures tout à fait, toutefois toute teinture ou effets que je voudrais faire sur le bitmap directement.


0 commentaires

7 Réponses :


0
votes

Assumer tous les tuiles qu'une carte nécessite des images existantes qui placent simplement sur un écran pour établir une carte de tuile? Ou faites-vous des images dans cet éditeur de carte et souhaitez-vous les sauvegarder?

J'ai lu ceci et votre autre poste sur les textures - s'ils sont toutes des images définies prêtes que vous souhaitez utiliser dans votre jeu ne pouvaient pas simplement les inclure dans le dossier de contenu et les références là-bas? Cela permet à XNA de compiler les textures du format XNB et vous ne devriez pas avoir les problèmes que vous expliquez.

Toutefois, si nous parlons complètement dynamique - ou vous créez une grosse image de la disposition des tuiles (au lieu de faire quelque chose comme une carte de tuile), je ne suis pas sûr de vous approcher de la question.


2 commentaires

Bonjour, merci pour votre réponse. Le problème avec l'ajout de simplement les fichiers image au dossier de contenu est qu'ils sont des images au format personnalisé - mon éditeur de carte est pour un jeu existant qui utilise ces images. J'espérais pouvoir coder l'éditeur à l'aide de C # et XNA, mais il semble probable que je devais recommencer et utiliser C ++ et DirectX pour y accomplir, car je sais que les textures de bitmaps sont très rapides dans DirectX. La principale raison que j'ai utilisée C # était parce que je voulais toute la facilité de conception de l'interface utilisateur, cependant, si je ne peux pas utiliser c #, je vais chercher à utiliser quelque chose comme Qt.


C'était la raison pour laquelle j'ai hésité au début, j'ai pensé qu'il y avait eu une raison pour laquelle vous ne pouviez pas simplement les utiliser dans le répertoire de contenu de votre jeu et votre éditeur - désolé je n'ai pas de meilleure réponse pour ya!



0
votes

Si plusieurs tuiles utilisent la même texture, il suffira de le charger une seule fois.

Si l'utilisateur inclut des textures de certains formats de fichier, vous pouvez le convertir automatiquement en un format de texture / image qui est plus rapide pour vos besoins.


1 commentaires

Merci pour votre réponse. Malheureusement, je ne charge que chaque texture requise une fois. J'ai découvert que l'ajout simplement texture2d tx = nouveau texture2D (périphérique, largeur, hauteur); à mon code pour chaque texture requis augmente le temps de chargement pour une carte de 2,7 secondes à 74 secondes! Notez que les 2,7 secondes incluent la création de bitmaps tenant les textures nécessaires. Texture2D semble juste être trop lent pour créer des textures à la volée.



1
votes

Puisque vous devez utiliser un format d'image personnalisé, si vous voulez (à la vitesse), vous pouvez tenter d'écrire des importateurs de pipeline de contenu personnalisés et des processeurs pour XNA ( http://msdn.microsoft.com/en-us/library/bb447754.aspx ), mais cela peut être surchargé pour ce dont vous avez besoin faire.

Je vois que vous voulez concevoir l'interface graphique aussi facilement que possible, même si ces problèmes vous obligent à utiliser une langue comme C ++ afin que vous puissiez utiliser DirectX. Dans Visual C ++, vous devriez toujours pouvoir profiter de visuel Layout Formulaires Windows Si vous utilisez Visual Studio.


0 commentaires

0
votes

Malheureusement, autant que je sache, il n'ya aucun moyen de dessiner directement un bitmap à l'écran de XNA; Il faut que tout soit mappé sur les objets de texture, qui sont par défaut tamponnés à la carte graphique. On dirait que vous parlez de beaucoup de carreaux, cependant, s'ils ne correspondaient pas à la texture maximale autorisée (je ne me souviens pas si c'était 1024 ou 4096 carrés ...) - Avez-vous essayé d'avoir un Texture non coupée à des fins de vitesse? Une autre alternative serait de charger vos carnets de paresseux dans des textures afin que l'utilisateur ne soit pas obligé d'attendre que tous soient chargés - pour un éditeur, l'utilisation d'une couleur de repli rose vif est généralement acceptable pendant la charge.

Aussi, y a-t-il quelque chose de manière intrinsèquement nécessaire pour écrire votre outil à XNA? Comme on dirait que vous écrivez l'outil séparément du moteur de jeu lui-même, vous pouvez trouver des solutions très acceptables dans WPF, y compris le dessin directement à partir de bitmapsources et des utilitaires de votre UI.


1 commentaires

Merci pour la réponse, rien qui me demande d'utiliser Xna, non. À l'heure actuelle, je suis retourné à travailler sur une version C ++ et DirectX de l'outil. Mon problème était que les textures de Xna semblent être incroyablement lentes. Ce qui prend plus de 100 secondes à l'aide de XNA Texture2DS prend 0,3 seconde à l'aide de textures DirectX. Merci pour la directive - principalement ce que je voulais savoir, c'est qu'il n'ya aucun moyen de dessiner directement un bitmap à l'écran.



0
votes

essayez-vous de les attirer tous en utilisant un seul fil d'exécution?

Essayez de multi-threading votre jeu. Le filetage en C # est assez facile et est supporté par XNA.

Au lieu de regarder votre écran dans son ensemble, essayez de le diviser en deux (ou plus) portions. Vous devrez peut-être ré-écrire la fonction que vous utilisez pour dessiner (j'espère bien que vous ne viendrez pas tout de même sur votre mode de tirage () !!) Pour prendre des coordonnées définissant les limites de vos régions de tirage.


1 commentaires

Mon programme est déjà multi-fileté. Un thread s'occupe de la manipulation de messages de fenêtre tandis qu'un fil d'enfant tente de charger les tuiles et de créer des textures d'eux. Au moment de la rédaction de cette question, je n'avais pas encore ajouté de méthode de dessin, car je devais d'abord avoir une méthode de chargement des textures dans un délai raisonnable.



2
votes

Y a-t-il une raison pour laquelle vous n'avez pas considéré comme chargé de chargement de l'image une fois, puis en passant des coordonnées de x et y sur les coordonnées de x et y sur le shader pixel?

Vous définissez essentiellement le C # up comme ceci: p>

float4x4 World; 
float4x4 View; 
float4x4 Projection;

float xOffset;
float yOffset;

sampler TextureSampler; 

struct VS_INPUT { 
    float4 Position : POSITION0; 
    float4 Color    : COLOR0;
};

VS_INPUT Transform(VS_INPUT Input) { 
    VS_INPUT Output; 

    float4 worldPosition = mul(Input.Position, World); 
    float4 viewPosition = mul(worldPosition, View); 
    Output.Position = mul(viewPosition, Projection); 
    Output.Color = Input.Color;

    return Output; 
} 

float4 ColorTexture(VS_INPUT Input) : COLOR0{ 
    return Input.Color.rgba * tex2D(TextureSampler, float2(xOffset, yOffset));
} 

technique TransformColorTexture { 
    pass P0 { 
        VertexShader = compile vs_2_0 Transform(); 
        PixelShader = compile ps_2_0 ColorTexture(); 
    } 
}


0 commentaires

2
votes

Utiliser une texture par tuile n'est pas très efficace. Surtout car cela signifie que vous ne pouvez pas faire du lotting (dans un sens réel).

Si vous devez les avoir comme des textures séparées dans votre projet de contenu pour une raison quelconque (plus facile à éditer une tuile, etc.), vous pouvez facilement compiler facilement eux dans des tilleuls après le chargement. Comment vous faites cela est fondamentalement: p>

1: chargez un certain nombre de carreaux (disons 40 32 * 32 carreaux pour l'instant) P>

2: Couvrez une belle taille de texture pour le Tilemap: La racine carrée de 40 est de 6.Quelque chose, donc nous nous arrondirons jusqu'à 7,7 * 32 est 224, ce qui est agréable, mais 256 est plus agréable, permet de faire la texture 256x256. (Vous pouvez faire du code qui figure ceci à la volée) P>

3: Créer un rendeurAtGet2D qui est la taille souhaitée. p>

4: Activer Rendertarget. P>

5: Render des carreaux sur Rendertarget: P>

int x, y = 0;
foreach (var tile in allTiles)
{
    RenderTile(tile, x*32, y*32);
    x++;

    if (x >= 8)
    {
        x = 0;
        y++;
    }
}


0 commentaires