amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > C oder C++? [ - Suche - Neue Beiträge - Registrieren - Login - ]

1 -2- 3 4 5 [ - Beitrag schreiben - ]

04.05.2010, 15:49 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Eine GUI Applikation unter Windows kann auch ausgaben mittels printf machen. Man sieht sie nur nicht, weil keine Console aufgeht.
Aber man kann sie in eine File pipen.
Also als No-Go würde ich das nicht bezeichnen.

Das hängt von der Frage nach dem Warum ab. Wenn ich eine Library-Funktion für Berechnungen aufrufe, gehe ich nicht davon aus, diese Output erzeugt.
Wenn es etwas zu sagen gibt, sollte die Bibliothek das auf einen sauberen Weg dem Aufrufer mitteilen.

Es wäre schon inakzeptabel, wenn wichtige Meldungen verloren gehen, weil die Konsole unsichtbar ist, schlimmer wäre es wenn stdout eine Dateiumleitung ist, weil ich ein Resultat an ein anderes Programm weiterreiche. Da haben irgendwelche printf's nichts zu suchen.

Wenn die Bibliothek einen eigenen Logging-Mechanismus benötigt, der nichts mit dem I/O-Kontext des Aufrufers zu tun hat, wäre das ok und auch auf dem Amiga machbar. Das würde aber auch auf anderen Systemen nicht mit stdio funktionieren (und wird deshalb auch nicht mit stdio gemacht).
Zitat:
Wenn ich das richtig sehe ist der große Unterschied, dass DLLs jedesmal beim öffnen ihren eigenen Kontext erzeugen, während Amiga Shared Libraries nur einmal gestartet werden, und dann von mehreren Prozessen verwendet werden können. Das bringt natürlich einige Probleme mit sich, z.B. man kann bei printf nicht sofort sagen, was der richtige File Handle für den Output wäre.
Oder in welche Speicheradresse der Fehlercode geschrieben werden soll. Und vor allem benutzen die typischen Implementierungen, wie bereits gesagt, Puffer, die nicht thread-safe sind.

Trotzdem bereiten auch auf anderen Systemen Bibliotheken, die unerwartete I/O-Operationen durchführen, Probleme. Davon sollte man die Finger lassen.

Das gilt im Übrigen auch für die AmigaDOS-Funktionen. Wenn der Aufrufer beispielsweise asynchrone I/O benutzt, kann die Verwendung von AmigaDOS-Routinen in der Bibliothek zum Absturz führen.
Zitat:
Wenn man die vor und Nachteile abwiegt, ist die Amiga Shared Library etwas leichtgewichtiger als die DLL, aber viel schwerer vom Entwickler korrekt zu implementieren. Und eine Library, die 2ms länger braucht zum starten ist besser als keine Library. Dafür würde man sich heute wohl kaum mehr entscheiden.
So einfach ist das nicht.
Unter Linux geht man z.B. immer davon aus, dass das gesamte System von ein und demselben Compiler in exakt derselben Version mit denselben wesentlichen Optionen übersetzt wurde. Je mehr man davon abweicht, desto mehr Probleme kann man erwarten.

Bei den neueren Amiga-Betriebssystemen kann man ähnliches machen, weil es auch dort im Prinzip außer gcc nichts anderes mehr gibt, höchstens noch vbcc.

Aber beim "Classic" AmigaOS war das nie eine Option.
Zitat:
Zu Amiblitz:

...

Consolen Output ist möglich, wenn man sich den File Handle der Console bei jedem Aufruf vom aufrufenden Thread besorgt. Global darf man den natürlich nicht speichern.

Berücksichtigt das auch den Fall, dass es keine Console gibt, bzw. dass der Aufrufer nicht einmal ein Prozess ist?

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

04.05.2010, 23:05 Uhr

jolo
Posts: 110
Nutzer
@alle und niemanden:

Bevor ich unten auf die getroffenen Aussagen eingehend antworte, schreibe ich vorab etwas Allgemeingültiges.
Ich muss allerdings vorausschicken, dass ich nicht unter Windows 3.x programmiert habe, so dass ich dafür erst einmal entsprechende Literatur im Internet gelesen habe.

1) Unter Windows 3.x wurden üblicherweise nicht die Referenznamen verwendet, sondern die Referenztabellen (import address table (IAT)), was dazu führen konnte, dass bei Änderungen (Updates) der betroffenen DLLs, die IAT des ausführbaren Programmes mit der EAT (export address table) der DLL nicht mehr übereinstimmte, und somit das Starten des betroffenen Programmes einen Blue-Screen verursachen konnte.
2) Mit Windows-NT wurde zwingend die Benutzung der Referenznamen eingeführt um diese Probleme zu umgehen. Man kann aber heute noch die Referenztabellen verwenden (kann man?), diese sollten nach wie vor nominell vorhanden sein; macht nur keiner mehr, wegen der ungeliebten Blue-Screens - denke ich. ;)
3) Eine DLL ist eine stinknormale, ausführbare Datei; demnach müssen Suchvorgänge gestartet werden, um die Referenznamen zu ermitteln. Seht euch mal das Format einer Windows 32/64 Bit Anwendung an, dann versteht ihr mich.
4) Eine DLL wird immer von einem übergeordneten Prozess verwaltet; beim Amiga nur einmal, und zwar beim Laden von einem Medium in den Hauptspeicher und anschließender Initialisierung, bzw. auch noch beim Rausschmiss. Dazwischen hat kein Prozess mehr irgendeine Bedeutung, sondern alles wird von dem Anwenderprogramm erledigt, implementiert aber in der Bibliothek selber, Open(), Close(). Init() wird nur einmal ausgeführt.
5) Eine DLL klont immer ihren nicht-statischen Datenbereich, und zwar für jeden Thread/Prozess, das heißt, beim Öffnen und Schließen ist wesentlich mehr Arbeit seitens einer CPU gefragt als das bloße Hochzählen bzw. Runterzählen einer Variablen (OpenCount) auf Seiten einer Amiga Shared-Bibliothek.
6) Schaut euch mal die gängigsten Probleme mit COM-Objekten an und was Microsoft dagegen getan hat, und dann behauptet nochmal, dass DLLs nur ein einziges Mal im Speicher stehen.


Dass die classic AmigaOS Bibliotheken unter m68k so effizient sind, hat den Grund, wie wir alle wissen, dass sie ausschließlich für m68k gedacht waren. Für andere Prozessoren und andere Programmiersprachen als m68k Assembler ist dieses Format aber alles andere als passend, so weit gebe ich euch Recht. Nur, DLLs und Shared-Objects sind aber auch nicht gerade der Weisheit letzter Schluss, meiner bescheidender Meinung nach.

Effizienz aus Sicht einer CPU bedeutet Aufwand für den Programmierer; Effizienz aus Sicht eines Programmierers bedeutet Aufwand für die CPU. :)


@Holger:

Zitat:
Ähem.
So etwas passiert genau einmal nach dem Laden der Bibliothek, und ähnliches passiert auch beim Amiga, wenn nach dem Laden einer ausführbare Datei Adressen an die tatsächliche Position im Speicher angepasst werden.


Ja, aber nur Punkt "b". Punkt "a" entfällt; sind statisch in einer Amiga-Shared-Library enthalten. Es wird nur die Basisadresse dazu addiert.
Punkt "c" und "d" gibt es nicht (mit einer Einschränkung: der Ladevorgang vom Medium ins RAM).


Zitat:
Deshalb funktionieren DLLs selbst unter Windows 3.1 auf einem 386 mit 14MHz...

Jo, funktionieren tun auch Classic-Bibliotheken in Verbund mit einer 68000 mit nur 7 MHz recht gut, oder nicht? :)
Nee, Spaß beiseite, siehe Punkt 1 oben.


Zitat:
Wenn man bedenkt, dass der identische Library-Initialisierungscode, inkl. der Verwaltung des Zählers für Anzahl benutzender Programme sich in jeder Bibliothek erneut wiederfinden, statt einmal im Betriebssystem, relativiert sich diese Effizienz erheblich.

Da verwechselst Du was. Jede Bibliothek kann einen ganz anderen Initialisierungscode haben; Sprungtabellen können anhand von 32-Bit absoluten Adressen generiert werden (in C macht man das üblicherweise so), für Bibliotheken die ich in Assembler erstellt habe, benutzte ich aber 16-Bit Offsets relativ zur Funktion; zudem kann man im Initialisierungscode reinschreiben was man will, wie will da das Betriebssystem wissen, was es machen soll?
Selbst Open(), Expunge() und Close() sind immer für die betreffende Bibliothek maßgeschneidert.
Das Classic Bibliotheken nicht der Weisheit letzter Schluss sind, weiß ich auch. Nur, ich persönlich finde das Konzept schon ganz passabel. Okay, nicht für PPC und/oder andere Prozessoren, dafür ist es zu maßgeschneidert.
Zudem, wie ich oben schon einmal geschrieben habe, macht das Betriebssystem nichts mehr nachdem die Bibliothek einmal erstellt wurde; eine Bibliothek ist dann nur noch ein Haufen Code der irgendwo im Speicher schlummert und darauf wartet, dass irgendein Anwenderprogramm diesen Haufen Code ausführt. Nix mit Verwaltung seitens des OS. :)


Zitat:
Die Design-Entscheidung, keine symbolischen Namen, sondern eine Tabelle mit 68k-Sprungbefehlen relativ zum Register A6 zu benutzen, die selbst unter der bevorzugten Programmiersprache C ein Fremdkörper ist, muss man akzeptieren. Aber nicht unbedingt glorifizieren.

Ich glorifiziere rein gar nichts. Habe ich nicht gemacht und werde es auch nicht machen. :)
In Zeiten als Assembler noch richtig populär war und CPUs gerade dabei waren in den einstelligen MHz-Bereich vorzudringen, war dieses Konzept aber sehr effizient - und das von beiden Seiten betrachtet, CPU und Assembler-Programmierer. :)


Zitat:
Diese Art des Linkens ist aber auch gar nicht der Grund, warum man Amiga-Libraries nicht so wie Windows oder Unix-Libraries benutzen kann. Der springende Punkt ist hier, dass man nicht die Datensegmente einer Objektdatei automatisch pro Prozess anlegen lassen kann.

Stimmt. :)
Allerdings sollten Amiga Bibliotheken nicht nur thread-safe sein, sondern reentrant, dass heißt dann, dass keine modifizierbaren Daten den Funktionsaufruf überleben. Demnach braucht man auch keinen geklonten Datenbereich.


@Der_Wanderer:
Zitat:
Das Argument mit der Effizienz kann ich auch nicht gelten lassen.
Wie Holger gesagt hat, die Klartext Funktionen müssen nur einmal beim Programm start in Jump Offsets aufgelöst werden. Das ist selbst auf einem A500 ein vertretbarer und kaum spürbarer Aufwand.


Es geht gar nicht um die einmalige Initialsierung. Der ganze Verwaltungsaufwand, der für eine DLL betrieben werden muss, ist doch deutlich höher als beim Konzept einer Amiga-Shared Bibliothek, das fängt beim Einladen an und hört beim Rausschmeißen auf.

