programmation graphique 800*600 - ASM - Programmation
Marsh Posté le 26-05-2004 à 00:08:34
tu est sûr que c'est pas ta mesure temporelle qui est foireuse ?
avec quoi tu mesures ?
Marsh Posté le 26-05-2004 à 00:52:04
Merci pour les reponses
En fait j'utilisais la fonction time pour obtenir l'heure je crois (j'avais deja été obligé de compter les images dans un autre prog et j'ai fait un copier coller). j'ai essayer en enlevant le décompte des secondes et en remplaçant :
mov al,1
par:
mov al,couleur
et en augmentant couleur à chaque boucle
C'est peut-etre un peu plus rapide mais j'ai (presque, il ne faut pas exagérer) le temps de compter les 256 ecrans qui s'affichent...
Marsh Posté le 26-05-2004 à 01:00:42
bah moi ce que je te propose, c'est de faire 1000 remplissage du buffer vidéo, et de diviser ce qui a été mesuré par 1000, parceque ton aproche par time elle bancale.
Marsh Posté le 26-05-2004 à 01:12:24
Le prog met environ 1 min 17 sec pour afficher 1000 images
ca fait environ 13 images/sec. C'est pas très précis comme mesure mais ca suffit pour voir la lenteur. Il n'y avait que la fonction qui tournait en boucle, j'ai chronométré à la main...
Calculer avec time me faisait surement perdre un peu de tps...
Marsh Posté le 26-05-2004 à 02:18:58
non, mais c'est très très bizarre.
que l'affichage "banked" soit très sensiblement plus lent que le "linear", je veux bien, mais aussi lent y'a une couille dans le potage
t'es sûr que tu attends pas le retour balayage ou autre glissade ?
Marsh Posté le 26-05-2004 à 02:25:34
t'as fait des tests avec les outils fournis avec univbe de SciTech ? (merde la version gratos est pu dispo )
Marsh Posté le 26-05-2004 à 13:38:53
bah c'était un soft qui permettait d'obtenir les extensions bios vesa 2.0 pour les cartes qui n'en avaient pas. (soft très interressant lors de l'age d'or des jeux dos svga)
si tu veux je t'envoyes les parties gratuites...
accessoirement Scitech participe au dev d'OpenWatcom... (la version OpenSource du compilateur utilisé lors de l'age d'or des jeux dos ceci expliquant cela)
Marsh Posté le 26-05-2004 à 17:18:13
J'ai trouvé la version 6.53 (sdd653.exe) si tu peux m'eclairer sur le fonctionnement ça serait cool
Merci
Chep
Marsh Posté le 26-05-2004 à 18:27:58
Tu es sous quel OS ?
Tu es sous le vrai DOS ou dans une boite d'émulation sous un OS 32 bits ?
Marsh Posté le 26-05-2004 à 20:06:47
ptitchep a écrit : J'ai trouvé la version 6.53 (sdd653.exe) si tu peux m'eclairer sur le fonctionnement ça serait cool |
t'as un truc dedans qui s'appelles VBETEST.
si en 800x600x8, il débite plus d'images que toi en "banked" c'est qu'il y a un beans dans ton code (je dirai ptet à l'extérieur du code asm), sinon bah y'a un blem ailleurs.
Marsh Posté le 26-05-2004 à 20:35:50
Ok j'ai fait le test, il m'affiche 60 fps. j'en suis loin...
Je suis sous windows 98 j'ai essayer de démarrer le pc sous dos et... c'est encore plus lent! J'y comprend rien!
Marsh Posté le 26-05-2004 à 20:43:22
bah pause un arrêt sur le 'jb', et regarde si DX est pas corrompu par l'appel du bios.
Marsh Posté le 31-05-2004 à 12:57:45
J'ai vraiment perdu la main en assembleur, c'est quoi ces lignes : ( je parrie que c'est ça qui prend le plus de temps )
mov ax,4f05h
xor bx,bx
int 10h
Marsh Posté le 31-05-2004 à 13:25:49
Kristoph a écrit : J'ai vraiment perdu la main en assembleur, c'est quoi ces lignes : ( je parrie que c'est ça qui prend le plus de temps ) |
Ca appelle la fonction du BIOS qui réalise le bankswitching, qui prend en argument :
bx = 0 (toujours)
dx = n° de la banque
Marsh Posté le 31-05-2004 à 13:38:00
Bah voila le problème, il vaut largement mieux passer en mode protegé et utiliser un framebuffer complet mappé en mémoire que de passer par le bankswitching
Marsh Posté le 31-05-2004 à 13:42:46
Oui, mais il y aura forcément du bankswitching à faire, que ce soit par le BIOS ou à la main, vu que la VRAM en 13h fait 64000 octets, alors qu'il a besoin de 480000 octets.
Marsh Posté le 31-05-2004 à 14:00:30
Il faut voir que depuis le 386, on peut faire du mode 32bits ce qui a l'énorme avantage de ne plus nécessité de faire du bankswitching et par la même améliore énormément les perfs.
Citation : (Version 2.0 of the VESA video standard) covers extra features like protected mode, flat memory video space (no banks), etc. |
Marsh Posté le 31-05-2004 à 14:08:39
Kristoph a écrit : Il faut voir que depuis le 386, on peut faire du mode 32bits ce qui a l'énorme avantage de ne plus nécessité de faire du bankswitching et par la même améliore énormément les perfs.
|
Effectivement, j'avais oublié que VESA 2.0 permettait de faire du flat
Marsh Posté le 31-05-2004 à 14:16:20
ptitchep >> essaie de réécrire ton programme avec VBE 2.0 pour voir si tu gagnes en perfs :
http://www.geocities.com/SiliconVa [...] /vesa.html
Marsh Posté le 01-06-2004 à 21:06:38
J'ai récupéré masm32 et j'ai remplacé stosb par stosd et je gagne un peu de temps. Expliquez moi comment passer en mode protégé pour avoir un buffer de 480000 octets parce que même en compilant en 32 bits mes segments sont limités à 64Ko
Merci bcp
Chep
Marsh Posté le 01-06-2004 à 21:08:44
tu télécharges DJGPP ou OpenWatcom, et tu compiles avec un Dos Extender comme DOS4G(W), PMODE(/W), ou CWSDPMI. y'en a d'autres mais c'est les plus connus/stables. (petite préférence pour PMODE)
Marsh Posté le 01-06-2004 à 21:15:50
J'ai l'impression que l'installation de djgpp n'est pas très simple... je vais voir pour openwatcom...
Marsh Posté le 01-06-2004 à 21:22:54
open watcom est 100 fois plus simple à installer
pour compiler un programme DOS avec le dos4gw : wcl386 /l=dos4g tonprog.c
Marsh Posté le 01-06-2004 à 21:26:33
Je suis en train de chercher open watcom mais j'ai l'impression qu'il est long a télécharger avec un 56k...
Marsh Posté le 01-06-2004 à 21:38:31
ptitchep a écrit : Pouvez vous me dire ou le télécharger gratuitement? |
euh, hein !
c'est un projet Open Source
Marsh Posté le 01-06-2004 à 21:44:05
ok j'ai rien dit c'est que je suis tombé sur open watcom donnation 25$ et quelque... j'ai téléchargé la source depuis le site, 43 Mo... J'en ai pour un bon mois...
Marsh Posté le 02-06-2004 à 00:24:33
Les sources d'Open Watcom, ça se compile pas avec... Open Watcom ?
Marsh Posté le 02-06-2004 à 15:01:56
Le problème de faire des appels de puis le mode réel aux fonctions VBE2, c'est que le proc doit passer en mode protégé, faire le traîtement VBE2 puis repasser en mode réel.
Donc l'idéal, tout le monde l'a dit, programmer directement en mode protégé.
Marsh Posté le 02-06-2004 à 15:06:07
+1
L'idéal c'est d'utiliser OpenGL ou DirectX ou tout autre lib moderne sur un OS moderne.
C'est très simple :
- mode réel = segments de 64Ko max. Faut se prendre la tête pour manipuler des buffers plus gros, tout ça avec des performances médiocres (adressage 16 bits).
- 800*600 = 480 000. Si tu es en 16 bits, ça fait pas loin de 1Mo de mémoire à adresser depuis un OS qui en offre...640Ko. En 32 bits, tu as plus de mémoire à adresser que le processeur (en mode réel) ne te le permet.
Et tout ça sans bénéficier de la moindre capacité d'accélération des cartes graphiques. Rien que dessiner une ligne c'est la merde.
Marsh Posté le 02-06-2004 à 18:22:15
+1
Réel = prise de tête sauf pour faire du boot
Protégé = royal !
Marsh Posté le 15-06-2004 à 13:13:38
J'ai (enfin) téléchargé open watcom mais je n'arrive pas a integrer de l'assembleur dans mon code c++:
asm
{
mov ax,12
}
Il me trouve une erreur sur la ligne de l'accolade ouvrante...
Error!E121:col(4) syntax error
.......
Chep
Marsh Posté le 15-06-2004 à 13:19:38
L'assebmeur inline dans du code C ou C++ ne fait parti d'aucune norme existante. Chaque compilateur fait comme il veut. Il faudra donc que tu cherches dans la doc de open watcom pour ça.
PS : en mode protege 32bit, il est de bon ton d'utiliser EAX à la place de AX
Marsh Posté le 15-06-2004 à 14:13:51
avec OpenWatcom, l'asm il vaux mieux l'utiliser comme ça:
Code :
|
Marsh Posté le 25-05-2004 à 23:25:19
Bonjour
Je programme en mode 13h et j'aimerais bien passer à une résolution supérieur. j'ai regardé un peu partout à propos des modes VESA et j'ai pas trouvé grand chose (en plus j'ai un peu de mal avec l'anglais dès que les termes deviennent compliqués).
J'ai essayé de faire un prog simple (juste pour essayer) qui se contente de remplir la mémoire ecran pour afficher un ecran bleu uni:
(le mode 800*600*8 a été initialisé avant)
push es
mov ax,0a000h
mov es,ax
xor dx,dx
boucle:
mov ax,4f05h
xor bx,bx
int 10h
xor di,di
mov al,1
mov cx,0ffffh
rep stosb
inc dx
cmp dx,8
jb boucle
pop es
Je n'ai pas réussi à le réduire plus et pourtant lorsque je l'execute en boucle et que je comptabilise les images par seconde (en ajoutant un peu de c++) je me retrouve avec environ 10 images par seconde. c'est un peu faible non?
Si quelqu'un a une solution...
Merci
Chep