1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

brauche Tipps und Tricks zum NSView

Dieses Thema im Forum "OS X-Developer" wurde erstellt von karolherbst, 07.12.08.

  1. karolherbst

    karolherbst Danziger Kant

    Dabei seit:
    11.05.07
    Beiträge:
    3.878
    Code:
    -(void)drawRect:(id)sender{
    	int Farbtiefe;
    	Farbtiefe=100;
    	float reC,imC,reZ,imZ,reZ_minus1,imZ_minus1,zelle,i;
    	float reZo,imZo; // Julia-Menge
    	zelle=0.0027; // Apfelmännchen=0.00425, Julia-Menge=0.0027
    	reC=-0.8; // Julia-Menge
    	imC=0.2; // Apfelmännchen=-2.10375, Julia-Menge=0.2
    	imZo=-1.3365; // Julia-Menge -1.3365
    	for(int y=0; y<=980;y++){ //980
    		reZo=-1.971; // Apfelmänchen reC=-3.1025; Julia-Menge reZo=-1.971;
    		for(int x=0; x<=1560;x++){ //1560
    			reZ_minus1=reZo; // Julia-Menge
    			imZ_minus1=imZo; // Julia-Menge
    			//reZ_minus1=0; // Apfelmännchen
    			//imZ_minus1=0; // Apfelmännchen
    			for(i=0;i<=Farbtiefe;i++){
    				imZ=2*reZ_minus1*imZ_minus1+imC;
    				reZ=reZ_minus1*reZ_minus1-imZ_minus1*imZ_minus1+reC;
    				if(reZ*reZ+imZ*imZ>4){
    					break;
    				}
    				reZ_minus1=reZ;
    				imZ_minus1=imZ;
    			}
    			NSBezierPath * path=[NSBezierPath bezierPath];
    			NSPoint startPoint={x,y};
    			NSPoint endPoint={x+1,y};
    			[path moveToPoint: startPoint];
    			[path lineToPoint: endPoint];
    			[[NSColor colorWithDeviceRed:i/Farbtiefe green:i/Farbtiefe blue:i/Farbtiefe alpha:1.0] set];
    			[path stroke];
    			reZo=reZo+zelle; // Apfelmännchen reC=reC+zelle; Julia-Menge reZo=reZo+zelle;
    		}
    		imZo=imZo+zelle; // Apfelmännchen imC=imC+zelle; Julia-Menge imZo=imZo+zelle;
    	}
    }
    erste Frage:
    wie kann cih anstatt Linien zu zeichnen direkt irgendwelche Punkte einfärben?
    zweite Fabre: wie soll ich die NSView-Methoden im gesamten Programm anordnen, damit mein RAM nicht permanent überladen wird?
    dritte Frage:
    was muss ich machen, damit diese Methode nciht immer ausgeführt wird, wenn das Programm gestartet wird, ich das FEnster bewege oder nur einmal auf den Imhalt klicke?

    Danke
     
  2. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    In NSView nicht. NSView kennt keine Pixel. Wenn Du mit Pixeln arbeiten willst, dann schau Dir die Klasse NSBitmapImageRep an.

    Die Frage verstehe ich nicht. NSView-Methoden gehören zu Klasse NSView. Du oder das System schickt Nachrichten an NSView-Instanzen, die dann das Ausführen der entsprechenden Methoden bewirken. Wieviel RAM Dein Programm braucht, hängt davon ab, wie viele und was für welche Objekte Du erzeugst.

    drawRect: wird immer dann aufgerufen, wenn das System festgestellt hat, dass der View neu gezeichnet werden muss. Du kannst auch dem System mitteilen, dass ein View neu gezeichnet werden muss.

    Du solltest Dich aber erst einmal mit den Konzepten von Cocoa vertraut machen. Ich glaube, Du gehst einfach davon aus, dass Cocoa genauso funktioniert, wie Delphi. Dem ist nicht so! Wenn Du Cocoa genauso programmieren willst, wie Delphi, wird da nie was Vernünftiges heraus kommen, weil die Konzepte einfach unterschiedlich sind.

    MacApple
     
  3. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    1)
    Die Kooridnatenadressierung kennt keine Punkte, oder besser gesagt: kennt nur Punkte, aber keine Pixel. Daher sind die entsprechenden Koordinaten auch in float gehalten. Du kannst ja auch keine Ausdehnung des Punktes [3,567|23,127] in einem kartesischem Koordinatensystem angeben. Sie beträgt 0.

    Du musst also entweder Rechtecke zeichnen oder Images/Bit-Maps nehmen. Ich würde zum ersteren tendieren.

    2)
    Was willst du anordnen? Und was heißt anordnen?

    3) Du kannst gegebenenfalls selbst das gerenderte Bild cachen. Allerdings trifft das System ziemlich gut. Hast du es mal probiert?

    Ansonsten schließe ich mich meinem Vorredner an.
     
  4. karolherbst

    karolherbst Danziger Kant

    Dabei seit:
    11.05.07
    Beiträge:
    3.878
    Also das Problem ist, dass das Programm 460MB RAM verschlingt, liegt an der Anzahl von "path" die erstellt werden, man könnte sich das so vorstellen, als würde man in Pages ein x-beliebiges Bild mit Linien darstellen, wobei jeder Pixel eine eigene Strecke bekommt. Und ja, ich habe kaum Cocoa Kenntnisse, aber ich lerne viel lieber mit learning by doing, habe das schon mit XHTML, JS, PHP und SQL geschafft. Habe aber grade eine Pascal Integrierung für XCode gefunden, funktioniert sogar alles bei mir :D dort ist das gesamte Fenster ein Koordinatensystem, werde es mal so ausprobieren und dann den Umstieg auf Cocoa langsamer angehen lassen als geplant.

    Aber trotzdem Danke.
     
  5. ifthenelse

    ifthenelse Fießers Erstling

    Dabei seit:
    07.12.06
    Beiträge:
    129
    Versuch' doch mal, den Bezierpath mit alloc/init zu generieren und nach dem Zeichnen per Release wieder direkt freizugeben. Genauso die Farbe. So wie Du das jetzt machst, wird der Speicher, den Du mit 1,5 Mio Pathes und genauso vielen NSColor-Objekten belegst, erst (irgendwann) nach dem Zeichnen wieder freigegeben. D.h., wenn der Autoreleasepool meint, es wäre jetzt mal ganz praktisch sich zu entleeren...

    Ansonsten schliesse ich mich Amin an: Quadrate gefüllt zeichnen, und die ohne Rand.

    Gruss, Jörg
     
  6. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Learning by doing ist ja okay. Es sollte bloß die Bewusstmachung der Konzepte einschließen. Sonst kommste nicht viel weiter.

    Hierauf bezogen:

    1) Für die Benennung der Methode würde ich dich ja standrechtlich erschießen. Aber gut, du wirst irgendwann damit reinfallen und es einsehen.

    2) Du berechnest einen Path voraus , speicherst es sinnlos als Bezier-Pfad (Konzept-Verstoß: MVC) um es dann vllt zu benötigen.

    3) Du berechnest mit $irgendeiner Genauigkeit, die hoffentlich passt (Konzept-Verstoß: Lazyness)

    Also, um das mal auf den Punkt zu bringen:

    - Die Daten würde ich in einem Container speichern. Dieser muss in der Lage sein, verschiedene Genauigkeiten zu verwalten und zwar unterschiedlich.

    - Änderungen des Containers würde ich möglichst exakt triggern.

    - Die Berechnungen würde ich lazy machen, halt dann, wenn der View die Genauigkeit benötigt.

    - Wie bereits gesagt, kann man darüber nachdenken, das gerenderte Bild zu cachen, auch für etwiges Zooming.

    Schau dir halt mal an, wie ansonsten mit komplexen Bildern umgegangen wird. Die werden ja auch zuerst ungenau gezeichnet und dann verfeinert. Aber das alles verlangt schon Kenntnisse von Konzepten.
     
  7. karolherbst

    karolherbst Danziger Kant

    Dabei seit:
    11.05.07
    Beiträge:
    3.878
    ähhhm ich habe eine Auflösung von 1680*1050 und lasse das Bild in der Größe auch erzeugen, also ich lasse auch diese 1,5Mio "Pixel" erzeugen. Aber ja die Genauigkeit ist etwas hoch, das stimmt schon, will das dann später per NSTextField oder ner anderen Art vor dem berechnen bestimmen lassen. Weiter wird auch jeder Path verwendet, was ich aber machen könnte ist, die Farbe nicht einfärben lassen, wenn die Iterartion bei 0 schon erreicht ist. heißt, je höher, desto dunkler wird das entstandene Bild oder den ganzen NSView am Anfang komplett schwarz einfärben lassen.
     
  8. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Ich finde es schon erstaunlich, dass das Programm auf deinen Rechner mit deiner Fenstergröße angepasst ist. Aber letztlich ist das unerheblich, da man nicht direkt diese Genauigkeit berechnen muss. Wie gesagt:Schaue dir mal andere Programme an …
     
  9. karolherbst

    karolherbst Danziger Kant

    Dabei seit:
    11.05.07
    Beiträge:
    3.878
    mhh, also sobald ich damit Bildschrimhintergründe oder sonstiges erstellen will, dann brauche ich diese Genuigkeit schon. Aber ich glaube ich werde das gesamte Programm umschreiben, damit eine Bitmap erstellt wird, ist wahrscheinlich Ram freundlicher.
     

Diese Seite empfehlen