Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 [7] 8 9   вперед  Ctrl      все
 Re: Изучение C++ после java  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 700
mayton
Сорцы Doom https://github.com/id-Software/DOOM
Doom 1 написан в процедурном стиле (то есть вся программа -- это куча глобальных переменных и глобальных функций), но ООП там немного используется.
d_think.h
// Historically, "think_t" is yet another
//  function pointer to a routine to handle
//  an actor.
typedef actionf_t  think_t;


// Doubly linked list of actors.
typedef struct thinker_s
{
    struct thinker_s*	prev;
    struct thinker_s*	next;
    think_t		function;
    
} thinker_t;
Поле function -- указатель на функцию, то есть это по сути виртуальный метод. Вызов этого виртуального метода:
p_tick.c
//
// THINKERS
// All thinkers should be allocated by Z_Malloc
// so they can be operated on uniformly.
// The actual structures will vary in size,
// but the first element must be thinker_t.
//



// Both the head and tail of the thinker list.
thinker_t	thinkercap;
...
void P_RunThinkers (void)
{
    thinker_t*	currentthinker;

    currentthinker = thinkercap.next;
    while (currentthinker != &thinkercap)
    {
	if ( currentthinker->function.acv == (actionf_v)(-1) )
	{
	    // time to remove it
	    currentthinker->next->prev = currentthinker->prev;
	    currentthinker->prev->next = currentthinker->next;
	    Z_Free (currentthinker);
	}
	else
	{
	    if (currentthinker->function.acp1)
		currentthinker->function.acp1 (currentthinker);
	}
	currentthinker = currentthinker->next;
    }
}
В комментарии про «THINKERS», очевидно речь про наследование. Создание двери:
p_spec.h
typedef struct
{
    thinker_t	thinker;
    vldoor_e	type;
    ...
} vldoor_t;
p_doors.c
void T_VerticalDoor (vldoor_t* door)
{
    ...
}
...
void
EV_VerticalDoor
( line_t*	line,
  mobj_t*	thing )
{
    ...
    vldoor_t*	door;
    ...
    // new door thinker
    door = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0);
    P_AddThinker (&door->thinker);
    ...
    door->thinker.function.acp1 = (actionf_p1) T_VerticalDoor;
    ...
}
Создание монстра:
p_mobj.h
// Map Object definition.
typedef struct mobj_s
{
    // List: thinker links.
    thinker_t		thinker;

    // Info for drawing: position.
    fixed_t		x;
    fixed_t		y;
    fixed_t		z;
    ...
} mobj_t;
p_mobj.c
void P_MobjThinker (mobj_t* mobj)
{
    ...
}
...
mobj_t*
P_SpawnMobj
( fixed_t	x,
  fixed_t	y,
  fixed_t	z,
  mobjtype_t	type )
{
    mobj_t*	mobj;
    ...
    mobj = Z_Malloc (sizeof(*mobj), PU_LEVEL, NULL);
    ...
    mobj->thinker.function.acp1 = (actionf_p1)P_MobjThinker;
	
    P_AddThinker (&mobj->thinker);

    return mobj;
}

Исходники Doom 3: https://github.com/id-Software/DOOM-3
Там уже C++, классы, ООП в полный рост. Как и положено, свой строковый класс (Str.h, Str.cpp). Потому что C++ -- это язык для создания строковых классов :).

Так что ООП при программировании игровой логики (то есть поведение игровых объектов) вполне используется. В 90-ые годы -- немного (Doom 1), но уже в первой половине 0-ых -- в полный рост (Doom 3). Потому что сложность разработки игр сильно выросла (видно хотя бы по количеству строк кода), а для сложных программ нужно ООП.

В shader-ах естественно никакого ООП нет, потому что shader-ы -- это финальная стадия отрисовки, которая не имеет никакого отношения к поведению игровых объектов.
23 янв 21, 20:55    [22268244]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Пётр Седов,
>а для сложных программ нужно ООП
== согласен. А то все то хоронят, то кому он нужен.
23 янв 21, 21:23    [22268250]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
tip78
Member

