Pull to refresh
19
0
Мельничук Иван Владимирович @1nt3g3r

Программист мобильных игр

Send message
Прочитал пост, не удержался, написал быстренько все на java, с примерными замерами времени (разница System.time.currentTimeMillis() до и после вызова метода сортировки).
Результаты следующие.
«Глупая» сортировка зависает на неопределенное время на размере массива около 3000 элементов. На 2000 показывает время примерно 1600 мс.
«Пузырьковая» ведет себя лучше — около 25 мс на размере 2000 элементов. На 30 000 элементов — 2700 мс, почти три секунды.
«Шейкерная» сортировка — на размере 2000 элементов такие же, даже немного хуже (спишем на статистику) результаты. А вот на 30000 элементов разница в два раза — 1200 мс.
«Гребешковая» сортировка меня удивила. Я ожидал, что будет быстрее, но не на столько же! 2000 элементов — 11 мс. 30 000 элементов — 26 мс. 30 000 000 — 5500 мс.
Для сравнения — Arrays.sort(): 3000 элементов — 14-15 мс, 30000 — 30-40 мс, 30 000 000 — 3400 мс.

Вы заметили, что «гребешковая» сортировка получилась быстрее стандартной джавы? Меня это заинтересовало, и я начал увеличивать размер массива, и сравнивать результаты «гребешка» и Arrays.sort(). Получилось, что до 1 500 000 элементов «гребешок» быстрее, а вот дальше уже стандартная сортировка начинает работать быстрее.

Вот такие вот результаты :) Приятно, что реализация «гребешковой» сортировки тривиальна — можно реально использовать на небольших массивах с реальной пользой.
Кому интересно, привожу «тестовую лабораторию»:

Немного дурно пахнущего кода
package com.webprestige.winter.wallpaper;

import java.util.Random;

public class DesktopStarter {
	
	public static void main(String[] args) {
		int size = 30000000;
		Random r = new Random();
		int[] v = new int[size];
		for (int i = 0; i < size; v[i++] = r.nextInt(10000));
		long time = System.currentTimeMillis();
			coolSort(v);
		long endTime = System.currentTimeMillis();
		System.out.println("Time is " + (endTime - time));
		
//		 for(int i = 0; i < size; i++) {
//		 System.out.print(v[i] + " ");
//		 }
	}

	
private static void stupidSort(int[] v) {
		boolean end = false;
		while (!end) {
			end = true;
			for (int i = 0; i < v.length - 1; i++) {
				if (v[i] > v[i + 1]) {
					int t = v[i];
					v[i] = v[i + 1];
					v[i + 1] = t;
					end = false;
					break;
				}
			}
		}
	}

	private static void bulbSort(int[] v) {
		boolean end = false;
		while (!end) {
			end = true;
			for (int i = 0; i < v.length - 1; i++) {
				if (v[i] > v[i + 1]) {
					int t = v[i];
					v[i] = v[i + 1];
					v[i + 1] = t;
					end = false;
				}
			}
		}
	}
	
