Create Entities Reduce FPS And Overlapping
I would have two questions to propose. In the project I am working on, I have created a class that deals with all the entities (enemies) that are created. This is the class (if you need anything else, tell me):
class entity():
def __init__(self, main):
self.main = main
self.main.update_list.append(self.update)
self.main.draw_list.append(self.on_draw)
self.entity_spawn =
self.ent_made = False
def create_entity(self, pos_x, pos_y, obj):
data = libraries.pokémon_data(obj)
entity = OrderedDict()
image = self.__resource(obj, "img")
entity["name"] = obj
entity["tile"] = 0
entity["image"] = OrderedDict()
entity["texture"] = OrderedDict()
entity["sprite"] = OrderedDict()
for obj, item in data["img"]["battle"].items():
entity["tile"] = item["tile"]
entity["image"][obj] = OrderedDict()
entity["texture"][obj] = OrderedDict()
entity["sprite"][obj] = OrderedDict()
id = 0
for idy in range(len(item["y"])):
y = item["tile"] * item["y"][idy]
list_frame_img =
list_frame_texture =
for idx in range(len(item["x"])):
x = item["tile"] * item["x"][idx]
frame = image.get_region(x=x, y=y, width=item["tile"], height=item["tile"])
list_frame_img.append(frame)
texture = frame.get_texture()
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
if self.main.dimension != self.main.min:
tile = self.__tiles(48)
else:
tile = 48
texture.width = tile
texture.height = tile
texture.anchor_x = texture.width // 2
texture.anchor_y = texture.height // 2
list_frame_texture.append(texture)
if len(list_frame_img) > 1:
entity["image"][obj][id] = pyglet.image.Animation.from_image_sequence(list_frame_img, 0.5, True)
else:
entity["image"][obj][id] = list_frame_img[0]
if len(list_frame_texture) > 1:
entity["texture"][obj][id] = pyglet.image.Animation.from_image_sequence(list_frame_texture, 0.5, True)
else:
entity["texture"][obj][id] = list_frame_texture[0]
entity["sprite"][obj][id] = pyglet.sprite.Sprite(entity["texture"][obj][id])
entity["sprite"][obj][id].x = pos_x
entity["sprite"][obj][id].y = pos_y
id += 1
return entity
def __tiles(self, obj):
list = [self.main.min, self.main.max]
res =
for i in range(len(list)):
x = list[i][0]
y = list[i][1]
ds = (x - y) / (y / 100)
dk = (obj / 100) * ds
tile = obj + int(dk)
res.append(tile)
if (res[0] % res[1]) == 0:
return res[0]
else:
return max(res[0], res[1])
def __resource(self, obj, type):
res = type + obj
if res in resources[type]:
return resources[type][type+obj][1]
else:
self.__error(res)
return resources[type][type+"0000"][1]
def __error(self, obj):
date = datetime.datetime.now()
self.main.error_engine.append([date.strftime("%d-%m-%Y %H:%M:%S"), obj + " missing"])
def on_draw(self):
for entity in self.entity_spawn:
entity["sprite"]["idle"][0].draw()
def update(self):
if self.ent_made:
if len(self.entity_spawn) < 10:
x = random.randint(50, self.main.dimension[0] - 50)
y = random.randint(50, self.main.dimension[1] - 50)
entity = self.create_entity(x, y, "0001")
self.entity_spawn.append(entity)
First question: When, with the main class, I change the status of self.ent_made
(from False
to True
), the FPS from 60 drops drastically to 4. I assume that the entity creation function eats too much RAM, so how can I improve it to avoid this drastic drop in FPS?
Second question: how can I generate the entities, so that they are not superimposed on each other?
Here is a demonstration of what happens. The FPS are at 40 simply because I was recording, otherwise I am at 60. Moreover, for the second question, it happens above all when the created entities are many. With 10 (limit put only to test at the time) it is difficult to happen:
python pyglet python-3.7
add a comment |
I would have two questions to propose. In the project I am working on, I have created a class that deals with all the entities (enemies) that are created. This is the class (if you need anything else, tell me):
class entity():
def __init__(self, main):
self.main = main
self.main.update_list.append(self.update)
self.main.draw_list.append(self.on_draw)
self.entity_spawn =
self.ent_made = False
def create_entity(self, pos_x, pos_y, obj):
data = libraries.pokémon_data(obj)
entity = OrderedDict()
image = self.__resource(obj, "img")
entity["name"] = obj
entity["tile"] = 0
entity["image"] = OrderedDict()
entity["texture"] = OrderedDict()
entity["sprite"] = OrderedDict()
for obj, item in data["img"]["battle"].items():
entity["tile"] = item["tile"]
entity["image"][obj] = OrderedDict()
entity["texture"][obj] = OrderedDict()
entity["sprite"][obj] = OrderedDict()
id = 0
for idy in range(len(item["y"])):
y = item["tile"] * item["y"][idy]
list_frame_img =
list_frame_texture =
for idx in range(len(item["x"])):
x = item["tile"] * item["x"][idx]
frame = image.get_region(x=x, y=y, width=item["tile"], height=item["tile"])
list_frame_img.append(frame)
texture = frame.get_texture()
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
if self.main.dimension != self.main.min:
tile = self.__tiles(48)
else:
tile = 48
texture.width = tile
texture.height = tile
texture.anchor_x = texture.width // 2
texture.anchor_y = texture.height // 2
list_frame_texture.append(texture)
if len(list_frame_img) > 1:
entity["image"][obj][id] = pyglet.image.Animation.from_image_sequence(list_frame_img, 0.5, True)
else:
entity["image"][obj][id] = list_frame_img[0]
if len(list_frame_texture) > 1:
entity["texture"][obj][id] = pyglet.image.Animation.from_image_sequence(list_frame_texture, 0.5, True)
else:
entity["texture"][obj][id] = list_frame_texture[0]
entity["sprite"][obj][id] = pyglet.sprite.Sprite(entity["texture"][obj][id])
entity["sprite"][obj][id].x = pos_x
entity["sprite"][obj][id].y = pos_y
id += 1
return entity
def __tiles(self, obj):
list = [self.main.min, self.main.max]
res =
for i in range(len(list)):
x = list[i][0]
y = list[i][1]
ds = (x - y) / (y / 100)
dk = (obj / 100) * ds
tile = obj + int(dk)
res.append(tile)
if (res[0] % res[1]) == 0:
return res[0]
else:
return max(res[0], res[1])
def __resource(self, obj, type):
res = type + obj
if res in resources[type]:
return resources[type][type+obj][1]
else:
self.__error(res)
return resources[type][type+"0000"][1]
def __error(self, obj):
date = datetime.datetime.now()
self.main.error_engine.append([date.strftime("%d-%m-%Y %H:%M:%S"), obj + " missing"])
def on_draw(self):
for entity in self.entity_spawn:
entity["sprite"]["idle"][0].draw()
def update(self):
if self.ent_made:
if len(self.entity_spawn) < 10:
x = random.randint(50, self.main.dimension[0] - 50)
y = random.randint(50, self.main.dimension[1] - 50)
entity = self.create_entity(x, y, "0001")
self.entity_spawn.append(entity)
First question: When, with the main class, I change the status of self.ent_made
(from False
to True
), the FPS from 60 drops drastically to 4. I assume that the entity creation function eats too much RAM, so how can I improve it to avoid this drastic drop in FPS?
Second question: how can I generate the entities, so that they are not superimposed on each other?
Here is a demonstration of what happens. The FPS are at 40 simply because I was recording, otherwise I am at 60. Moreover, for the second question, it happens above all when the created entities are many. With 10 (limit put only to test at the time) it is difficult to happen:
python pyglet python-3.7
add a comment |
I would have two questions to propose. In the project I am working on, I have created a class that deals with all the entities (enemies) that are created. This is the class (if you need anything else, tell me):
class entity():
def __init__(self, main):
self.main = main
self.main.update_list.append(self.update)
self.main.draw_list.append(self.on_draw)
self.entity_spawn =
self.ent_made = False
def create_entity(self, pos_x, pos_y, obj):
data = libraries.pokémon_data(obj)
entity = OrderedDict()
image = self.__resource(obj, "img")
entity["name"] = obj
entity["tile"] = 0
entity["image"] = OrderedDict()
entity["texture"] = OrderedDict()
entity["sprite"] = OrderedDict()
for obj, item in data["img"]["battle"].items():
entity["tile"] = item["tile"]
entity["image"][obj] = OrderedDict()
entity["texture"][obj] = OrderedDict()
entity["sprite"][obj] = OrderedDict()
id = 0
for idy in range(len(item["y"])):
y = item["tile"] * item["y"][idy]
list_frame_img =
list_frame_texture =
for idx in range(len(item["x"])):
x = item["tile"] * item["x"][idx]
frame = image.get_region(x=x, y=y, width=item["tile"], height=item["tile"])
list_frame_img.append(frame)
texture = frame.get_texture()
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
if self.main.dimension != self.main.min:
tile = self.__tiles(48)
else:
tile = 48
texture.width = tile
texture.height = tile
texture.anchor_x = texture.width // 2
texture.anchor_y = texture.height // 2
list_frame_texture.append(texture)
if len(list_frame_img) > 1:
entity["image"][obj][id] = pyglet.image.Animation.from_image_sequence(list_frame_img, 0.5, True)
else:
entity["image"][obj][id] = list_frame_img[0]
if len(list_frame_texture) > 1:
entity["texture"][obj][id] = pyglet.image.Animation.from_image_sequence(list_frame_texture, 0.5, True)
else:
entity["texture"][obj][id] = list_frame_texture[0]
entity["sprite"][obj][id] = pyglet.sprite.Sprite(entity["texture"][obj][id])
entity["sprite"][obj][id].x = pos_x
entity["sprite"][obj][id].y = pos_y
id += 1
return entity
def __tiles(self, obj):
list = [self.main.min, self.main.max]
res =
for i in range(len(list)):
x = list[i][0]
y = list[i][1]
ds = (x - y) / (y / 100)
dk = (obj / 100) * ds
tile = obj + int(dk)
res.append(tile)
if (res[0] % res[1]) == 0:
return res[0]
else:
return max(res[0], res[1])
def __resource(self, obj, type):
res = type + obj
if res in resources[type]:
return resources[type][type+obj][1]
else:
self.__error(res)
return resources[type][type+"0000"][1]
def __error(self, obj):
date = datetime.datetime.now()
self.main.error_engine.append([date.strftime("%d-%m-%Y %H:%M:%S"), obj + " missing"])
def on_draw(self):
for entity in self.entity_spawn:
entity["sprite"]["idle"][0].draw()
def update(self):
if self.ent_made:
if len(self.entity_spawn) < 10:
x = random.randint(50, self.main.dimension[0] - 50)
y = random.randint(50, self.main.dimension[1] - 50)
entity = self.create_entity(x, y, "0001")
self.entity_spawn.append(entity)
First question: When, with the main class, I change the status of self.ent_made
(from False
to True
), the FPS from 60 drops drastically to 4. I assume that the entity creation function eats too much RAM, so how can I improve it to avoid this drastic drop in FPS?
Second question: how can I generate the entities, so that they are not superimposed on each other?
Here is a demonstration of what happens. The FPS are at 40 simply because I was recording, otherwise I am at 60. Moreover, for the second question, it happens above all when the created entities are many. With 10 (limit put only to test at the time) it is difficult to happen:
python pyglet python-3.7
I would have two questions to propose. In the project I am working on, I have created a class that deals with all the entities (enemies) that are created. This is the class (if you need anything else, tell me):
class entity():
def __init__(self, main):
self.main = main
self.main.update_list.append(self.update)
self.main.draw_list.append(self.on_draw)
self.entity_spawn =
self.ent_made = False
def create_entity(self, pos_x, pos_y, obj):
data = libraries.pokémon_data(obj)
entity = OrderedDict()
image = self.__resource(obj, "img")
entity["name"] = obj
entity["tile"] = 0
entity["image"] = OrderedDict()
entity["texture"] = OrderedDict()
entity["sprite"] = OrderedDict()
for obj, item in data["img"]["battle"].items():
entity["tile"] = item["tile"]
entity["image"][obj] = OrderedDict()
entity["texture"][obj] = OrderedDict()
entity["sprite"][obj] = OrderedDict()
id = 0
for idy in range(len(item["y"])):
y = item["tile"] * item["y"][idy]
list_frame_img =
list_frame_texture =
for idx in range(len(item["x"])):
x = item["tile"] * item["x"][idx]
frame = image.get_region(x=x, y=y, width=item["tile"], height=item["tile"])
list_frame_img.append(frame)
texture = frame.get_texture()
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
if self.main.dimension != self.main.min:
tile = self.__tiles(48)
else:
tile = 48
texture.width = tile
texture.height = tile
texture.anchor_x = texture.width // 2
texture.anchor_y = texture.height // 2
list_frame_texture.append(texture)
if len(list_frame_img) > 1:
entity["image"][obj][id] = pyglet.image.Animation.from_image_sequence(list_frame_img, 0.5, True)
else:
entity["image"][obj][id] = list_frame_img[0]
if len(list_frame_texture) > 1:
entity["texture"][obj][id] = pyglet.image.Animation.from_image_sequence(list_frame_texture, 0.5, True)
else:
entity["texture"][obj][id] = list_frame_texture[0]
entity["sprite"][obj][id] = pyglet.sprite.Sprite(entity["texture"][obj][id])
entity["sprite"][obj][id].x = pos_x
entity["sprite"][obj][id].y = pos_y
id += 1
return entity
def __tiles(self, obj):
list = [self.main.min, self.main.max]
res =
for i in range(len(list)):
x = list[i][0]
y = list[i][1]
ds = (x - y) / (y / 100)
dk = (obj / 100) * ds
tile = obj + int(dk)
res.append(tile)
if (res[0] % res[1]) == 0:
return res[0]
else:
return max(res[0], res[1])
def __resource(self, obj, type):
res = type + obj
if res in resources[type]:
return resources[type][type+obj][1]
else:
self.__error(res)
return resources[type][type+"0000"][1]
def __error(self, obj):
date = datetime.datetime.now()
self.main.error_engine.append([date.strftime("%d-%m-%Y %H:%M:%S"), obj + " missing"])
def on_draw(self):
for entity in self.entity_spawn:
entity["sprite"]["idle"][0].draw()
def update(self):
if self.ent_made:
if len(self.entity_spawn) < 10:
x = random.randint(50, self.main.dimension[0] - 50)
y = random.randint(50, self.main.dimension[1] - 50)
entity = self.create_entity(x, y, "0001")
self.entity_spawn.append(entity)
First question: When, with the main class, I change the status of self.ent_made
(from False
to True
), the FPS from 60 drops drastically to 4. I assume that the entity creation function eats too much RAM, so how can I improve it to avoid this drastic drop in FPS?
Second question: how can I generate the entities, so that they are not superimposed on each other?
Here is a demonstration of what happens. The FPS are at 40 simply because I was recording, otherwise I am at 60. Moreover, for the second question, it happens above all when the created entities are many. With 10 (limit put only to test at the time) it is difficult to happen:
python pyglet python-3.7
python pyglet python-3.7
asked Nov 11 at 23:21
BlackFenix06
132212
132212
add a comment |
add a comment |
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53254239%2fcreate-entities-reduce-fps-and-overlapping%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53254239%2fcreate-entities-reduce-fps-and-overlapping%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown