Войти
ПроектыФорумУтилиты

Движок 'Сухарь Ванильный' (61 стр)

Страницы: 157 58 59 60 61 62 Следующая »
#900
10:47, 19 сен. 2013

sb3d
Обычно шейдеров не так много и код у них достаточно тривиальный, переписать их будет не сложно.
Последний раз, когда играл в подземный проход тормоза были ощутимы, хотя тогда и комп слабенький у меня был.
Имхо стоит попробовать с шейдерами сделать (просто ради интереса), а если не понравится, то всегда сможешь вернуться к софтрендеру.


#901
19:05, 19 сен. 2013

Так, всё, история завершилась успешно. Движок теперь официально записываю в кроссплатформенные. Успешно скомпилировал и тестировал под Убунту 12.04 нативную версию. Она опережает виндовую wine-версию раза в 2 по скорости, видимо, вайн не очень шустрый. С другой стороны, sdl2 версия под винду отстаёт от winapi версии под ту же винду раза в два. :)

Что радует: движок сравнительно легко переписать под любое апи, потому что это было предусмотрено при его проектировке: все контакты с внешним апи вынесены в отдельный микрофайл в 14 килобайт. Его я и переписывал эти два дня.

Формально, мне доступны теперь все платформы, которые поддерживает sdl2. Ок, ну, может, не все, но больше одной точно. Ура же? :)

---

nes
> Последний раз, когда играл в подземный проход тормоза были ощутимы, хотя тогда
> и комп слабенький у меня был.
Там был не этот движок, а прошлый. Ну, он тормозил заметно сильнее, по тестам новый его раза в 2-8 обходит.

#902
22:07, 19 сен. 2013

sb3d
> С другой стороны, sdl2 версия под винду отстаёт от winapi версии под ту же
> винду раза в два. :)
Либо копирование в SDLSurface реализовано криво, либо когда вы использовали WinAPI у вас таки было аппаратное ускорение.

И да, только я один после заявления "кроссплатформенный движок" не вижу ни одной ссылки?

#903
22:53, 19 сен. 2013

sb3d
> Ура же?
ура. следующий макос

#904
7:25, 20 сен. 2013

RPG
> И да, только я один после заявления "кроссплатформенный движок" не вижу ни
> одной ссылки?
Извини, я ж вроде как для себя пишу. В нуль-посте это ясно обозначил.
Или тебя интересует просто тест под линь? Я подумал, что мало кому будет интересно сдл2 ставить, чтобы мою поделку тестировать.

RPG
> Либо копирование в SDLSurface реализовано криво, либо когда вы использовали
> WinAPI у вас таки было аппаратное ускорение.
Угу, ты прав, там только это и может тормозить. Потому что других затратных операций нет. Вот, как я копирую пиксели в окно.

SDL_UpdateTexture(texture,0,ScreenH,xsiz*4);     // copy rusk texture to sdl texture
SDL_RenderCopy(renderer,texture,0,0);            // 
SDL_UpdateWindowSurface(window);                 // update sdl window
В *ScreenH лежит мой массив точек, соответственно.

Способа проще не нашёл. Может быть, кто-нибудь подскажет? Задача: есть а) массив пикселей, б) есть sdl2 окно. Как переслать пиксели в окно?

beejah
> ура. следующий макос
Тут проблема в том, что у меня нет компа с макосью. Что раньше появится у меня из техники, андроид, макос, под то и попробую собрать.

#905
8:12, 20 сен. 2013

sb3d
> Задача: есть а) массив пикселей, б) есть sdl2 окно. Как переслать пиксели в окно?
Быстрее всего будет асинхронная передача. Пока софтварный движок обсчитывает данные для следущего кадра, пересылать текущий кадр по dma в видеопамять.
Об этом здесь можно почитать: http://www.songho.ca/opengl/gl_pbo.html#unpack

#906
9:16, 20 сен. 2013

sb3d
>Тут проблема в том, что у меня нет компа с макосью. Что раньше появится у меня из техники, андроид, макос, под то и попробую собрать.
Купи Mac Mini, он не сильно дорогой, или найди товарища-макосника, который поможет портировать.
У самого был мак бук и месяца три назад отдал начальнику со старой работы, а так помог бы и на мак ось портировать и на IOS.

#907
23:06, 20 сен. 2013

sb3d
> Или тебя интересует просто тест под линь? Я подумал, что мало кому будет
> интересно сдл2 ставить, чтобы мою поделку тестировать.
Да вообще-то он уже у всех стоит, в линуксах как бы само всё обновляется.

[A][R][T]
> Быстрее всего будет асинхронная передача. Пока софтварный движок обсчитывает
> данные для следущего кадра, пересылать текущий кадр по dma в видеопамять.
> Об этом здесь можно почитать: http://www.songho.ca/opengl/gl_pbo.html#unpack
Это не тот случай. Однозначно конечно надо сделать двойной буфер, но я также полагаю следует включить в SDL аппаратное ускорение и рисовать не в char*, а сразу в SDL Surface. Кроме того вполне стоит попробовать функции композита из самого SDL.

#908
23:46, 20 сен. 2013

Вот такая организация рендера достаточно быстрая:

#include "SDL/SDL.h"
#include <iostream>

using namespace std;

typedef struct xor_state {
  uint32_t x;
  uint32_t y;
  uint32_t z;
  uint32_t w;
  uint32_t v;
  uint32_t d;
} xor_state;

static xor_state _xor_ = {123456789, 362436069, 521288629, 88675123, 5783321, 6615241};


static inline uint32_t random_get_seed()
{
  return _xor_.x;
}