	private static void shakeSort(int[] v) {
		boolean end = false;
		while (!end) {
			end = true;
			for (int i = 0; i < v.length - 1; i++) {
				if (v[i] > v[i + 1]) {
					int t = v[i];
					v[i] = v[i + 1];
					v[i + 1] = t;
					end = false;
				}
			}
			
			for (int i = v.length - 1; i > 0; i--) {
				if (v[i] < v[i - 1]) {
					int t = v[i];
					v[i] = v[i - 1];
					v[i - 1] = t;
					end = false;
				}
			}
		}
	}
	
	
	
	

public static void coolSort(int[] v) {
		float loadFactor = 1.247f;
		int step = v.length;
		boolean end = false;
		int t;
		while (!end) {
			end = true;
			step /= loadFactor;
			if (step < 1) {
				step = 1;
			}
			for (int i = 0; i < v.length - 1; i++) {
				if ((i + step) < v.length) {
					if (v[i] > v[i + step]) {
						t = v[i];
						v[i] = v[i + step];
						v[i + step] = t;
						end = false;
					}
				} else {
					end = false;
				}

			}

		}
	}
}
Хм, у меня такая проблема возникла. Картинка загружалась из интернета, после чего на ее месте был белый прямоугольник. Формат картинки — jpeg. Может, конечно, бага движка. В любом случае, после изменения размеров на 512*512 проблема пропала. Замечу, что данная трабла была только на телефоне — на компьютере грузило нормально любые размеры.
Эм, про это я даже не задумывался) мне давали дизайн, я писал код. Вообще большинство этих изображений можно найти в интернете в свободном доступе. Думаю, вряд ли правообладатели будут предьявлять какие-либо претензии :)
Да, речь о 90-х. Я уже застал закат кепсов — я чуть поигрался, но немного. Ну они попадались в каких-то чипсах, помню. Такие картонные кругляшки)
Нет, это не оно, это происки конкурентов) Уступаю просьбам, даю ссылку
Тоже думали, но отказались, потому что обделили бы пользователей с планшетом(еще выпадет, разобьется:) ). Также немного проблематично было бы играть в маршрутках, авто и т. д. — там, где все трясется
Пост не в «Я пиарюсь», поэтому линк дать не могу прямой. Ну в гугл плей уже есть, найти несложно :)
Кстати, была одно время идея сделать вместо полоски выбивания в игровом экране управление акселерометром — типо кружок, и в него нужно попасть точкой. Точка убегает, а вы акселерометром ловите ее. В итоге отказались, подумали, что будет слишком сложно для игрока\длинно :)
хм. программирую со школы, считаю себя максимум на среднем уровне. Суммарный опыт программинга — примерно лет семь-восемь
Блин, вот скажите мне, эти все дайджесты — они действительно кому-то нужны? Они несут какую-то полезную информацию, которую никак иначе кроме вот этих вот дайджестов нельзя было получить? Я понимаю на каком-то новостном сайте, но не Хабре же!
Как по мне, прекрасная статья, отличный обзор, как нужно и как не нужно строить ИИ в играх. Во всяком случае, намного лучше всяких «дайджестовновостей», которые периодически появляются на хабре.
Прекрасный пост! Особенно фраза «как может называться наукой область знаний, где отсутствует хотя бы приблизительная формализация»
Автор пишет — 10 минут в день. Я, когда начинал писать, програмил по 5-6 часов в день, и меня это не утомляло. ИМХО, 10 минут — это не хватит даже нормально войти в контекст задачи, пару часов в день — что-то более похоже на правду. За мотивацию — если для Вас главное деньги — нормальным программистом вам не стать. Деньги могут быть дополнительным стимулом, но если Вы не фанатеете от процесса — можно и не начинать. От таких 10-минутников обычно получаются программисты, которые напишут «Hello world», но если им сказать вывести эту фразу 10 раз — они вместо цикла и выведут ее 10 раз. Еще раз повторю главную мысль — если Вы чувствуете удовольствие от процесса — Вы не будете замечать течения времени. Если же нет — найдите себе другую сферу деятельности.

P. S. А за велосипеды — да, поддерживаю. Помню, как радовался, когда на паскале заставил двигаться пиксель по экрану клавишами курсора. Это был еще тот велосипед:)
У Turbo Pascal F2 сохранение)
«Чистый код», Роберт Мартин. Глава вторая «Содержательные имена». Автор хорошо расписал тему правильного именования, и для чего это нужно.
*пусть даже они нужны только вам
Для меня сложно работать блоками. Ведь вдохновение не приходит в определенное время. На своем опыте я убедился, что нужно делать реальные проекты — пусть далее они нужны только вам. Здесь появится и вдохновение, и желание работать. И, конечно, отличный стимулирующий фактор — соревнование. Например, в последних классах школы я и товарищи записали на асм-контестах. Да, задачи были синтетические, но были соревнования, было интересно.
Да, вместо трех проектов — главный, настольный ПК и андроид — всего один — для запуска на ПК. Это сделано с целью упрощения, чтобы не связывать три проекта вместе. Переделка для запуска на андроид по первому туториалу займет пять минут.
Проект прикрепил. Пакет scene2d.ua — следующий в очереди.
Да, кстати, могу добавить проект на Eclipse с простеньким примером работы с scene2d. Напишите в личку, если нужно.

Information

Rating
Does not participate
Location
Киев, Киевская обл., Украина
Date of birth
Registered
Activity