Ich verstehe, dass für Dich als Anwendungsprogrammierer Effizienz bedeutet, mit den geringsten Mitteln den höchstmöglichen Nutzen zu erzielen. Das ist mit einer DLL wohl gegeben. Für mich heißt Effizienz aber, dass der Speicher und die CPU geschont werden.
Wir drei (Holger, Du und ich) haben ganz unterschiedliche Gewichtungskriterien. Und daran muss man sich nicht anstoßen.
Wenn Du sagst, für Dich stellt eine DLL eine sehr gute Lösung dar, ist daran nichts auszusetzen. Ich verstehe Deinen Standpunkt. Es ist aber nicht meiner.


Zitat:
Wenn ich das richtig sehe ist der große Unterschied, dass DLLs jedesmal beim öffnen ihren eigenen Kontext erzeugen, während Amiga Shared Libraries nur einmal gestartet werden, und dann von mehreren Prozessen verwendet werden können.

Wir driften immer weiter in Richtung pro und kontra DLL, bzw. pro und kontra Classic Amiga Library ab.

Wenn Du mal Zeit hast, dann besuche die Microsoft Entwickler-Seite und lese Dir mal die Low-Level-API Funktionen durch oder programmiere unter Windows mal ohne vorgefertigte WINAPI, dann verstehst Du auch meinen Standpunkt.

Können wir dem Ganzen ein Ende setzen und sagen, dass Holger und Du nichts gegen Sprungadressenermittlung anhand von Bezeichnern habt, wogegen ich statische Offsets fest verankert im Programm favorisiere?


Frieden? ;)

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 00:12 Uhr

Der_Wanderer
Posts: 1229
Nutzer
> Frieden?

Wir streiten doch gar nicht. Ich glaube jeder hat pro und kontra nun mitbekommen.

Mir war nur nicht ganz klar, dass selbst in C es recht schwer ist eine etwas komplexere Library zu erstellen, vor allem wenn es sich um nicht-notwendigerweise-auf-den-Amiga-maßgeschneiderten Code handelt.

Ich bin in letzer Zeit beruflich mit einigen Plattformen in Berührung gekommen. Da merkt man deutlich, wenn man mal die Ideologie beiseite lässt, dass der Komfort und Qualität von IDE, SDK und der API der Schlüssel sind ob eine Plattform gute Software bekommt oder nicht.
Die Bereitschaft der Amigafans, mehr Zeit zu investieren für das Gleiche was auf anderen Plattformen viel einfacher ist kann das nicht ausgleichen.
Z.b. habe ich verzweifelt nach einer Video Codec Library gesucht, nach einer MOD player library oder einer mp3 Encoder Library. Unter Windows ist das alles in 5min erledigt, FFMPEG als DLL, MikMOD als DLL oder LAME als DLL. Gibts alles. So kann man sehr schnell tolle Multimedia Apps zusammenstellen. Angesichts diesem Überflusses bin ich sogar oft sehr enttäuscht, wie "schwach" viele Windows Soft doch ist.
Auf dem Amiga gibt es von den o.g. Dingen zwar Commando Zeilen Ports, aber keine Libraries. Um da das gleiche zu erreichen muss man quasi alles selbst machen, vom Video Encoder bis zum MOD player. Das ist 1000x so viel Code und Arbeit, und das Ergebnis sehr viel schwächer.
Zumindest ist das so, wenn man keine Statischen Linker Libs hat und oder verwenden kann.

Lohnt es sich also, ein paar Bytes und CPU Cylces zu sparen, wenn dadurch das Erstellen mächtiger Software fast unmöglich wird?

Human Brain Cycles sind heute sehr viel teurer als CPU Cycles.


--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 01:45 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Der_Wanderer:
Mir war nur nicht ganz klar, dass selbst in C es recht schwer ist eine etwas komplexere Library zu erstellen, vor allem wenn es sich um nicht-notwendigerweise-auf-den-Amiga-maßgeschneiderten Code handelt.


Naja, jetzt weißt Du es und kennst ein paar der Hintergründe auch besser.

Zitat:
Ich bin in letzer Zeit beruflich mit einigen Plattformen in Berührung gekommen. Da merkt man deutlich, wenn man mal die Ideologie beiseite lässt, dass der Komfort und Qualität von IDE, SDK und der API der Schlüssel sind ob eine Plattform gute Software bekommt oder nicht.

Das würde ich so nicht unterschreiben...

Zitat:
Die Bereitschaft der Amigafans, mehr Zeit zu investieren für das Gleiche was auf anderen Plattformen viel einfacher ist kann das nicht ausgleichen.

Wieso kann sie das nicht? Nur, weils bisher keiner gemacht hat? Weil für vieles auch schlicht die Entwicklerdokumentation nicht frei erhältlich ist?

Davon ab, es gibt durchaus gute Libraries für den Amiga, die von Anwendungsprogrammierern u.A. aus ideologischen Gründen schlicht nicht genutzt werden.

Zitat:
Z.b. habe ich verzweifelt nach einer Video Codec Library gesucht, nach einer MOD player library oder einer mp3 Encoder Library. Unter Windows ist das alles in 5min erledigt, FFMPEG als DLL, MikMOD als DLL oder LAME als DLL. Gibts alles. So kann man sehr schnell tolle Multimedia Apps zusammenstellen. Angesichts diesem Überflusses bin ich sogar oft sehr enttäuscht, wie "schwach" viele Windows Soft doch ist.

Die MOD-Geschichte ist ein sehr gutes Beispiel für oben gesagtes. Eine solche Library existiert. Sogar für die Geschmacksrichtung PPC. Nur benutzt sie kaum jemand (bzw. Niemand. Mir ist kein aktuelles MOD-Player-Programm bekannt, das diese shared Library nutzt). Und das oft aus "ideologischen" Gründen. Genauer: Weil das MOD-Format für "ernsthafte" Coder nicht 1337 genug ist. Oder weil das bevorzugte der knapp Gazillion leicht unterschiedlicher MOD-Formate davon gerade nicht unterstützt wird.

Statt dessen verkommt man auf die brilliante Idee, MODs als raw data zu speichern und ins ogg-Format zu wandeln, weil das gerade hip ist...

Zitat:
Auf dem Amiga gibt es von den o.g. Dingen zwar Commando Zeilen Ports, aber keine Libraries. Um da das gleiche zu erreichen muss man quasi alles selbst machen, vom Video Encoder bis zum MOD player. Das ist 1000x so viel Code und Arbeit, und das Ergebnis sehr viel schwächer.
Zumindest ist das so, wenn man keine Statischen Linker Libs hat und oder verwenden kann.


Wieder so eine Sache: Alles, was Du aufzählst, IST auch nur als Kommandozeilen-Tool gedacht. ffmpeg z.B. ist eine Tool-Sammlung zur Behandlung unterschiedlicher Bild- und Videoformate, aber keine Link-Library an sich. Für das Bauen dieser Tools existiert jedoch immer auch der Satz an zugehörigen Link-Libraries (libjpeg, libpng, libmpeg und wie sie alle heißen. Ich kriege immer wieder Zustände, wenn ich AmiUpdate auf OS4 starte, weil die Litanei der Link-Libraries, die ich nicht benutze, so irre lang geworden ist und in Wochenabständen länger wird).

Was glaubst Du, wie ffmpeg für Amiga (ja, sogar 68k!) portiert wurde? Alles "selbst gemacht" und unter Verwendung selbst gebauter shared libraries? Oder LAME? Diese Tools sind im engeren Sinne portabel, weil sie nicht auf dynamisch zu ladende Objekte angewiesen sind. Es gibt sie im Original statisch oder dynamisch gelinkt, aber geplant waren sie bisher immer für statisches Linken. Und da es fast immer eierlegende Wollmilchsäue sind, ist dynamische Linken im Grunde auch überflüssig für diese Tools. Was wohl auch der Grund dafür sein dürfte, daß für die meisten der für diese Tools verwendeten Link-Libraries keine Gegenstücke in Form einer Amiga shared Library vorliegen. libmad ist hier eine Ausnahme (mpega.library).

avcodec existiert übrigens sogar als shared library. Du müßest sie im Grunde "nur mal eben" auf 68k bringen (was nicht wirklich schwer ist). Über den Sinn dieser Aktion kannst Du Dir ja dann immer noch Gedanken machen, wenn die Besitzer echter 68k Amigas ihr Befremden darüber in diversen Foren zum Ausdruck bringen ;)

Zitat:
Lohnt es sich also, ein paar Bytes und CPU Cylces zu sparen, wenn dadurch das Erstellen mächtiger Software fast unmöglich wird?

Was heißt "mächtige" Software? Mächtig groß? Mächtig funktions- und fehlerbehaftet? Mächtig mit selten bis nie genutzten Spezialfunktionen überfrachtet? Mächtig schwerfällig sogar auf schnellsten Maschinen?

Das Problem, das Du da beschreibst, ist kein vom verwendeten Bibliothekssystem verursachtes Dilemma, sondern schlicht Folge der etwas unglücklichen Geschichte des Amiga. Wäre diese Geschichte nur ein wenig positiver verlaufen, würdest Du sicherlich über die unüberschaubare Menge der erhältlichen shared Libraries für einen bestimmten Zweck stöhnen.

Und um auf Dein eigentliches Problem zurückzukommen: Dieses wiederum ist eher eine Designfrage. Gründe für ein Überdenken Deines Designs wurden Dir hier einige aufgezählt.

Wie gesagt, wie Du damit letztendlich umgehst ist allein Deine Entscheidung. Niemand will und kann Dich zwingen, Deine Lib auch für AOS 68k zu entwickeln, wenn es Dir zu aufwändig ist. Aber denk mal darüber nach, was man Dir hier in Sachen C-Standardfunktionen und deren Verwendung in Bibliotheken gesagt hat. Wirklich clever ist dieser Weg nämlich nicht. Simpel und schnell gemacht, ja, aber nicht wirklich clever.
--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 10:04 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Mit mächtig meine ich z.B. folgendes:

Meine App verwendet einen HTML View für die Ausgabe von Informationen, man stelle sich z.B. den Chatlog von Skype vor.
In HTML hat man da fluchs ein schönes Layout mit kleinen Bildern etc. gemacht, man kann auf Online Hilfe linken, einen "Drucken" Button anbieten, Tutorial Videos einbetten etc., eben alles was im Browser so möglich ist, mit sehr wenig Aufwand und ohne sich gross durch Docu zu wälzen (wenn man HTML kann).
Ein Tutorial Video einbetten hat mich auf einem Handy(?) nicht mal 5min gekostet, und ich bin auf der Platform quasi ein Noob im Vergleich zum Amiga.

Jetzt stelle ich mir das als Amiga Port vor.
HTML View? Hm, vielleicht rudimentär mit MUI. Wie sieht es mit Drucken oder eingebetteten Videos aus? Link auf die Homepage der Software? Geht nicht. (Ja, es gibt OpenURL, aber dann geht ein extra Browser auf (dauert....) und stellt dann sie Seite soweiso nicht richtig dar.)

