Thread View: maus.lang.c
5 messages
5 total messages
Started by Dominik Deobald
Thu, 07 Sep 1995 11:29
PutPixel
Author: Dominik Deobald
Date: Thu, 07 Sep 1995 11:29
Date: Thu, 07 Sep 1995 11:29
34 lines
1819 bytes
1819 bytes
Hi...
Ich suche die schnellste Moeglichkeit in Turbo C++ 3.0 mit einer
aufzurufenden Funktion einen Punkt auf den Bildschirm zu bringen.
(VGA-Modus 13h, also 320x200x256)
Diese darf auch gerne Inline-ASM benutzen. Sie sollte nur schneller sein
als alle anderen.
a) Bitte keine Mails, dass ich im falschen Brett bin (PC, ANSI, ...)
b) Antworten bitte als PM. Falls es gewuenscht wird, kann ich da dann das
entgueltige Ergebnis bekanntgeben, also welche Routine die schnellste
ist.
Die schnellste, die ich bisher habe ist die folgende:
char *ScreenAddr = (char*)0xA0000000;
// Schreibt einen Punkt der Farbe 'color' an die stelle 'x/y'
void drawxy(int x,int y,char color)
{
*(ScreenAddr+320*y+x) = color;
}
Mein erster Versuch in ASM war langsamer als das.
Oder hat vielleicht jemand die Sources zu einer kompletten Grafik-
Funktionsbibliothek mit Linien, Kreisen, ... ? Auch haben woll ;)
CiAo... BLACK MAGiCiAN SNAiL-MAiL: DoMiNiK DEoBALD
MAGiC PoWER-WARE!
Jeder will in den Himmel, aber keiner will sterben DiAKoNiSSENSTR. 1O
67346 SPEYER
Re: PutPixel
Author: Herman Dullink
Date: Mon, 11 Sep 1995 09:49
Date: Mon, 11 Sep 1995 09:49
36 lines
1677 bytes
1677 bytes
>Hi...
Ah, an English word, too bad the rest aren't...
>Ich suche die schnellste Moeglichkeit in Turbo C++ 3.0 mit einer
>aufzurufenden Funktion einen Punkt auf den Bildschirm zu bringen.
Most overhead is the call to the plot routines. To really speed things
up, you should use a macro (#define) instead of a function.
>(VGA-Modus 13h, also 320x200x256)
>Diese darf auch gerne Inline-ASM benutzen. Sie sollte nur schneller sein
>als alle anderen.
A putpixel routine is sooo simple, inline assembly won't do much good.
All you can do is a faster 'multiply'.
>char *ScreenAddr = (char*)0xA0000000;
>
>void drawxy(int x,int y,char color)
>{
> *(ScreenAddr+320*y+x) = color;
>}
320*y = (y << 8) + (y << 6) =>
{
*(ScreenAddr+(y << 8) + (y << 6) + x) = color;
}
or better
#define drawxy(x,y,c) {*(ScreenAddr + (y << 8) + (y << 6) + x) = color;}
Of course, with multiple pixel primitives (lines, circles, polygons) inline
assembly _can_ make a difference.
Another tip; NEVER user the drawxy primitive to draw lines, circles, etc..
Herman
Re: PutPixel
Author: Lars Troen
Date: Mon, 11 Sep 1995 13:20
Date: Mon, 11 Sep 1995 13:20
35 lines
1815 bytes
1815 bytes
Dominik Deobald (MAGICIAN@m-night.domino.de) wrote:
: Hi...
: Ich suche die schnellste Moeglichkeit in Turbo C++ 3.0 mit einer
: aufzurufenden Funktion einen Punkt auf den Bildschirm zu bringen.
: (VGA-Modus 13h, also 320x200x256)
: Diese darf auch gerne Inline-ASM benutzen. Sie sollte nur schneller sein
: als alle anderen.
: a) Bitte keine Mails, dass ich im falschen Brett bin (PC, ANSI, ...)
: b) Antworten bitte als PM. Falls es gewuenscht wird, kann ich da dann das
: entgueltige Ergebnis bekanntgeben, also welche Routine die schnellste
: ist.
: Die schnellste, die ich bisher habe ist die folgende:
: char *ScreenAddr = (char*)0xA0000000;
: // Schreibt einen Punkt der Farbe 'color' an die stelle 'x/y'
: void drawxy(int x,int y,char color)
: {
: *(ScreenAddr+320*y+x) = color;
Es ist schneller mit
*(ScreenAddr+y<<8+y<<6+x) = color;
: }
--
(***************************************************************************)
(* Lars Trøen på Høgskolen i Sør-Trøndelag *)
(* "The key, the whole key, and nothing but the key. So help me Codd." *)
(* Who is General Failure and why is he reading my C: drive? *)
(***************************************************************************)
Re: PutPixel
Author: Hans Insulander
Date: Fri, 15 Sep 1995 10:19
Date: Fri, 15 Sep 1995 10:19
30 lines
1354 bytes
1354 bytes
larstr@stud.idb.hist.no (Lars Troen) wrote:
>Dominik Deobald (MAGICIAN@m-night.domino.de) wrote:
[snap, snap]
>: Die schnellste, die ich bisher habe ist die folgende:
>
>: char *ScreenAddr = (char*)0xA0000000;
>
>: // Schreibt einen Punkt der Farbe 'color' an die stelle 'x/y'
>: void drawxy(int x,int y,char color)
>: {
>: *(ScreenAddr+320*y+x) = color;
>
>Es ist schneller mit
> *(ScreenAddr+y<<8+y<<6+x) = color;
>: }
>
Don't be so sure about that... Depends on your compiler! some compilers
(bc4.5, watcom 10.5) will use the lea instruction. i.e.
mov eax,y
mov ebx,x
lea eax,[eax*4+eax] ; eax=y*5
mov cl,color
shl eax,6 ; eax=y*5*64=y*320
mov [0A0000h+eax+ebx],cl ; For Watcom. Use a seg for realmode.
which is much faster than shifting!
/H.
Re: PutPixel
Author: Geert Jansen
Date: Tue, 26 Sep 1995 07:40
Date: Tue, 26 Sep 1995 07:40
37 lines
1916 bytes
1916 bytes
Dominik Deobald (MAGICIAN@m-night.domino.de) wrote:
: Hi...
: Ich suche die schnellste Moeglichkeit in Turbo C++ 3.0 mit einer
: aufzurufenden Funktion einen Punkt auf den Bildschirm zu bringen.
: (VGA-Modus 13h, also 320x200x256)
: Diese darf auch gerne Inline-ASM benutzen. Sie sollte nur schneller sein
: als alle anderen.
: a) Bitte keine Mails, dass ich im falschen Brett bin (PC, ANSI, ...)
: b) Antworten bitte als PM. Falls es gewuenscht wird, kann ich da dann das
: entgueltige Ergebnis bekanntgeben, also welche Routine die schnellste
: ist.
: Die schnellste, die ich bisher habe ist die folgende:
: char *ScreenAddr = (char*)0xA0000000;
: // Schreibt einen Punkt der Farbe 'color' an die stelle 'x/y'
: void drawxy(int x,int y,char color)
: {
: *(ScreenAddr+320*y+x) = color;
: }
: Mein erster Versuch in ASM war langsamer als das.
: Oder hat vielleicht jemand die Sources zu einer kompletten Grafik-
: Funktionsbibliothek mit Linien, Kreisen, ... ? Auch haben woll ;)
: CiAo... BLACK MAGiCiAN SNAiL-MAiL: DoMiNiK DEoBALD
: MAGiC PoWER-WARE!
: Jeder will in den Himmel, aber keiner will sterben DiAKoNiSSENSTR. 1O
: 67346 SPEYER
BITTE talk english!
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads