Q1: Как в *BSD зажечь фреймбуффер?
В линуксе, например, это делается не просто, а очень просто:
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <linux/input.h>
struct fb_var_screeninfo vinfo;
int main()
{
int fd, fbsize, i, j;
int * fbbuf;
// открываем фреймбуффер
if((fd = open("/dev/fb0", O_RDWR)) < 0) exit(1);
// получаем параметры
if(ioctl(fd, FBIOGET_VSCREENINFO, &vinfo))
{
printf("Bad vscreeninfo ioctl\n");
exit(2);
}
// определяем размер фреймбуффера = (разрешение по X * разрешение по Y * байты на пиксель)
fbsize = vinfo.xres*vinfo.yres*(vinfo.bits_per_pixel/8);
// mmap-им
if((fbbuf = mmap(NULL, fbsize, PROT_WRITE, MAP_SHARED, fd, 0)) == (void *) -1) exit(3);
// 60 раз забиваем фреймбуффер цветом 0xff004882, чтобы определить FPS
for(j = 0; j < 60; j++)
{
for(i = 0; i < vinfo.xres*vinfo.yres; i++) fbbuf[i] = 0xff004882;
}
// освобождаем ресурсы
munmap(fbbuf, fbsize);
close(fd);
return 0;
}
Конкретно сейчас на моем лаптопе стоит фряшка, но я ставил и нетку и опен BSD, там такая же проблема.
А проблема такая:
- девайса /dev/fb0 просто нет (как сделать что бы был?)
- хидера <linux/fb.h> тоже нет, поиск по фразе "fb_var_screeninfo" ничего конструктивного не дал (какой хидер юзать?)
- warning: implicit declaration of function 'ioctl' is invalid in C99 (что то не пойму, в *BSD нет сискола 'ioctl' что ли?)
Или кодинг под *BSD абсолютно отличается от линукса (маловероятно) или что то не так. А что именно, как это вылечить?
Q2: Почему один и тот же бинарник (код см. выше) на разных компах, с одной и той же осью, исполняется по разному?
А именно:
- имеется десктоп i5 + 8GB RAM + встроенная в проц интеловская видяха (другой видяхи нет, FarCry3 запускается и вполне играбелен на средних настройках), в общем компу год и он достаточно наворочен.
Так вот на этом навороченном компе, вышеуказанный бинарник исполняется следующим образом:
Код: Выделить всё
$ time ./main
real 0m6.973s
user 0m6.968s
sys 0m0.000s
Т.е. FPS = 60 / 6.973 = 8.6
Это жуткое тупление.
- имеется лаптоп, старый, ~8 летний Asus с мобильным радеоном HD2400, полагаю, что FarCry3 на нем даже не запуститься, даже FarCry2 идет с такими тормазами, что об игре не может быть и речи.
Так вот на этом древнем лаптопе тот же самый бинарник просто летает:
Код: Выделить всё
$ time ./main
real 0.211s
Считаем FPS = 60 / 0.211 = 284.36
Как такое может быть?
Ось одна и та же, в буквальном смысле, я юзаю форк от Slackware, а именно Porteus, он грузится с флешки, т.е. отличия по составу софта, драйверам или настройкам абсолютно исключены.
Вся разница только в железе, это я понимаю, но не пойму как это вылечить.
Это точно можно вылечить, например при запуске wayland/weston с fbdev-backend.so, никакого тупления нет, все летает на обоих компах.