Oder z.B. mein TKPlayer. Die einzige Lib für MODs die ich gefunden habe ist die ptplay.library. Die kann aber nur die Ur-MODs und Protracker.
Würde mich interessieren von welcher MOD Lib du oben sprichst.
Die Lib muss einen Audio Stream berechnen, keine Custom Chips benutzen. Sonst kann ich es nicht in die Amiblitz API als Audio Format integrieren analog zu mp3 oder wav.

Also setze ich mich hin und progge einen Decoder für alle möglichen Formate, da bin ich 2 Jahre mit ausgelastet. In der Zeit käme dann nix anderes von mir. Unter Windows nehme ich MikMOD, und schon kann ich massig MOD Formate abspielen.

Und das eine ich damit, dass man das mit Amiga-Fan-sein nicht ausgleichen kann. Was mein Kollege auf dem iPhone in 5min macht würde mich auf dem Amiga ein halbes Jahr und sehr viel mehr graue Haare kosten.

Dieses "mächtige" Programmieren geht aber nur, wenn es, wie schon gesagt, ein gutes IDE, SDK (Docu) und die entsprechenden APIs gibt.
Mit der Amiblitz API habe ich mich versucht da heranzuarbeiten, es ist auch sehr viel möglich, aber alles innerhalb der Grenzen von AmigaOS und was dort verfügbar ist. Z.b. das Thema Video Codecs habe ich noch nicht angefasst,obwohl ich z.B. in HD-Rec gerne neben MIDI und Audio auch Video Tracks einbauen würde, ich wüsste aber nicht wirklich wie, wenn nicht selbst die Codecs schreiben, so wie ich es für einige Audio und Bild Formate gemacht habe. Aber für Video ist das eben zu aufwendig, vor allem wenn es nicht nur MPEG-1 sein soll.

--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 05.05.2010 um 10:09 Uhr geändert. ]

[ Dieser Beitrag wurde von Der_Wanderer am 05.05.2010 um 10:11 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 11:26 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von jolo:
2) Mit Windows-NT wurde zwingend die Benutzung der Referenznamen eingeführt um diese Probleme zu umgehen. Man kann aber heute noch die Referenztabellen verwenden (kann man?), diese sollten nach wie vor nominell vorhanden sein; macht nur keiner mehr, wegen der ungeliebten Blue-Screens - denke ich. ;)

Man kann Funktionen auch anhand ihres Index aufrufen. Das passiert auch in der Praxis, habe mal gerade auf die Schnelle nachgeschaut, die Funktion "Desktop anzeigen" in der Taskbar ist eine Verknüpfung auf shell32.dll, Funktionsindex -10113.

BlueScreens verursacht das allerdings höchstens, wenn jemand so verrückt ist, so etwas mit Treibern zu machen.

Zitat:
3) Eine DLL ist eine stinknormale, ausführbare Datei;
Das sind Amiga-Libraries auch.
Zitat:
... demnach müssen Suchvorgänge gestartet werden, um die Referenznamen zu ermitteln.
Schon klar, das ist eben der Unterschied zwischen symbolischen Linken und numerischen (oder manuellem).
Zitat:
5) Eine DLL klont immer ihren nicht-statischen Datenbereich, und zwar für jeden Thread/Prozess, das heißt, beim Öffnen und Schließen ist wesentlich mehr Arbeit seitens einer CPU gefragt als das bloße Hochzählen bzw. Runterzählen einer Variablen (OpenCount) auf Seiten einer Amiga Shared-Bibliothek.
Nun ja, so etwas wird heutzutage mit Sicherheit über Copy-on-Write Pages implementiert. Das heißt, es beeinflusst nur dann die Performance, wenn die Bibliothek auch tatsächlich unterschiedliche Daten pro Prozess haben will.
In dem Moment, wo das der Fall ist, kann man den Overhead sowieso nicht umgehen.

Zitat:
Dass die classic AmigaOS Bibliotheken unter m68k so effizient sind, hat den Grund, wie wir alle wissen, dass sie ausschließlich für m68k gedacht waren. Für andere Prozessoren und andere Programmiersprachen als m68k Assembler ist dieses Format aber alles andere als passend, so weit gebe ich euch Recht.
Und das ist umso faszinierender, wenn man bedenkt, dass Assembler zu keiner Zeit auf dem Amiga dominiert hat, von Demos und Spielen, die diese Bibliotheken eh nicht verwendet haben, mal abgesehen. Das AmigaOS selbst besteht größtenteils aus C-Code. (und BCPL...)
Zitat:
Nur, DLLs und Shared-Objects sind aber auch nicht gerade der Weisheit letzter Schluss, meiner bescheidender Meinung nach.
Das unterschreib ich sofort.

Zitat:
Da verwechselst Du was. Jede Bibliothek kann einen ganz anderen Initialisierungscode haben; Sprungtabellen können anhand von 32-Bit absoluten Adressen generiert werden (in C macht man das üblicherweise so), für Bibliotheken die ich in Assembler erstellt habe, benutzte ich aber 16-Bit Offsets relativ zur Funktion; zudem kann man im Initialisierungscode reinschreiben was man will, wie will da das Betriebssystem wissen, was es machen soll?
Die Betonung liegt auf kann. In der Praxis habe die wenigsten Bibliotheken anderen Initialisierungscode als der in den Beispiel-Bibliotheken und ob die wenigen, die davon abweichen, alle effizienter oder überhaupt korrekt sind, steht auf einem anderen Blatt.

Es geht hier nicht darum, dass die Möglichkeit zur individuellen Anpassung schlecht wäre, sondern um die Komplexität und Code-Doppelung bezüglich des Trivialfalls.
Zitat:
Zudem, wie ich oben schon einmal geschrieben habe, macht das Betriebssystem nichts mehr nachdem die Bibliothek einmal erstellt wurde; eine Bibliothek ist dann nur noch ein Haufen Code der irgendwo im Speicher schlummert und darauf wartet, dass irgendein Anwenderprogramm diesen Haufen Code ausführt. Nix mit Verwaltung seitens des OS. :)
Nun ja, das OS verwaltet schon die Bibliotheken. Anders kann ich das führen einer globalen Liste aller geladenen Bibliotheken und Bereitstellen der Verwaltungsfunktionen wie zum Öffnen und Schließen nicht bezeichnen.

Zitat:
Allerdings sollten Amiga Bibliotheken nicht nur thread-safe sein, sondern reentrant, dass heißt dann, dass keine modifizierbaren Daten den Funktionsaufruf überleben. Demnach braucht man auch keinen geklonten Datenbereich.
Ob man einen braucht oder nicht, entscheidet nicht das Bibliothekskonzept, sondern die Funktion. Und es gibt etliche Beispiele von modifizierbaren Daten, die einen Funktionsaufruf überleben.
Die einen sind Task-affin, wie zum Beispiel der ganze in der Prozess-Struktur untergebrachte I/O-Kontext, andere werden in globale Datenstrukturen eingehängt, wie geöffnete Fenster, wiederum andere müssen für jede Funktion von der Anwendung übergeben werden, wie z.B. ein RastPort.

Zitat:
Können wir dem Ganzen ein Ende setzen und sagen, dass Holger und Du nichts gegen Sprungadressenermittlung anhand von Bezeichnern habt, wogegen ich statische Offsets fest verankert im Programm favorisiere?
Mir geht es gar nicht darum, etwas zu favorisieren. Ich habe nur die Größenordnung des Performance-Unterschieds bezweifelt.
Es wäre auch nicht allzuschwer, eine symbolische Verlinkung für Programme zu implementieren, die auf dem Offset-Mechanismus aufbaut, wenn man das braucht. Die Schwierigkeiten von Thilo würden davon aber nicht verschwinden...

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 11:27 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Mir war nur nicht ganz klar, dass selbst in C es recht schwer ist eine etwas komplexere Library zu erstellen, vor allem wenn es sich um nicht-notwendigerweise-auf-den-Amiga-maßgeschneiderten Code handelt.

Selbst wenn es spezielle Amiga-Bibliotheken werden sollen, ist das nicht leicht.
Dass es auf unixoiden Betriebssystemen leichter ist, liegt daran, dass C und Unix im Prinzip eine Einheit bilden, die Plattformunabhängigkeit von C ist eher draufgepfropft, bzw. in etlichen Aspekten eine Farce.
Außerdem programmiert man da oftmals immer noch als wäre man in einer Single-Task-Umgebung und das OS kümmert sich um die Feinheit, dass es da draußen doch noch andere Tasks gibt.
Zitat:
Lohnt es sich also, ein paar Bytes und CPU Cylces zu sparen, wenn dadurch das Erstellen mächtiger Software fast unmöglich wird?
Natürlich nicht. Aber an die Mächtigkeit heutiger Software hat man vor 25 Jahren natürlich noch nicht gedacht.


Zitat:
Original von whose:
Zitat:
Ich bin in letzer Zeit beruflich mit einigen Plattformen in Berührung gekommen. Da merkt man deutlich, wenn man mal die Ideologie beiseite lässt, dass der Komfort und Qualität von IDE, SDK und der API der Schlüssel sind ob eine Plattform gute Software bekommt oder nicht.

Das würde ich so nicht unterschreiben...


Was außer Komfort und Qualität von IDE, SDK und der API soll denn noch eine Rolle spielen?

Der Enthusiasmus?
Dann müsste der Amiga ja in guter, aktueller Software schwimmen.

Die Performance?
Dann hätte der Wechsel von 68k auf ppc einen ordentlichen Anstieg von verfügbarer Software verursachen müssen, den ich nicht wirklich erkennen kann.

Was noch?

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 11:32 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Dieses "mächtige" Programmieren geht aber nur, wenn es, wie schon gesagt, ein gutes IDE, SDK (Docu) und die entsprechenden APIs gibt.
Mit der Amiblitz API habe ich mich versucht da heranzuarbeiten, es ist auch sehr viel möglich, aber alles innerhalb der Grenzen von AmigaOS und was dort verfügbar ist.

Das, was das AmigaOS nicht kann, muss man selber machen, das ist logisch. Und wenn man das nicht mehr weiterentwickelte AmigaOS3.x mit einschließt, wird sich die Menge des vom System zur Verfügung gestellten auch nie ändern. Und der gemeinsame Nenner von AOS4, MOS und Aros wird sich auch kaum weiterentwickeln.

Allerdings kann ich mich erinnern, dass Du ohnehin Deine Bedenken bezüglich des Benutzens von 3rd-party Libraries hattest, insofern sind einige Schwierigkeiten möglicherweise hausgemacht...

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 12:08 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Man bräuchte eigentlich eine moderne API, die auf allen Systemen in gleicher Version verfügbar ist.
Z.B. sowas
code:
Import Amiga.CImage

CImage img = new CImage("DH0:myImage.jpg")
img.Resize(800,600,CIMAGE_INTERPOLATION_CUBIC);
img.Save("DH0:myImage_in800x600.png","PNG");

