powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Изучение C++ после java
25 сообщений из 225, страница 7 из 9
Изучение C++ после java
    #40038333
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Doom 1 написан в процедурном стиле (то есть вся программа -- это куча глобальных переменных и глобальных функций), но ООП там немного используется.
d_think.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
// 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
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
//
// 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
Код: plaintext
1.
2.
3.
4.
5.
6.
typedef struct
{
    thinker_t	thinker;
    vldoor_e	type;
    ...
} vldoor_t;

p_doors.c
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// 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
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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-ы -- это финальная стадия отрисовки, которая не имеет никакого отношения к поведению игровых объектов.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038336
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов,
>а для сложных программ нужно ООП
== согласен. А то все то хоронят, то кому он нужен.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038338
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
tip78
пропущено...

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

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

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

статическая - значит что за 1 секунду там принципиально ничего сильно не изменится
она всю секунду будет наполнена одинаковыми объектами
ну а в реальности в игре ты бежишь несколько секунд по однотипной местности
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038343
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов

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

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

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

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

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

Искать с "натяжкой" мы не будем. ООП - слишком долго формировалось чтобы мы занимались
профанацией.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038344
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv


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

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


Слишком жирно. :)
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038349
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу Doom3 https://github.com/id-Software/DOOM-3 и прочих уже современных игр.

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

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

Вобщем игра - это сплав технологий а не С++ монолит. И с их (технологий) развитием, доля С++
будет уменьшаться. Сейчас у нас - шейдеры на сях. И сценарии на Lua/Python. А когда игровые
станции будут включать в себя блоки нейро-сетевых ускорителей (для вражеского AI) - то
в списке языков может еще что-то новое появится.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038355
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

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

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

Пётр Седов вполне документировано доказал, что в топовых играх используется ООП. А адепты ДоД так и не смогли доказать нах он там вообще нужен. Так что вопрос закрыт.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038358
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
(По поводу Doom1/Doom2).

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

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

mayton
Сейчас у нас - шейдеры на сях.
Язык shader-ов зависит от конкретного графического API. В OpenGL -- GLSL, в Direct3D -- HLSL.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038359
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
...
Искать с "натяжкой" мы не будем. ООП - слишком долго формировалось чтобы мы занимались
профанацией.

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

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

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

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

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

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

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

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

И не пользователя таких "списков" дело - интересоваться, как оно устроено внутри.
Его дело - использовать полученный "ооп-френдли" интерфейс.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038360
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большой Синий Кит
MasterZiv


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

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


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

а как по мне - очень точно опустил яву
я бы ещё добавил, что она жрёт, как не в себя
и синтаксис придумывал человек, который всех ненавидит
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038362
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Да ну нафиг. ООП это не хрустальный свод аксиом и неопровержимых теорем. Это подход, стиль проектирования и стиль мышления. ООП можно и в Си реализовать.

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

всё там доказали и на ютубе даже показали
на ютубе есть наглядный пример, как CSS-анимация работает с DOD и ООП
просто слышишь только себя.
https://youtu.be/_N5-JjogNXU?t=319
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038368
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038372
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

void F(Base& foo) {
    foo.bar();
}
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038376
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp

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


Какой тут нафиг ООП?
Сударь, простите, что не могу пройти мимо. Ваш тезис звучит так: "Если мое приложение использует opengl для рендеринга, то в приложении нет места коду, кроме как вызовов opengl-интерфейса." Продолжу вашу мысль по пунктам:
- для взаимодействия с файловой системой я также использую интерфейс видеокарты;
- все сетевые взаимодействия (http(s), ftp, tcp/ip и прочее) проходят только через видеокарту;
- вся (бизнес-)логика приложения и модель предметной области целиком и полностью реализованы на видеокарте.
- для портирования приложения на другую платформу (с opengl, например на Vulkan или metal) я перепишу 100% кода своего приложения, то бишь напишу приложение с нуля.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038387
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
>Сударь, простите, что не могу пройти мимо.
== а как же ещё))) Если есть аргументы то почему не говорить.
Вы извратили мой тезис.
Конечно я могу над Не ООП сделать свой ООП api.
Но тут некоторые подвергают сомнению что он вообще нужен. Этот ООП.
Я против - он нужен.
2. Приход шейдеров усложнил перевод прогером на ООП.
Я раньше просто писал MyClass.draw().
Это доказывает что при создании игр на базе (DirectX/OpenGL/WebGL)/... ООП стало меньше.
Причина понятна?
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038389
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Отличайте базовый API операционки с OpenGL и какой то вулкан как законченное ПО
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038390
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp

Я раньше просто писал MyClass.draw()
Вы не поверите, я и сейчас делаю точно так же. Только под draw у меня лежат полиморфные вызовы. Почитайте про паттеры "Мост" и "Посетитель" у банды четырех.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038391
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Поверю. Только до шейдеров было проще. Эта описывалось в прошлой моей теме.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038400
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadА если так: foo->bar() ?

Боже ж ты мой... разве не очевидно "bar(foo)" и "foo.vmt[bar](&foo)"?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038420
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038441
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78
Большой Синий Кит
пропущено...


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

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


Перестаньте так шутить :) У явы нет реальных конкурентов в своем сегменте на сейчас, и, думаю, долго не будет.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038443
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большой Синий КитУ явы нет реальных конкурентов в своем сегменте на сейчас

В сегменте плагинов JBoss-а их и не будет по очевидным причинам. А какой ещё у неё есть
сегмент?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038452
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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


Мне кажется, Вы живете в каком-то другом измерении. Это Ваше право.
Jboss :)
Не хочу терять время, извините.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038479
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большой Синий Кит
tip78
пропущено...

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


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

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

С учетом граблей с платностью Явы для основных своих пользователей, перспективы у нее так себе.
...
Рейтинг: 0 / 0
Изучение C++ после java
    #40038504
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
html5 ей там на пятки не наступает ещё?
я видел полноценную аркадную игрушку на html5, а это значит, на нём можно практически что угодно слабать
...
Рейтинг: 0 / 0
25 сообщений из 225, страница 7 из 9
Форумы / C++ [игнор отключен] [закрыт для гостей] / Изучение C++ после java
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]