Словарь бокс - PullRequest
       52

Словарь бокс

0 голосов
/ 30 сентября 2018

Я использую Microsoft XNA Game Studio 4.0 в качестве шаблона для моего проекта.

В этом проекте у меня есть базовый класс для всех сущностей, projectiles, и так далее, называемыйSprite.

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

Это предпочтительнее, поскольку Sprite s имеет поле Texture2D среди других полей, которые могут потреблять память, если создано достаточно Sprite s.

Вот часть моегоTexture2D синглтон в качестве ссылки:

public static class TextureManager{
    private static Dictionary<string, Texture2D> allTextures = new Dictionary<string, Texture2D>();
    public static Texture2D GetTexture(string name){
        if(allTextures.ContainsKey(name))
            return allTextures[name];

        ... //Code to handle and create a new key is omitted for simplicity's sake

        return newTexture; //The new texture created from the "name" key
    }
}

Этот синглтон предпочтительнее простого создания нового Texture2D из конвейера контента каждый раз, когда это необходимо.Код был получен из этого ответа .

При планировании синглтона Sprite мне пришло в голову, что для работы синглтона на одном Dictionary должен произойти бокс.по существу, все мои классы сущностей и снарядов унаследуют класс Sprite.

ВОПРОС:

Является ли бокс / распаковка на одном Dictionary более эффективным, чем наличие несколькихDictionary с для каждого типа Sprite?

1 Ответ

0 голосов
/ 30 сентября 2018

Это не бокс ...

Бокс - это процесс преобразования типа значения в объект типа или в любой тип интерфейса, реализованный этим типом значения.Когда CLR упаковывает тип значения, он помещает значение в System.Object и сохраняет его в управляемой куче.Распаковка извлекает тип значения из объекта.Бокс неявный;распаковка явная.Концепция упаковки и распаковки лежит в основе унифицированного представления C # системы типов, в которой значение любого типа может рассматриваться как объект.

Упаковка происходит, когда значение типа значения преобразуется вссылочный тип.Приведение ссылочного типа к его базовому типу - это , а не упаковка / распаковка.

Приведение не очень дорого, хотя оно будет сопряжено с затратами, как и оператор switch илиtypeOf или любой другой метод.

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


Дополнительные ресурсы

...