Тема: Everquest 2
Показать сообщение отдельно
Старый 02.02.2007, 21:49   #8
Субутар
Отличник форума
 
Регистрация: 10.10.2005
Сообщений: 605
По умолчанию

Цитата:
Сообщение от Эрбиан Посмотреть сообщение
Это мы только о графических алгоритмах говорим. А еще есть хранение данных. Всякие стандартные объекты и т.п. Ты представь какая помойка современная библиотека под винды. В 70хх ее бедную портировали с иксовых С на Линукс, в 80хх перехерачили под ДОС, потом в 85м какого-то долбо.ба осенило полиморфизмом и туда зафигачили объекты, в 91м чуток перезаточили под Вин 3.1.... ну и т.п. оптимизировать нет смысла, железо крутеет быстрее, чем ты почистишь мусор и не дай бог придумаешь какой-то оригинальный алгоритм.
"Линукс в 70хх" - жжошь неподетски... Почитай вот тут: Linux и тут: Linus Torvalds. Бедный мальчик написал свое ядро в 6+-5 лет .

А структуру данных + методы ее обработки оптимизировать обычно еще сложнее. Что же следует думать когда это возможно - см. комментарий к следующей цитате (1-е предложение).


Цитата:
Я тебе честно скажу мой бенефис в 3д это несколько крутящихся кубиков-рубиков в далеком 93м году. И то до освещения дело не дошло, за...ло. Так вот еще тогда когда все писалось на чистых С++ просторов для оптимизации было до.уя. Например чисто ради прикола я переписал стандартную функцию линии. На ассемблере, взяв из книжки алгоритм какого-то еврея Бризингейма, хейма, не помню точно. Кубики стали крутиться быстрее не в 10 раз, а хз в 50 наверно. И ты говоришь, что современные помоишные тулзы не возможно оптимизировать. ХА*3!!!
Это говорит только о том что исходно у тебя все было написано действительно через задницу. Не думаю что этот пример свидетельствует о том как же пишут движки сегодня.

Судя по всему было там у тебя чего-то вроде:

Код:
dx = x2 - x1
dy = y2 - y1
for x from x1 to x2 {
        y = y1 + (dy) * (x - x1)/(dx)
        plot(x, y)
}
(взято из из A naïve line-drawing algorithm)

что было заменено на

Код:
 function line(x0, x1, y0, y1)
     int deltax := abs(x1 - x0)
     int deltay := abs(y1 - y0)
     real error := 0
     real deltaerr := deltay / deltax    // Assume deltax != 0 (line is not vertical)
     int y := y0
     for x from x0 to x1
         plot(x,y)
         error := error + deltaerr
         if error ≥ 0.5 then
             y := y + 1
             error := error - 1.0
(алгоритм Bresenham-a, ниже можно найти более обще-продвинутые версии, цитировать длинное не хочется)

Естественно все это дополняется проверками направления (несколько условий в самом начале кода).

В первом случае на каждый пиксель требуется 1 floating-point умножение и деление. Во втором случае с некоторыми модификациями можно обойтись только целочисленным сложением. Не на всех машинах образца 1993 года был арифметический сопроцессор. А если он и был, то как правило был на отдельной микросхеме. В результате floating-point операции занимали несравненно больше времени чем целочисленные. А умножение, и особенно деление - гораздо больше чем сложение. Верно это и сегодня уже не в той степени как тогда. Использование тогда деления в критическом цикле иначе как кощунством не назовешь. Сегодня такого выигрыша по скорости уже не получится.

З.Ы.: Бараны были, есть и будут (есть), однако не ими одними полон мир. Не пользуйте помоешные тулзы - когда в мире есть нормальные.
Субутар вне форума   Ответить с цитированием