JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

tile maps
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 28.09.2006, 23:37    Titel: Antworten mit Zitat

Ähhm DrawCalls sind Zeitintensiv (!), hier mal eine Tabelle davon mit der Anzahl der Zyklen welche ein Prozesser/GPU für jeden Call braucht.

Als Leitregel gilt je weniger Calls desto besser, das gilt halt besonders für den DX Kram.

Zitat:
SetVertexDeclaration 6500 - 11250
SetFVF 6400 - 11200
SetVertexShader 3000 - 12100
SetPixelShader 6300 - 7000
SPECULARENABLE 1900 - 11200
SetRenderTarget 6000 - 6250
SetPixelShaderConstant (1 Constant) 1500 - 9000
NORMALIZENORMALS 2200 - 8100
LightEnable 1300 - 9000
SetStreamSource 3700 - 5800
LIGHTING 1700 - 7500
DIFFUSEMATERIALSOURCE 900 - 8300
AMBIENTMATERIALSOURCE 900 - 8200
COLORVERTEX 800 - 7800
SetLight 2200 - 5100
SetTransform 3200 - 3750
SetIndices 900 - 5600
AMBIENT 1150 - 4800
SetTexture 2500 - 3100
SPECULARMATERIALSOURCE 900 - 4600
EMISSIVEMATERIALSOURCE 900 - 4500
SetMaterial 1000 - 3700
ZENABLE 700 - 3900
WRAP0 1600 - 2700
MINFILTER 1700 - 2500
MAGFILTER 1700 - 2400
SetVertexShaderConstant (1 Constant) 1000 - 2700
COLOROP 1500 - 2100
COLORARG2 1300 - 2000
COLORARG1 1300 - 1980
CULLMODE 500 - 2570
CLIPPING 500 - 2550
DrawIndexedPrimitive 1200 - 1400
ADDRESSV 1090 - 1500
ADDRESSU 1070 - 1500
DrawPrimitive 1050 - 1150
SRGBTEXTURE 150 - 1500
STENCILMASK 570 - 700
STENCILZFAIL 500 - 800
STENCILREF 550 - 700
ALPHABLENDENABLE 550 - 700
STENCILFUNC 560 - 680
STENCILWRITEMASK 520 - 700
STENCILFAIL 500 - 750
ZFUNC 510 - 700
ZWRITEENABLE 520 - 680
STENCILENABLE 540 - 650
STENCILPASS 560 - 630
SRCBLEND 500 - 685
TWOSIDEDSTENCILMODE 450 - 590
ALPHATESTENABLE 470 - 525
ALPHAREF 460 - 530
ALPHAFUNC 450 - 540
DESTBLEND 475 - 510
COLORWRITEENABLE 465 - 515
CCW_STENCILFAIL 340 - 560
CCW_STENCILPASS 340 - 545
CCW_STENCILZFAIL 330 - 495
SCISSORTESTENABLE 375 - 440
CCW_STENCILFUNC 250 - 480
SetScissorRect 150 - 340



In der DirectX Dokumentation gibt es ein Thema dazu, wenn du mehr über diese Zeiten wissen möchtest:

Accurately Profiling Direct3D API Calls


mfg Mark
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Maxim
Senior JLI'ler



Anmeldedatum: 28.03.2004
Beiträge: 249

Medaillen: Keine

BeitragVerfasst am: 29.09.2006, 10:48    Titel: Antworten mit Zitat

DrawCalls sind Zeitintensiv. Das ist eine Tatsache, die bei einem Hobby-Projekt (vor allem bei kleineren) total vernachlässigt werden kann. Wenn man zu wenig Frames/sec hat, dann hat man was falsch gemacht und es muss nicht an DrawCalls liegen Wink

@Andy-Mad: mach dir keine Gedanken darüber. Optimieren kannst du später immer noch.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Andy-Mad
Mini JLI'ler


Alter: 43
Anmeldedatum: 18.09.2006
Beiträge: 34

Medaillen: Keine

BeitragVerfasst am: 29.09.2006, 14:03    Titel: Antworten mit Zitat

Ok ich werde erstmal versuchen die Grundfunktionen zu meinem kleinen Jump and Run hinzubekommen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Andy-Mad
Mini JLI'ler


Alter: 43
Anmeldedatum: 18.09.2006
Beiträge: 34

Medaillen: Keine

BeitragVerfasst am: 29.09.2006, 15:32    Titel: Antworten mit Zitat

