2013-12-02 2 views
1

В следующем семестре я сделаю игру на C (C89 специально). Исходя из языков более высокого уровня, таких как C#, одна из первых вещей, которые я бы сделал, это сделать список объектов (игровые объекты) и каждый кадр, пропустить через каждый объект и запустить их методы «Обновить и рисовать». Преобразуя эту идеологию в C, моя идея заключалась в разработке структуры «Список», которая содержит указатель на массив указателей void и создание функций для добавления, получения и удаления записей из списка. Если объект добавлен в список, но массив слишком мал, перераспределите массив в массив с двумя большими массивами. При использовании этой системы, когда я, скажем, создаю врага, я могу добавить указатель на его Entity struct в List, а затем каждый кадр, прокрутить список, наложить каждый элемент указателя void как указатель на Entity, а затем передать его entity_update(Entity *) и entity_draw(Entity *) соответствующим образом.Является ли динамический массив указателей void проблемой производительности для разработки игр в C?

На мой взгляд, до тех пор, пока я на 100% уверен, что в массив List будут помещаться указатели на структуры Entity (отличные как указатели void), не было бы проблем ... но когда я упомянул об этом однокласснику, он сказал, что он считает, что есть недостатки производительности, связанные с литью указателей void на указатели на другие вещи. Оглядываясь в Интернете, я могу сказать, что настоящая проблема заключается в том, что компиляторы не могут правильно оптимизировать ваш код так, как если бы компилятор заранее знал, на какой указатель указал. Стало бы это проблемой в моей ситуации, когда я хочу прокрутить потенциально крупноячеистый массив указателей void, шестьдесят раз в секунду? Было бы нецелесообразно просто хранить указатели на Entities в массиве указателей Entity с большим предопределенным максимальным размером и затем привязывать проверку, чтобы убедиться, что противник не порожден, если в комнате нет места массив ... но я просто хотел убедиться, прежде чем я начал работать над базовым базовым движком для игры.

+0

Есть ли причина, по которой это было опубликовано с начальным счетом -2? –

+2

У вас попало 2 человека. Это не первый балл. Тем не менее, вы задали вопрос слишком конкретным для игр. Это также помогло бы разработать какой-то псевдокод, а не описывать поток вашей программы. – InfernalRapture

+0

Это было в течение 35 секунд после его публикации! И нет необходимости в псевдокоде в этом вопросе, насколько я понимаю, не так ли? Вопрос в основном заключается в том, что «бросает целую кучу указателей void на указатели на другие вещи шестьдесят раз в секунду, что будет проблемой для стабильной работы в высокопроизводительных настройках, таких как видеоигра», но тогда я добавлен второй абзац, чтобы выявить возможные проблемы, с которыми я столкнулся, и одно возможное решение. Я понятия не имел, что одно из этих вещей было достойным немедленного, слепого понижения. –

ответ

5

В C литье указателя фактически ничего не делает, кроме как сказать компилятору рассматривать его как другой тип. Накладных расходов нет.

Так что нет.