Das entspricht so in etwa der API von Amiblitz3 und was in in A/A++ vorhabe, wenn ich das jemals realisiere.

Alles andere ist viel zu kompliziert, mit Datatypes, richtige Tags setzen etc. Und das speichern geht schonmal gar nicht.
Im gleichen Stil wäre dann
code:
Import Amiga.CSound

CSound snd = new CSound("DH0:mySound.wav")
snd.Play();
snd.Save("DH0:mySound.mp3","MP3")


oder

code:
Import Amiga.CAudioStream

CAudioStream music = new CAudioStream("DH0:myMusic.mod")
while (music.Available()>0) {
  music.PlayBuffer()
}


Das Problem ist halt nur, dass jedes System das versucht, aber nicht mit den anderen kooperiert. Deshalb bleibt der Amiga auf 3.x stehen, und ein neues Projekt in C anzufangen ist gleich eine Mammutaufgabe mit viel Trial and Error.
In Eclipse+Java funktioniert der Code meistens fast auf Anhieb. Unter C auf dem Amiga braucht man zig Compiler Läufe bis dann alles klappt. Und wenns dann auch noch zur Laufzeit funktioniert, fliegt es einem mit hoher Wahrscheinlichkeit um die Ohren wenn jemand das auf einer anderen Plattform ausprobiert. Das liegt nicht an C, sondern am schwachen IDE, was einem nicht zur Tip-Zeit auf Fehler hinweist, an einem schwachen SDK was nur eine Plattform berücksichtigt und an einer schwachen API die einem für (aus heutiger sicht) triviale Sachen wie ein Bild laden viel zu viel OS Internas vor den Latz knallt wo man massig Fehler machen kann (auch als erfahrener Progger) und ein vielfaches mehr Code braucht als man heutzutage erwarten würde.

Und wie gesagt, das kann man nicht durch Enthusiasmus ausgleichen. Und gerade wenn Entwickler Man-Power knapp ist, muss man sich auf eine gutes IDE+SDK+API gespannt konzentrieren, das passiert aber nicht, sondern alle backen ihre eigenen, kleinen Brötchen.

Aber ich schweife langsam vom Thema ab, das wäre ein anderer Thread...




--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 05.05.2010 um 12:13 Uhr geändert. ]

[ Dieser Beitrag wurde von Der_Wanderer am 05.05.2010 um 12:17 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 15:08 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Der_Wanderer:
Man bräuchte eigentlich eine moderne API, die auf allen Systemen in gleicher Version verfügbar ist.
Z.B. sowas
code:
Import Amiga.CImage

CImage img = new CImage("DH0:myImage.jpg")
img.Resize(800,600,CIMAGE_INTERPOLATION_CUBIC);
img.Save("DH0:myImage_in800x600.png","PNG");

Das entspricht so in etwa der API von Amiblitz3 und was in in A/A++ vorhabe, wenn ich das jemals realisiere.

Alles andere ist viel zu kompliziert, mit Datatypes, richtige Tags setzen etc. Und das speichern geht schonmal gar nicht.


hm? Im Groben funktionierts via Datatype mit ziemlich genau so viel Code und mit ungefähr der gleichen Menge an Tags.

Ich glaube, da kommt so langsam das von Dir schon erwähnte Problem der "Ideologie" ins Spiel.

Und wieso sollte das Speichern schon mal gar nicht gehen? Es geht eher selten mit den vorhandenen JPG Datatypes, aber prinzipiell ist es überhaupt kein Problem.

Das wäre eine Sache, die man mit Enthusiasmus z.B. ausgleichen könnte. Einfach mal das nutzen, was schon seit Jahrzehnten im API vor sich hin döst, und Datatypes fabrizieren, die auch speichern können. Nur machen müßte es mal jemand. Am sinnvollsten der, der es auch braucht und über einen Mangel klagt.

Zitat:
Das Problem ist halt nur, dass jedes System das versucht, aber nicht mit den anderen kooperiert. Deshalb bleibt der Amiga auf 3.x stehen, und ein neues Projekt in C anzufangen ist gleich eine Mammutaufgabe mit viel Trial and Error.

Wieso bleibt der Amiga auf 3.x stehen? Die meiste Entwicklung findet momentan auf allen Plattformen statt, nur nicht auf OS3.x.

Zitat:
In Eclipse+Java funktioniert der Code meistens fast auf Anhieb. Unter C auf dem Amiga braucht man zig Compiler Läufe bis dann alles klappt. Und wenns dann auch noch zur Laufzeit funktioniert, fliegt es einem mit hoher Wahrscheinlichkeit um die Ohren wenn jemand das auf einer anderen Plattform ausprobiert.

Dir ist schon klar, daß Du Äpfel mit Birnen vergleichst? Java lebt vor allem von seinen Toolkits. Nahezu gänzlich ohne diese (also vergleichbar mit der Situation C auf dem Amiga) könntest Du Dir auf Anhieb funktionierenden Java-Code ebenfalls abschminken.

Zitat:
Das liegt nicht an C, sondern am schwachen IDE, was einem nicht zur Tip-Zeit auf Fehler hinweist, an einem schwachen SDK was nur eine Plattform berücksichtigt und an einer schwachen API die einem für (aus heutiger sicht) triviale Sachen wie ein Bild laden viel zu viel OS Internas vor den Latz knallt wo man massig Fehler machen kann (auch als erfahrener Progger) und ein vielfaches mehr Code braucht als man heutzutage erwarten würde.

In Sachen schwacher IDE gebe ich Dir durchaus Recht. Aber was willste machen? Die, die die Resourcen hätten, um eine wirklich brauchbare IDE auf die Beine zu stellen, propagieren das Hardcore-Coden von der Shell aus oder hoffen, irgendwann in den nächsten 5 Jahren "irgendwas" soweit vorbereitet zu haben, daß mans "irgendwie" portieren kann (Eclipse zum Beispiel).

Das andere ist eher ein Problem der "Toolkits". Bilder laden ist auch unter AmigaOS äußerst trivial und es wäre überhaupt kein Akt, für die gebräuchlichsten Datatype-Aufrufe generalisierte Funktionen zu basteln, die dann einfach in eine Link-Library gepackt werden.

Streng betrachtet könnte man sowas sogar noch wesentlich weiter vereinfachen, als Du es oben dargestellt hast. Nur machen muß es jemand und der Rest muß es dann auch benutzen. Letzteres ist oft ein Problem.

Zu Deiner Frage nach der Mod-Library: Ich meinte p61.library. Aber ptplay hast Du ja selbst schon entdeckt und auch gleich meine Ansicht dazu bestätigt: Ideologiefrage.

Aber davon mal ab, es ist nicht so, als gäbe es libmikmod nicht für Amiga. Die gibt es. Nur: benutzen muß man sie.

Zitat:
Und wie gesagt, das kann man nicht durch Enthusiasmus ausgleichen. Und gerade wenn Entwickler Man-Power knapp ist, muss man sich auf eine gutes IDE+SDK+API gespannt konzentrieren, das passiert aber nicht, sondern alle backen ihre eigenen, kleinen Brötchen.

Wie sähe denn eine gute IDE+SDK+API für Amiga für Dich aus? Komm bitte nicht mit "Eclipse blah", das funktioniert nicht. Welche Ansätze in diesem Bereich (AmigaOS) findest Du zum Beispiel gut? Welches Projekt würdest Du persönlich bestärken, weiterzumachen?

Das "eigene kleine Brötchen backen" ist unter den Benutzern nämlich genauso weit verbreitet wie unter den Entwicklern.

"Ja, es muß was Amiga-typisches sein, aber am besten wäre Eclipse..."

Welcher Entwickler setzt sich denn dann noch hin und baut was im Kaliber Eclipse, wenn die meisten dann doch lieber "das echte Eclipse" hätten? Da beißt sich die Katze in den Schwanz.

Zitat:
Aber ich schweife langsam vom Thema ab, das wäre ein anderer Thread...

Och, die eigentliche Frage ist doch geklärt. Im Prinzip schon, aber nicht so simpel, wie Du gehofft hast ;) Da können wir ruhig weiter über Grundsätzliches reden, denke ich :)
--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 15:20 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von whose:
Zitat:
Ich bin in letzer Zeit beruflich mit einigen Plattformen in Berührung gekommen. Da merkt man deutlich, wenn man mal die Ideologie beiseite lässt, dass der Komfort und Qualität von IDE, SDK und der API der Schlüssel sind ob eine Plattform gute Software bekommt oder nicht.

Das würde ich so nicht unterschreiben...


Was außer Komfort und Qualität von IDE, SDK und der API soll denn noch eine Rolle spielen?


Gute Ideen und das Bestreben, Software in wirklich hoher Qualität abzuliefern. Heutzutage herrscht dagegen der Trend Featuritis und "schnell, schnell!" vor. Und das trotz hohem Komfort und gewisser Qualitäten von IDE, SDK und API.

Zitat:
Der Enthusiasmus?
Dann müsste der Amiga ja in guter, aktueller Software schwimmen.


Erinnere Dich mal daran, wie oft Du hier bestrebt warst, Enthusiasmus abzuwürgen, weil Du der Ansicht warst, daß der jeweilige Enthusiasmus Zeitverschwendung wäre. Und dann erinnere Dich daran, daß Du nicht der Einzige mit diesem Bestreben bist ;)

Viele gute Ideen sind in den vergangenen 10 Jahren den Bach runter gegangen, weil sie schlicht totdiskutiert wurden, statt sie einfach zu nutzen.

Zitat:
Die Performance?
Dann hätte der Wechsel von 68k auf ppc einen ordentlichen Anstieg von verfügbarer Software verursachen müssen, den ich nicht wirklich erkennen kann.


Hm, also in Sachen "verfügbarer" Software hat PPC durchaus einiges gebracht. Für die Marktverhältnisse sogar erstaunlich großen Anstieg. Und das trotz Grabenkämpfen, übermächtiger Konkurrenz x86, teilweise seltsamem Verhalten der User (Stichwort Ideologie) und Problemen im Bereich der Kernentwickler (gleiches Stichwort).

Die Qualität der zusätzlich verfügbaren Software ist ein anderes Kapitel, aber solange die Ideologie des "Portieren auf Teufel komm raus" vorherrscht, wird sich daran wohl wenig ändern...
--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 16:44 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@whose:

Zitat:
hm? Im Groben funktionierts via Datatype mit ziemlich genau so viel Code und mit ungefähr der gleichen Menge an Tags.
Hüstel.
Das hier ist der Code, den u.A. image_Load ausführt, wenn es sich um ein Datatype ladbares Format handelt.
Das würde ich nicht als "ziemlich genauso viel Code" bezeichnen.
Und das ist noch lange nicht alles, es muss ja noch das CImage Objekt angelegt werden mit weiteren Informationen zum blitten etc.
Der Code lädt "nur" ein Bild in eine Bitmap.
Der Code ist u.A. so lange, weil man OS3, OS4 und MOS unter einen Hut bekommen muss.