Ich poste jetzt mal den Quelltext der Main Datei vieleicht kannst du mir dort sagen wie ich verhindern kann dass mein Sprite nicht durch das Tile blue durchlaufen oder durchfallen kann
die Map hat keine bedeutung ist nur zum testen

CPP:
// Headerdateien
#include "Direct3D.h"
#include "Sprite.h"
#include "tile.h"

// Anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);

// Callback Funktion zur Nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

// Das Fensterhandle
HWND hWnd = 0;

// Instanz der Klasse CDirect3D
CDirect3D Direct3D;

// Instanz der Klasse CSprite

CTile black , blue;
CSprite Sprite;

const unsigned int map_breite = 5;
const unsigned int map_hoehe = 25;

int tilemap[map_hoehe][map_breite] =  { 0, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              1, 1, 1, 2, 2,
                              1, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2 ,
                              2, 2, 2, 2, 2,
                              2, 2, 2, 2, 2,
                              2, 2, 1, 2, 2,
                              1, 1, 1, 1, 2,

};
// Windows main-Funktion
int WINAPI WinMain(HINSTANCE hInstance,     
                   HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine,         
                   int nCmdShow)             
{
    // Fenster erzeugen und Handle speichern
    hWnd = CreateMainWindow(hInstance);

    // Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
    if(0 == hWnd)
    {
        MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
        return -1;
    }

    // Direct3D initialisieren
    if(!Direct3D.Init(hWnd,FALSE))
    {
        return -1;
    }

    // Maus-Cursor verstecken
    ShowCursor(FALSE);

    // Farbe die beim Löschen verwendet werden soll
    Direct3D.SetClearColor(D3DCOLOR_XRGB(0,0,0));
   char Filename[128];
    // Sprite anlegen
   blue.Create(Direct3D.GetDevice(), "tile/blue.bmp");
   black.Create(Direct3D.GetDevice(), "tile/black.bmp");
   

Sprite.Create(Direct3D.GetDevice(),1);// "player/mario1.bmp");

    // Grafiken (Texturen) laden
   
   for(int i=0;i<2;i++)
    {
      sprintf_s(Filename,"player/mario%d.png",i+1);
        Sprite.AddTexture(Filename);
   }
   Sprite.col=blue.m_vPosition.x;

   
    // Struktur, in der Informationen zur Nachricht gespeichert werden
    MSG msg = { 0 };
   DWORD dwTime1, dwTime2;
   float fTime = 0.0f;   

    while(msg.message != WM_QUIT)
    {
      dwTime1 = timeGetTime();

        if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
            TranslateMessage(&msg);

            DispatchMessage(&msg);
        }
        else
        {   
         
         // Tasten abfragen und Sprite entsprechend bewegen
            if(GetAsyncKeyState(VK_LEFT) & 0x8000)
            {   
         
                Sprite.Move(LEFT,fTime);
            
            }
            else if(GetAsyncKeyState(VK_RIGHT) & 0x8000)
            {
                Sprite.Move(RIGHT,fTime);
            //Sprite.Animate(fTime);
            }
            if(GetAsyncKeyState(VK_UP) & 0x8000)
            {
              //Sprite.Kraft=50.3f;
           Sprite.Move(UP,fTime);

          
            }
            else if(GetAsyncKeyState(VK_DOWN) & 0x8000)
            {
                Sprite.Move(DOWN,fTime);
            }
     
   
         Direct3D.BeginScene();   

   // map zeichnen  (tiles sind 53x38 pixel groß)
         forint i = 0; i < map_hoehe; i++)
         {
            for( int j = 0; j < map_breite; j++)
            {
                  switch( tilemap[i][j] )
                  {
                     case 1:   
                        blue.SetPosition(j*32, i*32);
                     
                        blue.Draw();
                        break;
                     case 2:   
                        black.SetPosition(j*32, i*32);
                        black.Draw();
                        
                        break;
                     
                     default:
                        break;
                  }
            }
         }
      
         Sprite.Draw();
         Sprite.jump(fTime);

               Direct3D.EndScene();
         dwTime2 = timeGetTime();
         fTime = (float)(dwTime2 - dwTime1) / 100.0f;
        }
    }
   
    // Rückgabewert an Windows
    return 0;
}



// Fenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance)
{
    WNDCLASSEX wndClass =
    {
        sizeof(WNDCLASSEX),                                 // Größe angeben
        CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,    // Standardstile       
        MessageHandler,                                     // Callback-Funktion
        0,                                                  // Zusätzliche Angaben
        0,                                                  // nicht benötigt
        hInstance,                                          // Anwendungsinstanz
        LoadIcon(NULL, IDI_WINLOGO),                        // Windows-Logo
        LoadCursor(NULL, IDC_ARROW),                        // Normaler Cursor
        (HBRUSH)GetStockObject(WHITE_BRUSH),                // Weißer Pinsel
        NULL,                                               // kein Menü
        "WindowClass",                                      // Der Name der Klasse
        LoadIcon(NULL, IDI_WINLOGO)                         // Windows Logo
    };

    // Klasse registrieren
    RegisterClassEx(&wndClass);

    return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                          "WindowClass",          // Klassenname
                          "SpriteAnim",           // Fenstertitel
                          WS_OVERLAPPEDWINDOW |   // Fenster
                          WS_VISIBLE,             // Eigenschaften
                          0, 0,                   // Anfangsposition
                          SCR_WIDTH, SCR_HEIGHT,  // und Größe des Fensters
                          NULL,                   // Handle des Elternfensters
                          NULL,                   // Handle des Menüs
                          hInstance,              // Anwendungsinstanz
                          NULL);                  // wird nicht benötigt
}


// Diese Funktion wird von Windows aufgrufen, wenn
// eine Nachricht für Ihr Programm vorliegt
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    // testen, um welche Nachricht es sich handelt
    switch(msg)
    {
     // Programm beenden, wenn das Fenster
     // geschlossen wird
    case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
         break;

    case WM_KEYDOWN:
           switch(wParam)
           {
             // Bei F1 einen Screenshot speichern
             case VK_F1:   
                    Direct3D.CreateScreenshot("c:\\screenshot.bmp");
                 break;
     
             // Wenn ESC gedrückt, Programm beenden
             case VK_ESCAPE:
                     DestroyWindow(hWnd);
                  break;                     
           }
         break;
    }
    // Standardnachrichtenverarbeitung von Windows
    return DefWindowProc(hwnd, msg, wParam, lParam);
}[/


also mein Sprite darf nicht durch die 1 in der Map durchlaufen sondern nur duch die 2
ich weis sind doofe Fragen ich weis nur nicht wie ich es am besten beschreiben soll


Zuletzt bearbeitet von Andy-Mad am 30.09.2006, 13:48, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 30.09.2006, 12:05    Titel: Antworten mit Zitat

Andy-Mad hat Folgendes geschrieben:
also mein Sprite darf nicht durch die 1 in der Map durchlaufen sondern nur duch die 2
ich weis sind doofe Fragen ich weis nur nicht wie ich es am besten beschreiben soll


Wenn ich dir vorab schon mal empfehlen kann, dass du nicht alles in deine WinMain packst, sondern das in verschiedenen Funktionen aufdröselst, ist das sicher schon um vieles übersichtlicher und auch einfacher zu verstehen/einzubauen Wink
Was die Posts hier im Forum betrifft, so gibt es auch die CPP-Tags (statt [code ] einfach [cpp ] verwenden, ohne die Leerzeichen natürlich), durch das Syntaxhighlighting wirds noch mal einfacher zu lesen.

Also, du hast sicher in irgendeiner Variable die Position deines (Spieler-?)Sprites gespeichert. Wenn du die durch die Größe deiner Tiles teilst, bekommst du schon mal heraus, welche Indizies du bei deinem tilemap-2D-Array ungefähr bei der Überprüfung verwenden musst. (Ich sage "ungefähr", weil das Sprite ja auch zwischen zwei Tiles stehen kann und deshalb eigentlich immer mehrere Tiles auf Kollision überprüft werden müssen). Jedenfalls gehst du jetzt das Umfeld deines Sprites in dem tilemap-Array durch und überprüfst erst mal, welche Tiles massives Material darstellen und welche durchgeh- und durchfallbar sind. (Das sollte wohl nicht schwer fallen Wink )
Jetzt musst du eben je nach gedrückter Taste und aktueller Position des Sprites differenzieren: Wird z.B. die rechte Cursortaste gedrückt, überprüfst du, ob eine Kollision stattfinden würde, wenn du das Sprite bewegen würdest. Wenn dies der Fall ist, brachst du Sprite.Move(RIGHT,fTime); erst gar nicht aufzurufen. So verfährst du für jede Bewegungsrichtung. Ich hoffe, das reicht erst mal als Denkanstoß Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Andy-Mad
Mini JLI'ler


Alter: 43
Anmeldedatum: 18.09.2006
Beiträge: 34

Medaillen: Keine

BeitragVerfasst am: 30.09.2006, 13:49    Titel: Antworten mit Zitat

Ok habs geändert mit dem Code
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum