TarasB
> Это же rep stosd?
Да. И, подозреваю, умнее еще ничего не придумали.
Alexander K
> Не знаю, не проверял
Я ведь показывал исходник с винды. Или ты чужие посты не читаешь? :)
ksacvet777
> Напиши superpuper_memzero(.....) , чтобы работало в тыщщу раз быстрее.
слив защитан
Это все очень увлекательно, но что данная тема делает в "Графике" ???
TarasB
> Это в микрософте так пишут v & 0xffff?
Это мелкомягкие так изврашаются =) вот пруф http://research.microsoft.com/en-us/um/redmond/projects/invisible… /memset.c.htm
> Это 2 строчки писали 2 разных человека?
ХЗ кто, когда, где и при каких условиях это написал
ЗЫ Не я же это писал :)
entryway
> Я ведь показывал исходник с винды. Или ты чужие посты не читаешь? :)
/me пять минут ползает по теме и ищет, а потом вспоминает что состояние == "уже на веселе" и бросает это дело одновременно вспомнив ссылку
entryway
> Да. И, подозреваю, умнее еще ничего не придумали.
rep movsd
Для почти полностью перекрывающихся кусков у меня отработало чуть быстрее, чем stosd
OpenDX
> ЗЫ Не я же это писал :)
Да, это радует.
ещё копеечку:
memset(...) - будет надёжно работать везде, а вот самопальные лисапеды , которые "быстрее" могут работать на одной машине, но может глюкнуть на другой.
99 % что проблема топстара не связана с обнулением памяти.
имхо проблема fps не в memset-е
ksacvet777
> 99 % что проблема топстара не связана с обнулением памяти
Так он хочет заполнить задний буффер одним значением ( то-есть выполнить Clear() ), вероятно .L пишет программный раситеризатор =)
OpenDX
Если речь о сотнях fps, то это наверное не софтв. растеризатор.
Или ты в шутку ?)
ksacvet777
Ну я предположил изходя из кода 0го поста, взгяните внимательно:
int clearColor = 0xffff0000; // ВОТ ЭТА ПЕРЕМЕННАЯ КАК-БЫ НАМЕКАЕТ... int bbPixCnt = backBuffer->width * backBuffer->height; if(IsEvenNum( bbPixCnt)) { __int64* bbPtr = static_cast<__int64*>( backBuffer->getBuffer( )->getDataPtr( )); // К.О. МНЕ ПОДСКАЗЫВАЕТ ЧТО ЭТО 64хБИТНЫЙ УКАЗАТЕЛЬ НА БЭК БУФФЕР __int64 clearVal = static_cast<__int64>( clearColor) & 0xffffffff; clearVal = clearVal | ( clearVal << 32); int numLoops = bbPixCnt / 2; for( int i = 0; i < numLoops; i++) bbPtr[i] = clearVal; } else { int* bbPtr = reinterpret_cast<int*>( backBuffer->getBuffer( )->getDataPtr( )); for( int i = 0; i < bbPixCnt; i++) bbPtr[i] = 0; }
ЗЫ
Понятно, что сотни фпс это многовато для софт-рендера, но так может быть,
ведь ничего кроме заполнения небольшого куска памяти не происходит.
ksacvet777
> будет надёжно работать везде, а вот самопальные лисапеды , которые "быстрее"
> могут работать на одной машине, но может глюкнуть на другой.
осторожно нужно работать с mmx\sse :)
автор удалился на размышления
Уверен, всё упирается в пропускную способность памяти.
.L
> сначала попробовал memset
> и получил 700 FPS, что маловато
> Однако, помнится, даже на C# это дело у меня работало на 1200 ФПС !
Вот в это не верю, честное слово. То есть автору верю, что он получил эти результаты, но тут что-то странное. Скомпиль одинаковые демки и протестируй ещё раз. Не должно быть такого разрыва.
скорость заполнения равна 1 Гбайт/с, че там с пропускными способностями?
хотя буфер должен почти целиком на кеш леч...
попробуй добавить команды прекеширования в цикл...
Тема в архиве.