code:
Function.l image_LoadViaDT{image.l,filename.s,imgnum.l}
DEFTYPE.BitMapHeader *bmhdp
DEFTYPE.BitMap *bmap
DEFTYPE.pdtBlitPixelArray DTM
succ.l = False
If imgnum<0 Then imgnum=0
tag5.tag5ti_Tag = #PDTA_DestMode, #PMODE_V43, #DTA_SourceType, #DTST_FILE, #DTA_GroupID, #GID_PICTURE, #PDTA_Remap, False,#PDTA_WhichPicture,imgnum,#TAG_DONE,0
*DTPic._Object = NewDTObjectA_ (&filename.s,tag5)
If *DTPic
  tag5.tag5ti_Tag = #PDTA_BitMapHeader,&*bmhdp,#TAG_DONE,0
  GetDTAttrsA_ *DTPic,tag5
  If image_Create{image,*bmhdpbmh_Width,*bmhdpbmh_Height}
    If image_Lock{image}

      ; try to get as ARGB immediately, good datatpyes support this, but not all!
      ;If *bmhdpbmh_Depth>8 ; dont even try if depth <=8
        DTMMethodID            = #PDTM_READPIXELARRAY
        DTMpbpa_PixelData      = raw_ptr          ; /* The pixel data to transfer to/from */
        DTMpbpa_PixelFormat    = #PBPAFMT_ARGB     ; /* Format of the pixel data (see "Pixel Formats" below) */
        DTMpbpa_PixelArrayMod  = bpr              ; /* Number of bytes per row */
        DTMpbpa_Left           = 0                 ; /* Left edge of the rectangle to transfer pixels to/from */
        DTMpbpa_Top            = 0                 ; /* Top edge of the rectangle to transfer pixels to/from */
        DTMpbpa_Width          = *bmhdpbmh_Width  ; /* Width of the rectangle to transfer pixels to/from */
        DTMpbpa_Height         = *bmhdpbmh_Height
        If DoMethodA (*DTPic,&DTM) Then succ = True
      ;End If

      ; ok, try to read out the bitmap if ARGB failed...
      If succ=False
        tag5.tag5ti_Tag = #PDTA_ColorRegisters,&colorMap.l,#TAG_DONE,0
        If GetDTAttrsA_ (*DTPic,tag5)
          tag5.tag5ti_Tag = #PDTA_BitMap,&*bmap,#TAG_DONE,0
          If GetDTAttrsA_ (*DTPic,tag5)
            *layerinfo.Layer_Info = NewLayerInfo_
            If *layerinfo
              *layer.Layer = CreateUpfrontHookLayer_ (*layerinfo,*bmap,0,0,*bmhdpbmh_Width-1,*bmhdpbmh_Height-1,0,#LAYERS_NOBACKFILL,0)
              If *layer
                *rp.RastPort = *layerrp
                If *rp
                  image_Unlock{image}
                  succ = image_CutRP{image,*rp,0,0,*bmhdpbmh_Width,*bmhdpbmh_Height,-1,-1,-1,colorMap}
                  If succ Then image_Lock{image}
                End If
                DeleteLayer_ 0,*layer
              End If
              DisposeLayerInfo_ *layerinfo
            End If
          End If
        End If
      End If

      ; Try READPIXELARRAY LUT8, if we couldn't catch the bitmap (outch!)
      If succ=False
        penArray8.l = AllocVec_(*bmhdpbmh_Height * *bmhdpbmh_Width,#MEMF_ANY)
        lut.l       = AllocVec_(256*4,#MEMF_CLEAR)
        If penArray8><0 AND lut><0
          DTMMethodID            = #PDTM_READPIXELARRAY
          DTMpbpa_PixelData      = penArray8         ; /* The pixel data to transfer to/from */
          DTMpbpa_PixelFormat    = #PBPAFMT_LUT8     ; /* Format of the pixel data (see "Pixel Formats" below) */
          DTMpbpa_PixelArrayMod  = *bmhdpbmh_Width  ; /* Number of bytes per row */
          DTMpbpa_Left           = 0                 ; /* Left edge of the rectangle to transfer pixels to/from */
          DTMpbpa_Top            = 0                 ; /* Top edge of the rectangle to transfer pixels to/from */
          DTMpbpa_Width          = *bmhdpbmh_Width  ; /* Width of the rectangle to transfer pixels to/from */
          DTMpbpa_Height         = *bmhdpbmh_Height
          If DoMethodA (*DTPic,&DTM)
            tag5.tag5ti_Tag = #PDTA_ColorRegisters,&colMap.l,#TAG_DONE,0
            If GetDTAttrsA_ (*DTPic,tag5)
              For pen.l=0 To (1 LSL *bmhdpbmh_Depth)-1
                *CReg.ColorRegister = colMap + 3*pen
                Poke.l lut + (pen LSL 2),((*CRegred&$00FF) LSL 16) | ((*CReggreen & $00FF) LSL 8)  | (*CRegblue & $FF)
              Next
              For y.l = 0 To *bmhdpbmh_Height -1
                For x.l = 0 To *bmhdpbmh_Width -1
                  pen.l = Peek.b(penArray8+y**bmhdpbmh_Width+x) & $FF
                  Poke.l raw_ptr+y*bpr+(x LSL 2),(Peek.l(lut+(pen LSL 2)) );& $FEFEFEFE) LSR 1
                Next
              Next
              succ.l = True
            End If
          End If
          If penArray8 Then FreeVec_ penArray8 : penArray8 = 0
          If lut       Then FreeVec_ lut       : lut       = 0
        End If
      End If
      image_Unlock{image}
    End If
    If succ=False Then image_Free{image}
  End If
  DisposeDTObject_ (*DTPic)
End If
Function Return succ
End Function

--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 20:47 Uhr

whose
Posts: 2156
Nutzer
@Der_Wanderer:

Du machst mit dem Code aber auch etwas mehr spezielleres, als "nur ein Bild laden und auf den Schirm bringen". Der Code, den Du als Beispiel dafür brachtest, wie Du Dir "ein Bild laden und auf den Schirm bringen" vorstellst, ist in C ungefähr gleich. Und in Blitz sicher auch. Und bisher kenne ich keine Plattform, wo dieser Code (Bild laden und auf den Schirm bringen) nicht läuft.

Ich verstehe Dein Problem ja, aber es hilft rein gar nichts, sich über die Unzulänglichkeiten zu ärgern und eine Menge Code "drumherum" zu schreiben. Wenn Datatypes nix taugen, weil sie im API festgelegte Funktionen nicht oder falsch unterstützen gibts eigentlich nur zwei Dinge: Knochenhart sagen "Leute, mit dem Datatype läufts nicht, benutzt den oder den". Und sich dran setzen, einen Datatype zu entwickeln, der tut, was er soll.

Manchmal gibts allerdings auch Situationen, wo "selbst machen" unmöglich ist. Ging mir bei Amijeweled mit bestimmten P96-OS3.x-Systemen so. Da bleibt einem nicht viel mehr als zu sagen: "Tut mir leid, Leute, ich kanns auf Euren Systemen nicht zum Laufen bringen und es ist ziemlich unwahrscheinlich, daß der Fehler in P96 oder Eurem GraKa-Treiber noch gefunden und beseitigt wird". Kann man sich dann höchstens Notizen zu machen und schauen, ob eines Tages ein ähnlich gebautes Programm plötzlich funktioniert. Vielleicht findet man dann das Problem und kann es umgehen.

Fakt ist, die Plattformen streben inzwischen deutlicher auseinander. Kompatibilität gibt es untereinander nur noch auf dem kleinsten gemeinsamen Nenner und gerade der krankt an früher eingeführten Problemen. Die kannst Du aber nur dann für alle Plattformen kompatibel umschiffen, wenn Du deutlich mehr Arbeit in den Code steckst. Oder die Plattform OS3.x + RTG zu Gunsten einer der anderen fallen läßt. Mit OS3.x allein kommst Du heutzutage jedenfalls nicht mehr weit. Und es besteht wenig Aussicht darauf, daß OS3.x noch Weiterentwicklung erfährt. Bei den anderen Plattformen sieht das anders aus.
--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 21:02 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von whose:
@Der_Wanderer:
Du machst mit dem Code aber auch etwas mehr spezielleres, als "nur ein Bild laden und auf den Schirm bringen". Der Code, den Du als Beispiel dafür brachtest, wie Du Dir "ein Bild laden und auf den Schirm bringen" vorstellst, ist in C ungefähr gleich.

Ähem, der Dreizeiler, von dem Du behauptet hast, "Im Groben funktionierts via Datatype mit ziemlich genau so viel Code", öffnet ein Bild, skaliert es und speichert es.
Wie Du jetzt plötzlich auf "nur ein Bild laden und auf den Schirm bringen" kommst, ist mir schleierhaft.

Allerdings würde ich auch gern mal sehen, wie Du allein das "ein Bild laden und auf den Schirm bringen" mit einem C-Dreizeiler implementieren willst.

Das dürften ziemlich lange Zeilen werden ;)

Allein die Sache, dass man noch ne PROC_LAYOUT-Methode schicken muss, hat mich damals Stunden gekostet, als ich es zum ersten Mal gemacht habe...

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 21:05 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von whose:
Erinnere Dich mal daran, wie oft Du hier bestrebt warst, Enthusiasmus abzuwürgen, weil Du der Ansicht warst, daß der jeweilige Enthusiasmus Zeitverschwendung wäre.

Es war nie mein Bestreben, Enthusiasmus abzuwürgen.
Enthusiasmus, der bei einer Konfrontation mit der Realität verpufft, wäre allerdings sowieso niemals ausreichend gewesen, um irgendein Softwareprojekt fertigzustellen.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 21:51 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@whose
Der Beispiel Code lädt ein Bild via Datatype (als ARGB Bitmap) in den Speicher, skaliert das Bild und speichert es. Und zwar so, dass es unter OS3.x, OS4, MOS und AfA (und somit AROS?) funktioniert.

Von auf den Schirm bringen habe ich nichts gesagt. Das ist eine andere Funktion, die nichts mehr mit Datatypes zu tun hat.

Ich würde gerne mal dein Code sehen, der das per DT in einigen wenigen Zeilen macht. Das fängt schon beim skalieren an. Da das in jedem Datatype extra implementiert ist, hast du keinerlei Garantie über die Skalierungsqualität. Speichern habe ich bei DT noch nie gesehen, ausser ILBM über die datatype.library selbst, und sogar dass funktioniert nicht überall, z.b. nicht unter AROS. Ist auch ziemlich nutzlos, weil IFF-ILBM niemanden mehr interessiert.

Datatypes können Bilder auch direkt darstellen, ist meiner Meinung nach aber (ausser vielleicht für einen reinen Bildbetrachter) völlig überflüssig.
Überhaupt ist das Konzept der DT zwar gut, aber die API ist total verkorkst und es ist nicht konsequent durchgezogen, z.b. das Sound Datatypes ist völliger Krampf.

Wenn ich ein Bild laden will, dann erwarte ich eine Funktion wie

LoadImage(...).

Wenn ich es speichern will

SaveImage(...)

Wenn ich es blitten will,

BlitImage(...)

...oder eben die OOP Pendants.
Ich möchte mich nicht mit zig Tags und Flags rumschlagen müssen, oder ob es nun OS3/4 oder MOS ist, ob es nun 256 Farben oder 24bit ist.

Die API sollte natürlich erlauben, tiefer eingreifen zu können, z.B.

RemapImage(...,ColorMap)
GetRawPtr(...)
SetDithermode(...)
SetTransparency(...)
SetBlitArea(...)
...
LoadImage sollte natürlich auch weitere, optionale Parameter haben wie z.B. ImageNumber, Thumbnail etc.

aber nicht im simplen Fall der in 90% der Fälle ausreicht.
Ein Bild so zu laden via DT, dass es überall funzt, ist ein kleines Kunstück, und dauert z.B. auf Android 2min ohne das IDE zu verlassen, selbst wenn man ein totaler Noob ist, und auf dem Amiga viele Stunden und Reboots.

Wenn deine App nicht funktioniert, ist das immer erstmal dein Problem. Da nützt es nichts, auf bestimme Datatypes zu verweisen.

Also ich fasse nochmal zusammen:

Um auf dem Amiga in heutzutage üblichen Geschwindigkeit entwickeln zu können, wäre eine Amiga-Like Platform übergreifende API, ein dazugeöriges IDE und SDK sehr wichtig. (sowas wie MFC, nur moderner).
Das kann aber niemand alleine machen, nichtmal wegen der Zeit, sondern wegen der Akzeptanz. Das müsste quasi "von oben" kommen und Teil aller beteiligten OSe sein.

Unter Amiblitz3 habe ich mir in etwa sowas zusammen programmiert, das hat über 10 Jahre gedauert, und ist wegen der zeitlichen Ausdehnung nicht so durchgestyled wie ich es mit wünschen würde. Aber das ist 68k, kein C und findet damit logischerweise kaum Akzeptanz.

--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 05.05.2010 um 21:54 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

05.05.2010, 22:28 Uhr

Kaesebroetchen
Posts: 643
Nutzer
@Der_Wanderer:

Hat jetzt nicht direkt was mit dem eigentlichen Thema zu tun, aber zum Stichwort HTML-View fiel mir die AROS OWB-Bounty ein:

http://www.power2people.org/bounty_020.html

Die Bounty sieht vor, das die Render Engine ein separates Modul sein muss.
Vielleicht kannst du damit was anfangen ?
--
http://amidevcpp.amiga-world.de/

[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 01:20 Uhr

whose
Posts: 2156
Nutzer
@Der_Wanderer & Holger:

Schon mal auf die Homepage von thomas geschaut? Jede Menge Beispielcode zum Thema Datatypes.

Im Groben (bis auf die Dinge, die "drumherum" vorbereitet werden müssen, die gibts aber bei den diversen Toolkits und Link-Libraries auch, und manchmal noch viel schlimmer), läuft Laden (wahlweise incl. Skalieren) und Anzeigen in 3, max. 4, Schritten ab. NewDTObject(), DoMethod(), GetDTAttrs() und ggf. BltBitMapRastPort(). Selbst das Speichern sieht so aus:

code:
DoDTMethod (o,NULL,NULL,DTM_WRITE,NULL,fhand,DTWM_IFF,TAG_END);


Jetzt erklär mir bitte mal jemand, was daran so fürchterlich kompliziert ist? Außer vielleicht, daß man die Tags kennen sollte?

Diese Form von API ist nicht komplizierter als die, die Der_Wanderer gezeigt hat. Anders, ja, aber nun wirklich nicht komplizierter. Und wer unbedingt möchte kann, wie ich schon erwähnte, den ganzen Krempel noch weiter vereinfachen, häufige Nutzungsarten in eine Funktion einer Link-Library packen, usw. Es muß halt nur mal einer tun und andere Entwickler sollten das Zeug dann auch nutzen, selbst wenn u.U. irgendein Detail nicht ganz so ist, wie mans sich wünscht, aber dann doch eher selten bis gar nicht benutzt.

Schon mal zlib benutzt? DAS ist kompliziert. Puffer hier, Zwischenergebnisse dort, getaggte Speicherbereiche, die man selbst überprüfen muß usw. Und alles nur, um ein paar Kilobyte zu packen. Darüber beschwert sich aber komischerweise niemand. Das wird benutzt, weils vorhanden ist. Ist ja auch aus dem Unix-Bereich stammend. Nur beim Amiga ist es immer wieder ein Problem, vorhandenes zu benutzen. Nur, weil dieses oder jenes "nicht richtig" oder "zu kompliziert" ist.

Was die Angelegenheit API beim Amiga kompliziert macht ist die (ideologisch) bedingte Vielfalt an z.B. Datatypes, die eigentlich den gleichen Zweck erfüllen sollen, dies aber unterschiedlich gut (oder schlecht) erledigen.

Wie Der_Wanderer schon anmerkte (aber nicht BEmerkte): Es gibt immer wieder Ansprüche, die z.B. kein Datatype erfüllt. Dem einen ist die Qualität der Skalierung nicht ausreichend, der andere stört sich daran, daß es Probleme mit evtl. Remapping auf AGA gibt und so weiter und so fort. Nicht zu vergessen diejenigen, die ein z.B. JPEG Datatype nur dann akzeptieren, wenn es mit Hilfe der libjpg entwickelt wurde.

Was wirklich fehlt ist das Bestreben und der Ehrgeiz, aus dem bereits Vorhandenen gute Software zu produzieren und auch mit anderen Entwicklern aktiv zusammenzuarbeiten. Sich auf das Vorhandene wirklich einzulassen und auch die Gegebenheiten (4 immer wieder leicht unterschiedliche Systeme) einfach mal anzuerkennen, statt ständig eine Angleichung zu fordern, die nicht erreichbar ist, das fehlt. Der Rest ergäbe sich von allein, wenn diese Haltung sich endlich einmal durchsetzen könnte.
--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 10:59 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von whose:
Im Groben ... läuft Laden (wahlweise incl. Skalieren) und Anzeigen in 3, max. 4, Schritten ab. NewDTObject(), DoMethod(), GetDTAttrs() und ggf. BltBitMapRastPort().

Hui, nur 3 bis 4 Schritte und Funktionen aus drei unterschiedlichen Bibliotheken für eine Aktion, das ist ja wirklich komfortabel.
Zitat:
Selbst das Speichern sieht so aus:
code:
DoDTMethod (o,NULL,NULL,DTM_WRITE,NULL,fhand,DTWM_IFF,TAG_END);


Das sieht mir aber irgendwie nach Speichern als IFF aus, an dem niemand hier Interesse hatte. Andernfalls vermisse ich hier nämlich den Code, der abfragt, ob das Datatype das Speichern im eigenen Format (nicht IFF) überhaupt unterstützt.
Zitat:
Jetzt erklär mir bitte mal jemand, was daran so fürchterlich kompliziert ist? Außer vielleicht, daß man die Tags kennen sollte?
Abgesehen davon, dass das bislang sowohl unvollständig ist, als auch die genannte Anforderung nicht erfüllen würde, selbst wenn es vollständig wäre, so handelt es sich hier nur um eine einzige als Beispiel herausgegriffe Funktion.

Klar können die alteingesessenen Programmierer, die den ganzen Tag nichts anderes machen als Datatypes zu laden, diesen Code sofort aus dem Ärmel schütteln. Für jemanden, der eine echte Anwendung schreiben will, die aus hundert weiteren solcher Funktionen besteht, sieht das ganz anders aus.
Zitat:
Diese Form von API ist nicht komplizierter als die, die Der_Wanderer gezeigt hat.
Ja schreib erst mal das ganze Beispiel hin, das wirklich das gleiche wie sein Code macht. Und dann reden wir nochmal darüber.
Zitat:
Wie Der_Wanderer schon anmerkte (aber nicht BEmerkte): Es gibt immer wieder Ansprüche, die z.B. kein Datatype erfüllt. Dem einen ist die Qualität der Skalierung nicht ausreichend, der andere stört sich daran, daß es Probleme mit evtl. Remapping auf AGA gibt und so weiter und so fort.
Genau deshalb ist es ein Fehldesign, diese Aufgaben den Datatypes zu überlassen, statt in der Bibliothek zu verankern.

Und diese Beispiele hier sind noch harmlos. Schließlich ist die Nutzung der Datatypes mit Grafiken quasi die Hauptanwendung.

Schon mal intensiver mit dem Text-Datatype auseinandergesetzt? ;)

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 11:48 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@whose
Das ist wirklich nur der Schlüssel Aufruf. (und hat schon wesentlich mehr Parameter wo man nicht intuitiv weis was sie machen).
Du siehst das gnaze etwas verklärt denke ich. Jemand der AmigaOS nicht kennt würde nur den Kopf schütteln und mit sowas niemals anfangen was zu entwickeln, also nicht im Jahre 2010. Heute sind die Anforderungen viel höher an eine App. Man will sich heute auch nicht mehr mit sowas aufhalten. Das Hauptaugenmerk sollte die eigentliche Funktionalität der App sein, nicht das Bezwingen der OS API um ein Bild zu laden.

Schau mal die Funktion in Amiblitz, um IFF-ILBM zu speichern. Da ist natprlich noch ein bisschen Code drin, den man weglassen könnte, aber vieles ist auch notwendig.
Andere Formate habe selbst ICH nicht hinbekommen, nach stundenlangen Bemühungen. Wenn ich das nicht hinbekomme, heisst das nicht dass es nicht geht, aber das heisst dass es fast NIEMAND hinbekommt.
Und sowas wie "SaveImage(image,file)" bekommt JEDER hin, der es schafft einen Texteditor aufzumachen.

Dazu kommt, dass das Speichern via DT wertlos ist, da es fast kein DT unterstützt. Wenn du z.B. ein Paint Program schreibst, und speichern via DT machst, dann funktioniert das in der Praxis einfach nicht und du wirst nur Beschwerden bekommen, warum geht PNG speichern nicht? warum geht JPEG speichern nicht? etc.
Du kannst dann natürlich wieder auf die DT zeigen, aber wen interessiet das? Deine App kann nicht speichern, Punkt.

In Amiblitz kann man IFF-ILBM, PNG, JPEG, BMP und AB3I (Haus eigenes Format) speichern. Das sind aber alles Hand-implementierte Saver (bis auf JPEG, das nutzt die jpeg.library, die bei einem richtigen DT Konzept gar nicht nötig wäre). Und das ist natürlich schlecht, dass sie von Hand implementiert sind, weil sie dann nicht so mächtig sind.

Aber es erlaubt die AB3 API

image_Save{"dh0:image.png","PNG"}

ohne wenn und aber.

code:
;///////////////////////////////////////////////////////////////////////////////
;/                                                                             /
;/ Syntax:  result.l = image_WriteDT{fid.l,image.l}                           /
;/                                                                             /
;/ Description:                                                                /
;/ * private *                                                                 /
;/ Write a picture as 24Bit IFF-ILBM via datatypes.                            /
;/                                                                             /
;/ Inputs:                                                                     /
;/ - image.l     : image object ID                                             /
;/ - fid.l       : file object ID                                              /
;/                                                                             /
;/ Result:                                                                     /
;/ - result.l    : -1 if everything went well, 0 otherwise                     /
;/                                                                             /
;/ Bugs: does not work on AfA4.2 and lower                                     /
;/                                                                             /
;///////////////////////////////////////////////////////////////////////////////
Function.l image_WriteDT{fid.l,image.l}
SHARED imagedat()
DEFTYPE.dtWrite DTMW
DEFTYPE.pdtBlitPixelArray DTMB
succ.l=False
If ARGBbitmap_ptr
  *newbm.BitMap = AllocBitMap_(img_width,img_height,24,#BMF_MINPLANES|#BMF_SPECIALFMT|(#PIXFMT_RGB24 LSL #BMB_PIXFMT_SHIFTUP) ,0)
  If *newbm=0 Then error{"\__THIS_FUNCTION: Unable to allocate 24bit Bitmap!"} : Function Return False

  DEFTYPE.RastPort rp
  InitRastPort_ rp
  rpBitMap = *newbm
  ClipBlit_ rastport_ptr,0,0,rp,0,0,img_width,img_height,$c0


  basename.s = "iff"          ;          #DTA_BaseName    ,&basename,@@
  tag5.tag5ti_Tag  = #DTA_SourceType,#DTST_RAM,#DTA_GroupID,#GID_PICTURE,#PDTA_DestMode,#PMODE_V43,#PDTA_BitMap,*newbm,#TAG_DONE,0
  *DTPic._Object = NewDTObjectA_ (0,tag5)

  If *DTPic
    tag5.tag5ti_Tag = #PDTA_BitMapHeader,&*bmhd.BitMapHeader,#TAG_DONE,0
    GetDTAttrsA_ *DTPic,tag5
    If *bmhd
      *bmhdbmh_Width      = img_width
      *bmhdbmh_Height     = img_height
      *bmhdbmh_Depth      = 24
      *bmhdbmh_XAspect    = 22
      *bmhdbmh_YAspect    = 22
      *bmhdbmh_PageWidth  = 1600
      If (*bmhdbmh_Width<=1280) Then *bmhdbmh_PageWidth=1280
      If (*bmhdbmh_Width<=1024) Then *bmhdbmh_PageWidth=1024
      If (*bmhdbmh_Width<= 800) Then *bmhdbmh_PageWidth= 800
      If (*bmhdbmh_Width<= 640) Then *bmhdbmh_PageWidth= 640
      If (*bmhdbmh_Width<= 320) Then *bmhdbmh_PageWidth= 320
      *bmhdbmh_PageHeight = *bmhdbmh_PageWidth * 3 / 4
    Else
       error{"\__THIS_FUNCTION: Unable to get bitmap header!"}
    End If

    ;fh.l = Open_ (&filename.s,#MODE_NEWFILE)
    fh.l = file_GetFH{fid}
    If fh
      DTMWMethodID            = #DTM_WRITE
      DTMWdtw_GInfo           = 0
      DTMWdtw_FileHandle      = fh
      DTMWdtw_Mode            = #DTWM_IFF
      DTMWdtw_AttrList        = 0
      succ = DoDTMethodA_(*DTPic,0,0,DTMW)
      ;succ = DoMethodA(*DTPic,DTMW)
     ; Close_ fh
      If succ=False
        error{"\__THIS_FUNCTION: Unable to write image via "+basename+" datatype!"}
      EndIf
    EndIf

    DisposeDTObject_ *DTPic
  Else
    error{"\__THIS_FUNCTION: Unable to create datatype object out of the bitmap!"}
    FreeBitMap_ *newbm
  EndIf
Else
  error{"\__THIS_FUNCTION: No bitmap!"}
End If
Function Return succ
End Function



--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 06.05.2010 um 11:52 Uhr geändert. ]

[ Dieser Beitrag wurde von Der_Wanderer am 06.05.2010 um 11:56 Uhr geändert. ]

[ Dieser Beitrag wurde von Der_Wanderer am 06.05.2010 um 12:05 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 12:42 Uhr

Thore
Posts: 2266
Nutzer
@Wanderer

Ich sehe Du musstest Dich noch nicht mit Windows APIs rumschlagen. Dagegen ist die AmigaOS API echt niedlich und super zu programmieren.

Einmal was mit MAPI gemacht, und hoffentlich nie wieder... Auch bei Drucker über TerminalSessions wird man zum Hirsch. Von Dienste Programmieren ganz zu schweigen...

Ich hab mal in BASIC Routinen (Laden + Speichern) für BMP, GIF und IFF(ILBM und ACBM) gemacht, und mir sowas für PNG und JPEG schon angesehen.

GIF, BMP, PNG und ILBM sind nicht weiter schwierig zu implementieren (Hierfür braucht man Verständnis für Coder, z.B. LZW und RLE)
Für JPEG musst Du Discrete Consinus-Transformation verwenden, aufgeteilt in kleine Quadrate, ist also komplizierter.

Die Programmiersprachen, die mit einem Befehl (LoadILBM, SaveILBM) sowas machen, müssen sich intern auch um alles kümmern :)

Die Datatypes wandeln intern alles nach IFF um soweit ich das sehe.
Interessant wäre eine Lib, die die Konvertierung von verschiedenen Formaten unterstürzt... :)

[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 13:06 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@Thore:

Du widersprichst dir irgendwie selbst:

> GIF, BMP, PNG und ILBM sind nicht weiter schwierig zu implementieren
> Interessant wäre eine Lib, die die Konvertierung von verschiedenen Formaten unterstürzt...

> Ich hab mal in BASIC Routinen (Laden + Speichern) für BMP, GIF und IFF(ILBM und ACBM) gemacht,
Und genau das ist ja das Problem. Warum hast du das gemacht? Weil AmigaOS dir das nicht bietet.
Also anstatt einmal das gescheit im OS zu haben, gibt es sicherlich hunderte von solchen Implementationen. Das ist quasi kollektive Zeitverschwendung, obwohl ja gerade auf dem Amiga Entwickler-Zeit absolute Mangelware ist. Und das Resultat ist schlechtere Qualität der Software, weil nicht jeder gleich gut Programmieren kann und nicht jeder alle Features der Formate implementiert hat, und verletzt gleichzeitig heftigst Linus' Law.

Ich arbeite auch beruflich unter Windows. Die Win32 API ist in eingen Aspekten besser als die von AmigaOS, aber nicht viel, und in einigen auch schlechter. Sie hat auch das gleiche Problem, vor über 20 Jahren erdacht zu sein und heutige Probleme nicht richtig zu reflektieren.
Aber die benutzt heute fast keiner mehr direkt. Jeder, der einen gewissen Output leisten muss, der benutzt was anderes, z.B. MFCs, die auch schon etwas angegraut sind, oder COM oder was ganz anderes.
Windows ist ja so riessig, da gibt es viele APIs.

Im Vergleich hat der Amiga aber nur eine Low Level API, also quasi nur die Win32. Es wurde nicht wirklich ein neuer Layer draufgesetzt, das macht dann immer jede Programmiersprache oder jeder Programmierer von Grund auf neu. Und das verbrennt massig wertvolle Entwicklerzeit.
Da können auch Addons wie MUI oder Reaction nicht viel ausrichten.

--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 06.05.2010 um 13:11 Uhr geändert. ]

[ Dieser Beitrag wurde von Der_Wanderer am 06.05.2010 um 13:16 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 13:57 Uhr

Thore
Posts: 2266
Nutzer
> Also anstatt einmal das gescheit im OS zu haben, gibt es sicherlich hunderte von solchen Implementationen.

Andere OS haben das auch nicht direkt im System.
Für Win gibt es für jede IDE eigene Routinen, auf Linux greift man gernauf die libxxx.o/so zu.

Ein Widerspruch ist das aber nicht, was ich gesagt hab.
Textausgabe in einer Shell ist auch easy zu machen, trotzdem gibt es Aufrufe die das erledigen. Also nicht widersprüchlich sondern "zusätzlicher Wunsch".

> Im Vergleich hat der Amiga aber nur eine Low Level API, also quasi
> nur die Win32. Es wurde nicht wirklich ein neuer Layer draufgesetzt,
> das macht dann immer jede Programmiersprache oder jeder Programmierer
> von Grund auf neu. Und das verbrennt massig wertvolle Entwicklerzeit.

Wozu denn auch? Ich find die API einfach zu programmieren. Wenn ich "Superfunktionen" will, kann ich mir diese bauen.
Das was auf dem AmigaOS wesentlich mehr Entwicklerzeit braucht, ist eine fehlende IDE. Sich einfach eine GUI hinzuklicken und Events zuzufügen, das ist es doch, was das Programmieren auf Win beschleunigt.

Wenn es denn noch keine ultra converter lib gibt, wieso entwickelt dann nicht jemand diese, dann gäbe es sowas. Genauso für API Wrapper und sonstiges. Sooo notwendig wars wohl dann doch nicht ;)

Wenn ich mal bisschen Zeit übrig hab, kann ich mich mal an einer Converter-Lib machen.

[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 14:32 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@Thore:
> Wozu denn auch? Ich find die API einfach zu programmieren.
Da bist du aber ein wenig "Amiga-Blind". Die API ist alles andere als einfach zu programmieren. Du bist nur bereit, im Falle des Amiga beide Augen zuzudrücken und viel mehr Zeit zu investieren um was ans Laufen zu bekommen.

> Wenn es denn noch keine ultra converter lib gibt, wieso entwickelt
> dann nicht jemand diese, dann gäbe es sowas.
Macht ja jeder im Stillen kämmerlein für sich.
In Amiblitz3 gibt's das auch. Es ist aber kein OS Bestandteil und findet damit keine Akzeptanz. Ist auch nur von mir alleine und deshalb nicht so mächtig wie es sein könnte.
Und vor allem dürfte sowas eben nicht nur OS4-only oder MOS-only sein, sondern müsste alle Platformen unterstützen.

> Sooo notwendig wars wohl dann doch nicht
Doch. Schau dir doch nur mal an, wie schwach Amiga Software im Vergleich ist.
Z.B. im Email Programm, wenn jemand im Urlaub 10 JPEG Bilder anhängt von der Digicam (typischer User-Case), die jeweils 2MB haben, und von der Strandbar aus senden will. Es wäre mit so einer API wie in Amiblitz3 kinderleicht, es anzubieten dass beim Senden das on-the-fly in Monitor-freundlicher Auflösung heruntergerechnet wird und als JPEG gepackt. Das wären dann statt 20MB Email nur 2MB Email, das entscheidet zwischen Go oder No-Go. Non-Amiga Emailer bieten sowas. Bei YAM oder SimpleMail? Fehlanzeige.
Dabei wäre das so einfach:

code:
...
img = image_Load{"T:Attachment.jpg"}
image_Resize{img,800,600,IMG_KEEP_ASPECT|IMG_INTERPOLATION_BILINEAR}
image_Save{"T:Attachment_sized.jpg","JPEG",IMG_COMPRESSION_HIGH}
...


Aber mit AmigaOS Board-Mittel steht man da erstmal wie der Ochs vorm Berg und müsste sich erstmal die Finger wund tippen, also macht es keiner.

> Wenn ich "Superfunktionen" will, kann ich mir diese bauen.
Das ist schon die falsche Haltung. Auf dem Amiga vielleicht Superfunktionen, auf anderen OS ist das normal. Und selbser bauen ist immer schlecht, da Fehleranfällig, ungetestet und die Entwicklung wird um ein vielfaches verlangsamt.


--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 06.05.2010 um 14:34 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 14:40 Uhr

Thore
Posts: 2266
Nutzer
> Die API ist alles andere als einfach zu programmieren.
Wenn man von Blitz auf C++ wechselt, hat man sicher diese Ansicht.
Wer von Assembler auf C++ wechselt, hat eine andere Ansicht.
Wer von Windows auf Amiga wechselt, denkt auch, es ist einfacher.

> Auf dem Amiga vielleicht Superfunktionen, auf anderen OS ist das normal
Super im Sinne von "Übergestellt" nicht im Sinne von "Großartig" :)

Anders gesagt: Es liegt im Auge des Betrachters. Einige Win-API sachen sind auch einfach, aber andere schwierig.
Es gibt aber sicher win User die sagen, das sei einfach (Außer MAPI, da checken auch die von M$ nicht mehr durch!)

Also, hier haben wir einen Programmierer. Da haben wir ein Problem (fehlende converter-Lib als Beispiel). Und was ist das Resultat? Beschwerde statt handeln. Und genau DAS ist der Stillstand. Immer andere machen lassen.
Wozu seid ihr denn Programmierer? Also ran an den Speck.

Nicht beschweren sondern einfach MACHEN.

[ Dieser Beitrag wurde von Thore am 06.05.2010 um 14:43 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 14:51 Uhr

Der_Wanderer
Posts: 1229
Nutzer
> Wenn man von Blitz auf C++ wechselt, hat man sicher diese Ansicht.
Vergiss nicht, dass die moderne Runtime von Blitz von mir ist. Ich habe also die ganze "dirty work" selbst gemacht. So gesehen ist mein Blickwinkel eher der des C Programmierers. Und Leute die meine API ablehnen (gibts auch), die machen in Amiblitz genau das gleiche wie in C, nur etwas anders dekoriert.

Einfach drauf los machen hat keinen Sinn, hat keinen Mehrwert und ist ein Kampf gegen Windmühlen. Das scheinst du nicht zu verstehen. Es kommt auf die Organisation an.

Einfach und mächtig sind auch zwei verschiedene Paar Schuhe.

Eine API kann einfach aber schwach sein. Sie ist idealer weise einfach und mächtig. Sie kann im schlimmsten Fall aber auch schwierig und schwach sein. Oder aber auch schwierig und mächtig.


--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 06.05.2010 um 14:52 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 15:09 Uhr

Thore
Posts: 2266
Nutzer
Ich glaube wir reden aneinander vorbei.
Im Grunde teile ich ja deine Meinung mit einfacheren Wrappern/Supermethoden/-funktionen für API Calls, finde aber es nicht schwierig, die API direkt zu nutzen.
Nicht gegensätzlich sondern zusätzlich.

Daß Du diese Funktionen gemacht hast, ist lobenswert, und sie werden sicher auch benutzt. Und genau das ist es doch was ich meinte. Nicht beschweren sondern was machen.
Du hast es doch selbst gezeigt mit deinen Routinen.

Im Grunde wollen wir beide das gleiche.

Um wieder bei dem Beispiel Converter-Lib zu bleiben. Wenn es denn keiner macht, dann wird sie auch nicht benutzt.
Eben weil es sie nicht gibt, macht jeder sein eigenes. Anstatt daß jemand sich dem (überschaubaren) Projekt annimmt.
Wegdiskutieren kann mans nicht :)

Ich hab auch nicht von "einfach drauf los", "einfache API ist mächtiger/nicht so mächtig" etc gesprochen, das kam alles aus Deinem Munde, äh Deiner Feder :)

