Schnellste Methode eine Rechteck zu zeichnen?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag von Thalius »

Ich finds trotzdem ziemlich seltsam, warum das einen starken Geschwindigkeitsverlust verursacht. Meiner Meinung nach geschlampte Programmierung, wenn eine 1 Millisekunde den ganzen Rest vom Programm um ein vielfaches der geraubten Zeit verlangsamt.
Gugg mal in der Aufrufverfolgung wo und welche Funktionen wie oft pro durchlauf bei dir aufgerufen werden udn wieviel Zyklen die brauchen.
Super tool dafür ist der Analyzer von Remi Meier -> siehe Showcase ;)

dann kommst du dahinter ... und kannst evtl. noch etwas optimieren ;)

Thalius
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Beitrag von Kekskiller »

Hm... wüsste nicht, inwiefern ich das nutzen könnte, da ich ohnehin alles selbst code. Bin im Moment bei der schnellsten aller mir möglichen Varianten, wenn ich meine Shader weiterhin unterstützen will, also alles paletti.

@Thalius: Ist schon ok, bisher ist die Performance OK, es könnte mehr sein, aber bei ner hi-level-lang is da wohl nicht mehr drinn. Verflucht seien Grafikkarten, die geben mir fette Performance-Gewissensbisse /:-> .

Im Moment sieht mein Code so aus: (wundert euch nicht wegen den ShaderProtos und den Prototyp-Aufrufen, das könnt ihr getrost ignorieren...

Code: Alles auswählen

Procedure HIRES_ShadedRect(x1.l, y1.l, x2.l, y2.l, c.l, *is.InitShaderProto)
  
  Protected *db.rgba, *dbend.rgba
  Protected *db2end.rgba, *db2.rgba
  Protected w.l, h.l
  Protected pitchw.l
  
  Protected shstruc.ShaderStruc
  
  ; shaderstruktur füllen
  shstruc\c = @c
  shstruc\x = @x1
  shstruc\y = @y1
  
  ; shader- prototyp
  Protected *s.ShaderProto
  
  ; shader-funktion holen
  *s = *is(@shstruc)
  
  ; rechteck -anfang und -ende ggf. tauschen
  If x1 > x2
    Swap x2, x1
  EndIf
  ; w ausrechnen
  w = x2 - x1
  
  If y1 > y2
    Swap y2, y1
  EndIf
  ; h ausrechnen
  h = y2 - y1
  
  ; start- und end- speicheradressen ausrechnen
  *db = *dbuffer + y1 * dbpitch + x1 * dbbytes
  *dbend = *db + h * dbpitch
  
  pitchw = w * dbbytes
  
  ; bildschirmzeilen durchlaufen
  While *db <= *dbend
    
    ; aktuelle spalte wieder auf den spaltenanfang zurücksetzen
    *db2 = *db
    *db2end = *db2 + pitchw
    
    While *db2 <= *db2end
      
      ; shader aufrufen, schreibt den neuen farbwert
      *s(*db2, shstruc)
      
      x1 + 1
      *db2 + dbbytes
    Wend
    
    y1 + 1
    *db + dbpitch
  Wend
  
EndProcedure
Es ist 0 Geschwindigkeitsunterschied zu der anderen Variante, aber zumindest kann ich mir so ein paar Variablen sparen (glaube das war so).
Antworten