Откуда: Москва
Сообщений: 1266
petrav
tip78
пропущено...

не теми категориями мыслишь... за 1 секунду 60 раз надо картинку просчитать
за 1 секунду она будет фактически статичная
а технически она и 2-3-5-10 секунд будет иметь повторяющиеся элементы

Ты бы пример алгоритмов привёл. А так я даже не понял про какую категорию ты говоришь.

PS: Когда я серьёзно играл в WoW пинг 30 миллисекунд считался критическим. Как-то к нам в гильдию чувак написал резюме. Его спросили: под вами загорелась лужа, за какое время вы из неё выберитесь учитывая ваш класс? Он ответил за 0.3 секунды. Ему сказали: вы что с ума сошли, нужно отвечать мгновенно, в приёме отказано. А у вас целую секунду картинка статическая.

статическая - значит что за 1 секунду там принципиально ничего сильно не изменится
она всю секунду будет наполнена одинаковыми объектами
ну а в реальности в игре ты бежишь несколько секунд по однотипной местности
23 янв 21, 21:30    [22268254]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Пётр Седов

Поле function -- указатель на функцию, то есть это по сути виртуальный метод. Вызов этого виртуального метода:

(По поводу Doom1/Doom2).

В данной-же игре имеет место сет алгоритмов
и структур данных жонглирующих указателями на функции (фактически лямбды). Так можно доказать
принадлежность толи к ФП толи просто показать что где-то можно жонглировать вставкой функции
в структуру.

Должна быть дисциплина ООП! Должна быть возможность инкапсулировать (скрывать поля и методы).
Должна быть возможность проверить корректность down-casting. И процесс наследования должен
иметь явный декларативный характер. Тоесть если вы унаследовали Cacodemon от Enemy в коде
то все другие разработчики должны это понять и принять к сведению без сопроводительной
документации.

Готов спорить на виски что если мы поднимем голосование здесь. Или в cyberforum или в rsdn
по поводу анализа исходников doom то большая часть участников не найдет в нем признаков ООП
в том виде как принято везде.

Искать с "натяжкой" мы не будем. ООП - слишком долго формировалось чтобы мы занимались
профанацией.
23 янв 21, 22:50    [22268270]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
Большой Синий Кит
Member

Откуда: Синий Океан
Сообщений: 1083
MasterZiv


Ты серьёзно считаешь, что Java оправдала себя ?
Язык, который был создан для программирования встроенных систем для утюгов, сковородок и холодильников,
а применяется для создания в основном распределённых Enterprise-систем?
Где КАЖДЫЙ проект, сидящий на этом языке, мечтает слезть с него и переползти на какой-то другой типа Groovy/Kotlin/Scala/Clojure ?
Где 10 библиотек для создания GUI и ни одна не работает толком ?
Где создали 3 технологии по программированию в WEB, и выкинули их в помойку ?

Java -- это протсо Epic fail 20го века!


Слишком жирно. :)

Сообщение было отредактировано: 23 янв 21, 22:47
23 янв 21, 22:54    [22268272]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
По поводу Doom3 https://github.com/id-Software/DOOM-3 и прочих уже современных игр.

Языковая гистограмма показывает 7 языков. В других играх может быть нечто похожее. Как я уже писал выше,
современная игра как и любое другое изделие сделанное с продумыванием архитектуры - имеет
некие строительные кубики или слои на которые архитекторы делят код.

Это как строительство дачного дома. Вы-же не будете лить его из наливного бетона в чистом виде?
Или выдалбливать его из скалы? Вы - возьмете кирпичи. Аэроблоки. Гипсокартон. Экологические утеплители
и стеклопакеты.

Вобщем игра - это сплав технологий а не С++ монолит. И с их (технологий) развитием, доля С++
будет уменьшаться. Сейчас у нас - шейдеры на сях. И сценарии на Lua/Python. А когда игровые
станции будут включать в себя блоки нейро-сетевых ускорителей (для вражеского AI) - то
в списке языков может еще что-то новое появится.
23 янв 21, 23:30    [22268283]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton

Искать с "натяжкой" мы не будем. ООП - слишком долго формировалось чтобы мы занимались
профанацией.

Да ну нафиг. ООП это не хрустальный свод аксиом и неопровержимых теорем. Это подход, стиль проектирования и стиль мышления. ООП можно и в Си реализовать.

Пётр Седов вполне документировано доказал, что в топовых играх используется ООП. А адепты ДоД так и не смогли доказать нах он там вообще нужен. Так что вопрос закрыт.
24 янв 21, 00:11    [22268289]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 700
mayton
(По поводу Doom1/Doom2).

В данной-же игре имеет место сет алгоритмов
и структур данных жонглирующих указателями на функции (фактически лямбды). Так можно доказать
принадлежность толи к ФП толи просто показать что где-то можно жонглировать вставкой функции
в структуру.
Лямбда-функция -- это короткая анонимная функция, которая использует переменные из окружающего контекста. Кусочки кода Doom 1, которые я показал, -- это никакие не лямбда-функции, а именно реализация ООП на чистом C. В современной жизни такое тоже бывает. Например, GUI-библиотека GTK+ написана на чистом C, но в ООПшном стиле.

mayton
Готов спорить на виски что если мы поднимем голосование здесь. Или в cyberforum или в rsdn
по поводу анализа исходников doom то большая часть участников не найдет в нем признаков ООП
в том виде как принято везде.
Не все вопросы качественно решаются голосованием :). Тем более, что основная масса кода Doom 1 действительно написана в процедурном стиле (то есть куча глобальных переменных и глобальных функций).

mayton
Сейчас у нас - шейдеры на сях.
Язык shader-ов зависит от конкретного графического API. В OpenGL -- GLSL, в Direct3D -- HLSL.
24 янв 21, 01:28    [22268299]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
booby
Member

Откуда:
Сообщений: 2451
mayton
...
Искать с "натяжкой" мы не будем. ООП - слишком долго формировалось чтобы мы занимались
профанацией.

Оно так долго развивалось, что сейчас уже совсем не просто сказать - где ооп, а где его и быть не может.

Это для Кея всё очень просто было по поначалу - если у тебя нет динамического связывания и
динамического поиска метода по именам - то это не ооп.
А вне рамок интерпретатора никакого ООП и быть не может.

Как-то усложнилось и расширилось словоупотребление с тех пор...
Потом стали считать, что ооп, это когда "объект" обязательно выделяется в куче и передаётся только по ссылке.
А если нечто, что кто-то называет "объектом", может быть явно передан через стек - то оно точно и не ооп и не "объект".

Если собрать всё вместе, то получится, что ооп, это тогда, когда программист что-то не может, главным образом, потому что не должен.
Например, если программист нигде явно не управляет памятью для выделяемых в куче объектов - то оно - "ооп", а если хоть где-то управляет - то нет. Программист не должен управлять памятью...

Программист не должен знать истинного устройства используемого им объекта.
А лучше всего - когда даже автор класса не только не пишет код, обслуживающий взаимодействие экземпляров
своего объекта с прочими, но и не подозревает даже приблизительно - что там вообще происходит.

ООП сегодня - это когда все происходит само, и писать при этом ничего не надо. Как так?
А вот так - @ - поставил "аннотацию" и получил поведение, о содержании которого - не твое дело задумываться.

В этом смысле DoD - он в чистом виде про ооп.
Примерно в том же смысле, в каком "аннотации".
Т.е. речь-то идет вот о чём - делайте так, чтобы предоставляемые наружу интерфейсы были удобны
в смысле манипулирования чем-то как "объектом", а внутри чтобы, невзирая на предоставленный апи, оно всё равно "быстро работало".

Как это делать?
Ну также, почти один в один, как имитировать ссылочные структуры вроде связных списков в языках, принципиально и напрочь лишенный понятия ссылки, вроде первородного FORTRAN-а.
Дан вам в руки массив - он хорош, всегда кеш-френдли и всяко обливиус.
И связны списки, если вот совсем именно они как видимая снаружи логическая конструкция смерть как понадобились,
вполне на массивах реализуются.

И не пользователя таких "списков" дело - интересоваться, как оно устроено внутри.
Его дело - использовать полученный "ооп-френдли" интерфейс.
24 янв 21, 01:33    [22268300]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
tip78
Member

Откуда: Москва
Сообщений: 1266
Большой Синий Кит
MasterZiv


Ты серьёзно считаешь, что Java оправдала себя ?
Язык, который был создан для программирования встроенных систем для утюгов, сковородок и холодильников,
а применяется для создания в основном распределённых Enterprise-систем?
Где КАЖДЫЙ проект, сидящий на этом языке, мечтает слезть с него и переползти на какой-то другой типа Groovy/Kotlin/Scala/Clojure ?
Где 10 библиотек для создания GUI и ни одна не работает толком ?
Где создали 3 технологии по программированию в WEB, и выкинули их в помойку ?

Java -- это протсо Epic fail 20го века!


Слишком жирно. :)

а как по мне - очень точно опустил яву
я бы ещё добавил, что она жрёт, как не в себя
и синтаксис придумывал человек, который всех ненавидит
24 янв 21, 01:56    [22268301]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
tip78
Member

Откуда: Москва
Сообщений: 1266
petrav
Да ну нафиг. ООП это не хрустальный свод аксиом и неопровержимых теорем. Это подход, стиль проектирования и стиль мышления. ООП можно и в Си реализовать.

ну изобрази уже деструктор на C
move/copy -конструкторы, RAII, в конце-концов...
про концепты уж молчу.
petrav
Пётр Седов вполне документировано доказал, что в топовых играх используется ООП. А адепты ДоД так и не смогли доказать нах он там вообще нужен. Так что вопрос закрыт.

всё там доказали и на ютубе даже показали
на ютубе есть наглядный пример, как CSS-анимация работает с DOD и ООП
просто слышишь только себя.
клик
24 янв 21, 02:02    [22268303]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
По русски - "сдуру можно и уй сломать"
24 янв 21, 05:24    [22268318]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
AmKad
Member

Откуда:
Сообщений: 5260
Dimitry Sibiryakov

Просто кое-кто настолько ушёл в эмпиреи, что не в курсе, что синтаксис foo.bar() это
просто сахар для bar(&foo)...
А если так: foo->bar() ?
Или даже так
struct Base {
    virtual void bar() = 0;
};

void F(Base& foo) {
    foo.bar();
}


Сообщение было отредактировано: 24 янв 21, 09:37
24 янв 21, 09:37    [22268328]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
AmKad
Member

Откуда:
Сообщений: 5260
PetroNotC Sharp

2. фаза - команды отрисовки всего что отправили через
glDrawArrays: procedure(mode: GLenum; first: GLint; count: GLsizei); stdcall;

Какой тут нафиг ООП?
Сударь, простите, что не могу пройти мимо. Ваш тезис звучит так: "Если мое приложение использует opengl для рендеринга, то в приложении нет места коду, кроме как вызовов opengl-интерфейса." Продолжу вашу мысль по пунктам:
- для взаимодействия с файловой системой я также использую интерфейс видеокарты;
- все сетевые взаимодействия (http(s), ftp, tcp/ip и прочее) проходят только через видеокарту;
- вся (бизнес-)логика приложения и модель предметной области целиком и полностью реализованы на видеокарте.
- для портирования приложения на другую платформу (с opengl, например на Vulkan или metal) я перепишу 100% кода своего приложения, то бишь напишу приложение с нуля.
24 янв 21, 10:12    [22268332]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
AmKad,
>Сударь, простите, что не могу пройти мимо.
== а как же ещё))) Если есть аргументы то почему не говорить.
Вы извратили мой тезис.
Конечно я могу над Не ООП сделать свой ООП api.
Но тут некоторые подвергают сомнению что он вообще нужен. Этот ООП.
Я против - он нужен.
2. Приход шейдеров усложнил перевод прогером на ООП.
Я раньше просто писал MyClass.draw().
Это доказывает что при создании игр на базе (DirectX/OpenGL/WebGL)/... ООП стало меньше.
Причина понятна?
24 янв 21, 11:38    [22268354]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
AmKad,
Отличайте базовый API операционки с OpenGL и какой то вулкан как законченное ПО
24 янв 21, 11:42    [22268356]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
AmKad
Member

