Hello dears! And happy new year's holidays!
It's been over a month since the last development diary. I have to say that I wanted to post a diary before, but faced with a intractable problem, which spent a lot of time. But all in order.
According to the development plan, the first contact with AI was implemented:
At the bottom of the screenshot you can see messages about crossing the army control zones with another army and the city. Now we had to develop an interface element that would display the event data:
This screenshot in the upper left corner shows the implementation of UILabel with the ability to transfer text by words. An important element of the interface that is useful in the future. In the lower right corner, above the end of the course is now visible various messages, hover the mouse over them POPs up a hint (also a new interface element), with a short description of the event. By pressing the right button, the event can be closed without making any decision, and the left button can open the message.
In this case, when you click on the event button will be the first diplomatic contact in the game:
It was further implemented the first maneuvers of AI. AI walks on the map and tries to determine the boundaries of its continent. In the video at Dukat https://youtu.be/69G51u_Mq3g?t=693 that is the moment where he runs over the enemy army, which pays no attention to him, because busy with study card
And somewhere in this place and at this time, I was faced with a problem, a performance problem. Our Modeler has a powerful modern computer of red Assembly. But it the game is terribly slow shipping a single core processor. The reason is simple-there are a lot of cores in new processors, but in fact they are less productive in single-threaded applications. And that moment I had a render in one stream. But in fact, the reason was not so much in this. And in the process of finding problems, I decided to count how many polygons we have in the scene:
On the middle map at the maximum distance and a large cluster of palm trees - it's just scary! 15 824 756 triangles! Almost 16 million!!!
After a bit of map generation, I found a place with 16.75 million.
Although here is a similar place with trees gave only 8.5 million triangles:
And in the middle stage consisted of about 4 million:
In General, I was glad that my render copes with such a huge number of triangles, but their number was excessive. It was necessary to optimize the number of polygons in the models.
40% decreased Poligona trees! Differences practically are not visible.
Next, we have altered palms - Poligona on the palms was reduced in 10 times. 600 - 700 against six thousand of polygons per pack.
While there was parallel work on the models I have been trying to simplify the geometry of terrain. Here's what it looked like before optimization:
And after the first steps:
But it was all done by a simple method — all smooth tiles were replaced by two triangles instead of 882.
But there were still flat places that could be optimized, and I began to build polygons from those triangles that had the same height:
Build on them convex-concave contour (Concave Hull). With Convex Hull ω was not a problem, I already used the Graham scan (Graham scan). But the construction of Concave Hull has a problem... Information on this topic on the Internet was quite difficult to find. I had to write the implementation of algorithms from scratch. I will not lie if I say that I read a dozen different dissertations on this topic. But all the proposed algorithms gave an approximate result with some error. After a week of torment and pain, I came up with the idea of my algorithm, maybe I'll describe it someday
As a result of two weeks of torment, I got the desired result and was able to build Concave Hull of almost any complexity, bypassing the set with holes, just dividing them into 2 halves of the hole. Received contour and triangulated it:
Getting the output of such a result:
The fog of war has also been simplified:
And in zones where was present only fog of war it turned out only about 300 polygons:
But in the end I was upset with the result and tell you that these two weeks I spent in the shuffle... The algorithm developed by me gave a significant increase in performance when rendering, as the number of polygons on average was reduced by 60 — 70%. But the generation of the map began to occur 10 times slower.... the algorithm was time-consuming and difficult.
3 days I lost in ATOM RPG removing stress:) Even at work did not go. Thank God we have at this time the thermometer went off scale at the border -44 - -46 degrees Celsius. And I gave my melancholy for an excuse not to start the car.
And before the new year holidays, enough to play, but the truth is not passed the game, I gave a new lightweight version of the algorithm, which was suitable only for my conditions of tiles. Data calculations for optimization were not noticeable against the background of map generation and the number of polygons decreased by an average of 40-50%.
But there are artifacts when rendering water, I had to rewrite all the algorithms associated with water.
Here is the result:
Anatoly meanwhile made unit of nomads:
While he lies resting
While working on optimization, I came up with the idea of how to change our mountains.
Mountains have become more embossed, it is noticeable without texture, as the texture is now not suitable for them:
On the grid, so in General the differences are obvious:
It remains the case for small — need a new texture of the mountains.
The next step was to rewrite the resource loader and map generator. Along the way, remaking the start menu for all these things:
Now loading of resources goes in parallel and then map generation begins.
I did a great job in dividing the render into 3 streams. The whole difficulty was in synchronization. Now we have one thread responsible only for drawing, the second thread for recalculation of the visible space when moving the camera and other interactions with the map space, and the third thread is responsible for animation and communication with the server part.
And Yes, we now have a server part responsible for all events in the game and for the AI. In turn, each AI player is a separate process.
Let's summarize the work done:
- Graphics optimization from the software side.
- Optimization of graphics models.
- Server part.
- Split render into 3 streams.
- Preload resources (textures and models).
- Rewrote the fog of war, water and terrane shaders.
- Reduced RAM consumption by 20-30%
- Implemented a number of UI elements
- Redesigned start screen with the new UI.
- Fixed errors in normal calculations.
- Fixed the hills.
- New mountain.
- Introduced normalmap for terrain.
- New selection of units.
- New animation units.
- Window of diplomacy.
- Actions AI. Study the map.
- Actions AI. Diplomatic contact.
- Actions AI. The conclusion of peace, friendship, or a Declaration of war.
- Actions AI. Action units in a collision.
- In General, a lot of work has been done to optimize and not a lot of game mechanics. I hope this month to the CE goes to plan and I'm finally going to finish the city
Thank you for your attention!