Поскольку кажется, что вы столкнулись с ограничением устройства, которое ограничивает общий размер растрового пространства, которое вы можете создать (они, очевидно, создаются в видеопамяти, а не в общей памяти программы), одной из альтернатив является замена большого объекта растрового изображения используется здесь с простым старым блоком памяти Windows, обращаясь к нему для чтения и записи с помощью PInvoking функции BitBlt API.
Первоначально создать блок памяти довольно сложно, и вы, вероятно, захотите задать еще один SO вопрос по этому поводу (GCHandle.Alloc может использоваться здесь для создания «закрепленного» объекта, что означает, что .NET не разрешено перемещать это вокруг в памяти, что здесь критично). Я знаю, как это сделать, но я не уверен, что я делаю это правильно, и я предпочел бы получить мнение эксперта.
После того, как вы создали большой блок, вы должны выполнить итерацию ваших элементов, отобразить каждый из них в один маленький растровый файл, который вы продолжаете использовать повторно (используя существующий код .NET), и BitBlt его в соответствующее место в вашем блок памяти.
После создания всего кэша ваш код рендеринга должен работать так же, как и раньше, с той разницей, что вместо копирования из большого растрового изображения на поверхность рендеринга вы BitBlt из вашего блока кеша. Аргументы для BitBlt по существу такие же, как и для DrawImage (пункт назначения, источник, координаты и размеры и т. Д.).
Поскольку вы создаете кеш из обычной памяти таким образом, вместо специализированной видеопамяти, я не думаю, что вы столкнетесь с той же проблемой. Тем не менее, я определенно хотел бы, чтобы сначала работал код создания блока, и проверил, чтобы убедиться, что он может каждый раз создавать достаточно большой блок.
Обновление: на самом деле, идеальным подходом было бы иметь набор меньших блоков памяти, а не один большой (как я думал, была проблема с растровым подходом), но у вас уже достаточно сделать. Я работал с CF-приложениями, которые работают с объектами объемом 5 и 10 МБ, и в любом случае это не большая проблема (хотя это может быть большая проблема, когда этот фрагмент закреплен - я не знаю). Кстати, я всегда был удивлен OOMEs при создании BitMap, потому что я знал, что растровые изображения были намного меньше, чем доступная память, как и вы - теперь я знаю почему. Извините, я сначала подумал, что это легко решить.