Also um wieder sachlicher zu werden.
Was würdest Du denn von sowas wie einer converter-Lib halten?

[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 15:44 Uhr

Der_Wanderer
Posts: 1229
Nutzer
So eine Lib alleine bringt noch nicht viel.
Das ganze muss eingebettet sein in eine grosse Runtime, die alle Teile des Betriebssystems behandelt.

File Formate konvertieren ist ja eine sehr spezielle Anwendung.

Man bräuchte eine Lib, die Bilder lädt, anzeigt, manipuliert und speichert. Dann kann man auch konvertieren, aber auch alles andere damit tun.
Aber auch das reicht nicht.
Diese Lib muss wiederum vom GUI Toolkit benutzt werden usw.

Deshalb geht das nur, wenn es als Teil des OS angesehen wird.
Wie gesagt, was ich hier gepostet habe ist ja real existierender Code der Amiblitz API. nur ist das auf die kleine, überschaubare Amiblitz Welt begrenzt. Und hätte ich das nicht gemacht, müsste auch in Amiblitz sich jeder noch mti Datatypes rumschlagen und seinen eigenen Saver programmieren.
So eine API ist aber der Schlüssel dazu, robuste und mächtige Apps in vertretbarer Zeit implementieren zu können.
Schau dir z.B. meine Fusszeile an. Alle diese Programme benutzen die gleiche API zum Laden von Sounds (HD-Rec, Sweeper, Samplemanager, ArTKanoid, Asteroids, TKPlayer, etc. etc). Wenn ich jetzt zufällig nicht die gleiche Person wäre, dann hätte ich für alle diese Programme meinen eigenen AHI Code, meine eigenen Lade und Speicher Routinen für Sounds implementieren müssen. Da wäre nicht mal 1/4 der Soft herumgekommen, und es hat über 10 Jahre gedauert bis das ganze auf allen Plattformen robust gelaufen ist.

Also was eigentlich passieren müsste, wenn Amiga+Freunde noch irgendwie Chancen auf Wachstum haben will:
- AROS, MOS, OS4 Leute müssten sich an einen Tisch setzen (ich weiss, schon mal unrealistisch)
- Es müsste eine gemeinsame API entwickelt werden, auf einem Niveau wie oben besprochen. Die kann ja durchaus auf der vorhandenen AmigaOS API fussen.
- Die API muss auf allen Plattformen auf der gleichen Code-Base basieren, sodass alle das gleiche vor sich haben. Z.b. die OS3.x API ist grundsätzlich mal in OS3/4 und MOS enthalten, verhält sich in Details aber doch anders.
- Die API muss Bestandteil des OS sein. Auch für OS3 muss es zugänglich gemacht werden, da hier de facto immer noch ein grosser Teil der Entwicklung passiert.
- Enthalten sein muss Bilder, Sounds, Videos, Musik Streams, Netzwerk+Internet, GUI Toolkit + Builder, File I/O etc., was zu einem OS gehört. Dazu natürlich SDK mit Doku.

Das kann natürlich niemand alleine tun.

--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 15:56 Uhr

Thore
Posts: 2266
Nutzer
Öhm, wieso?
Das macht keiner so :) Unter Linux sind das im Grunde nur Libs, die benutzt werden, unter Win wird das teilweise sehr unterschiedlich gemacht (VCL, CLX, WinAPI, ....)
Wieso muss das System es auch so machen? Es benutzt ja schon die Datatypes bzw Reggae. Übrigens auch Libs...