static inline uint32_t rand128()
{
  uint32_t t;
  t = _xor_.x ^ (_xor_.x << 11);
  _xor_.x = _xor_.y;
  _xor_.y = _xor_.z;
  _xor_.z = _xor_.w;
  return _xor_.w = _xor_.w ^ (_xor_.w >> 19) ^ (t ^ (t >> 8));
}

void quit_with_error(string fun) {
  SDL_Quit();
  cerr << "ERROR: " << fun << ": " << SDL_GetError() << endl;
  exit(EXIT_FAILURE);
}

int main(int argc, char* args[]) {
  if(3 != argc) {
    cout << "Usage: bench_cpp [WIDTH] [HEIGHT]" << endl;
    exit(EXIT_SUCCESS);
  }

  int width  = atoi(args[1]);
  int height = atoi(args[2]);

  if(0 != SDL_Init(SDL_INIT_EVERYTHING)) {
    quit_with_error("SDL_Init");
  }

  SDL_Surface *surface = SDL_SetVideoMode(width, height, 32, SDL_HWSURFACE);
  

  if(!surface) {
    quit_with_error("SDL_SetVideoMode");
  }

  SDL_ShowCursor(SDL_DISABLE);

  int *pixels = (int *)surface->pixels;
  int length = width * height;
  Uint32 frames = 0;
  Uint32 start = SDL_GetTicks();
  Uint32 ms = 0;
  SDL_Event event;

  while(true) {
    while(1 == SDL_PollEvent(&event)) {
      if(event.type == SDL_QUIT) {
        ms = SDL_GetTicks() - start;
        cout << frames << " frames in " << ms << " ms" << endl;
        cout << "Average FPS: " << (frames / (ms * 0.001)) << endl;
        SDL_Quit();
        exit(EXIT_SUCCESS);
      }
    }

    if(0 != SDL_LockSurface(surface)) {
      SDL_UnlockSurface(surface);
      quit_with_error("SDL_LockSurface");
    }

    for(int i = 0; i < length; ) {
      pixels[i++] = rand128();
      pixels[i++] = rand128();
      pixels[i++] = rand128();
      pixels[i++] = rand128();
    }

    SDL_UnlockSurface(surface);

    if(0 != SDL_Flip(surface)) {
      quit_with_error("SDL_Flip");
    }

    frames += 1;
  }
}

FullHD (1920*1080) рендер у меня выдаёт 100 фпс. Если не налажать и сделать хороший многопоточный сканлайн рендер, будет не сильно медленнее.

#909
7:34, 21 сен. 2013

RPG
> Вот такая организация рендера достаточно быстрая:
Ого, а это работает! Сделал по этому примеру, и затраченное время на отображение картинки упало с 25000 до 18000 непомню каких единиц в тесте.

Только один вопрос тревожит: а доступ к surface->pixels, это официально разрешено? Скажем так, это документированная возможность, или хак, который не тестировался на всех осях?

Спасибо за очень удачную подсказку!

> Да вообще-то он уже у всех стоит, в линуксах как бы само всё обновляется.
Специально проверил обновления, моя убунту 12.04 не требовала ничего. Тем не менее, мне пришлось ручками устанавливать sdl2, чтобы запустить свою же программу. Я не очень в этом разбираюсь, но похоже, пока стандартно стоит sdl1.2, а sdl2, на котором я сделал, ещё не представлен во многих репозиториях и не доступен к обновлению. Так что его надо руками ставить.

[A][R][T]
Это немного не мой случай: сейчас я под sdl2 портировал, а не под ogl.

nes
> Купи Mac Mini, он не сильно дорогой, или найди товарища-макосника, который
> поможет портировать.
Да как-то у всех знакомых писюки, никого с маком нет. К тому же, тут нужно самому щупать, потому что редкий друг будет терпеть многочасовые разборы на своём ноуте, что там и как работает.

#910
8:42, 21 сен. 2013

sb3d
> Ура же?
Ура!

#911
9:16, 21 сен. 2013

Dron09
Спасибо. :)

RPG

for(int i = 0; i < length; ) {
      pixels[i++] = rand128();
      pixels[i++] = rand128();
      pixels[i++] = rand128();
      pixels[i++] = rand128();
    }
Кстати, я бы так не стал писать цикл доступа к точкам. Выйдет за границы памяти, если количество пикселов будет не кратно четырём. У меня ведь произвольного размера окно.

И да, генератор случайных чисел у тебя интересный. Быстрый. Интересно, даёт ли он достаточно равномерное распределение на тестах?

#912
9:19, 21 сен. 2013

sb3d
> Только один вопрос тревожит: а доступ к surface->pixels, это официально
> разрешено?
что не запрещено, то разрешено, я такой доступ
int *pixels = (int *)surface->pixels; видел очень много где

#913
9:46, 21 сен. 2013

sb3d
> а доступ к surface->pixels, это официально разрешено?
Ну так там же лок специально делается.

sb3d
> Кстати, я бы так не стал писать цикл доступа к точкам. Выйдет за границы
> памяти, если количество пикселов будет не кратно четырём.
Почему выйдет? Недойдет. Размер буфера равен surface->pitch * height, где pitch может быть больше чем width. Заполнять лучше двойным циклом.

#914
10:54, 21 сен. 2013

entryway
> Почему выйдет?
Пример: если length==5 то три последние точки выйдут за length.
Иными словами, вопрос лишь в том, гарантируется ли кратность четырём.

war_zes
> что не запрещено, то разрешено
При использовании недокументированных фич вылезут проблемы рано или поздно. При смене операционки, при появлении следующей версии сдл.

Страницы: 157 58 59 60 61 62 Следующая »
ПроектыФорумУтилиты

Тема в архиве.