Откуда:
Сообщений: 5260
PetroNotC Sharp

Я раньше просто писал MyClass.draw()
Вы не поверите, я и сейчас делаю точно так же. Только под draw у меня лежат полиморфные вызовы. Почитайте про паттеры "Мост" и "Посетитель" у банды четырех.
24 янв 21, 11:51    [22268357]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
AmKad,
Поверю. Только до шейдеров было проще. Эта описывалось в прошлой моей теме.
24 янв 21, 11:53    [22268358]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

AmKad
А если так: foo->bar() ?

Боже ж ты мой... разве не очевидно "bar(foo)" и "foo.vmt[bar](&foo)"?..

Posted via ActualForum NNTP Server 1.5

24 янв 21, 13:49    [22268374]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
Dimitry Sibiryakov,

Next Level

https://ru.wikipedia.org/wiki/D_(язык_программирования)#Универсальный_синтаксис_вызова_функций_(UFCS)
24 янв 21, 15:41    [22268403]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
Большой Синий Кит
Member

Откуда: Синий Океан
Сообщений: 1083
tip78
Большой Синий Кит
пропущено...


Слишком жирно. :)

а как по мне - очень точно опустил яву
я бы ещё добавил, что она жрёт, как не в себя
и синтаксис придумывал человек, который всех ненавидит


Перестаньте так шутить :) У явы нет реальных конкурентов в своем сегменте на сейчас, и, думаю, долго не будет.

Сообщение было отредактировано: 24 янв 21, 18:36
24 янв 21, 18:42    [22268451]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Большой Синий Кит
У явы нет реальных конкурентов в своем сегменте на сейчас

В сегменте плагинов JBoss-а их и не будет по очевидным причинам. А какой ещё у неё есть
сегмент?

Posted via ActualForum NNTP Server 1.5

24 янв 21, 19:01    [22268455]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
Большой Синий Кит
Member

Откуда: Синий Океан
Сообщений: 1083
Dimitry Sibiryakov

Большой Синий Кит
У явы нет реальных конкурентов в своем сегменте на сейчас

В сегменте плагинов JBoss-а их и не будет по очевидным причинам. А какой ещё у неё есть
сегмент?


Мне кажется, Вы живете в каком-то другом измерении. Это Ваше право.
Jboss :)
Не хочу терять время, извините.
24 янв 21, 20:36    [22268476]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
Большой Синий Кит
tip78
пропущено...

а как по мне - очень точно опустил яву
я бы ещё добавил, что она жрёт, как не в себя
и синтаксис придумывал человек, который всех ненавидит


Перестаньте так шутить :) У явы нет реальных конкурентов в своем сегменте на сейчас, и, думаю, долго не будет.
Сегмент только сужается.

Go давно вышел сюда же.

С учетом граблей с платностью Явы для основных своих пользователей, перспективы у нее так себе.

Сообщение было отредактировано: 24 янв 21, 22:29
24 янв 21, 22:34    [22268510]     Ответить | Цитировать Сообщить модератору
 Re: Изучение C++ после java  [new]
tip78
Member

Откуда: Москва
Сообщений: 1266
html5 ей там на пятки не наступает ещё?
я видел полноценную аркадную игрушку на html5, а это значит, на нём можно практически что угодно слабать
25 янв 21, 00:02    [22268571]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 [7] 8 9   вперед  Ctrl      все
Все форумы / C++ Ответить