Wieso muss es da ein einheitlicher Standard geben, der über allem steht?
Warum nicht einfach eine Lib, die konvertieren kann?
Vereinfachte API Calls würden sowieso intern das gleiche machen wie vorher, nur daß der Aufruf anders ist.

> Alle diese Programme benutzen die gleiche API zum Laden von Sounds...
Gut, und wo ist das SDK? :)

[ Dieser Beitrag wurde von Thore am 06.05.2010 um 16:00 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.05.2010, 16:13 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@Thore:
> Öhm, wieso?
Weil sonst niemand richtig Software entwicklen kann/will auf dem Amiga.

> Das macht keiner so
Doch, schau mal genauer hin.

Android zum Beispiel. Das ist eigentlich ein Linux, hat aber genau so eine API aufgestülpt bekommen. Du kannst immer noch Linux programmieren, macht aber (fast) keiner. Alle benutzen die Android API, die sich ungefähr auf dem Level bewegt wie ich oben beschrieben habe.

MFCs zum Beispiel. Zugegeben, ein etwas älterer Ansatz, nur 15 Jahre alt statt 25. Es stülpt der Win32 API eine OOP API über. Damit hat man immerhin in etwa einen Code Aufwand von 1:4, d.h. vier Zeilen Win32 macht ein MFC Aufruf (kann man natürlich nicht 1:1 aufrechen, hängt davon ab was man macht).

Die grossen OSe sind natürlich gross genug, dass es nicht nur einen solchen Ansatz gibt. Aber vergleiche mal die Linux Distributionen, das ist jeweils eine solche Idee.

Natürlich gibt es friendliche Co-Existenzen mit 3rd Party Libraries, aber das ist eben was anderes und sollte jeweils nur eine Nische füllen, keine Grundlegenden Aufgaben erledigen. Die Lebensdauer von 3rd Party Libs ist auch meistens sehr begrenzt. Die meisten sind mittlerweile verwaist. Möchte man darauf aufbauen?

Wenn ich jetzt so eine Converter Lib machen würde (wäre kein grosser Act mit Amiblitz), wer würde das benutzen? Keiner vermutlich. Es würden trotzdem alle mit Datatypes rumfrickeln und die gleichen Probleme lösen, die ich schon teuer erkauft gelöst habe.

> Warum nicht einfach eine Lib, die konvertieren kann?
Weil das nur ganz wenige brauchen.
Die Macht kommt erst, wenn verschiedene Themen anfangen zusammenzuarbeiten. Also wenn ich ein GUI Toolkit habe, was die Bilder damit lädt. Wenn ich aus einem Video einen Frame als Image Objekt abholen kann und mit der Library speichern.

Einzelne Libraries bilden nur eine Summe, also der Nutzen steigt additiv. Eine ganze OS API aus einer Hand, die sich untereinander kennen, ergibt das Produkt, also multiplikativ.

Es muss auch als einheitliches SDK kommen. Wenn man sich sein Set an Libs zusammensuchen muss, aus mehr oder weniger vertrauenswürdigen einzel Libs, dann harmoniert das nicht und die reibungsverluste resultieren in schlechter Qualität der Soft oder mehr Aufwand.

--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 06.05.2010 um 16:16 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]


1 -2- 3 4 5 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > C oder C++? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.